JetsonOrinNanoで超省電力ローカルAI環境構築と、ローカルAI音声文字起こしシステム考察

# はじめに
Supership株式会社の @masahito-suzuki です。
今年の内容としましては、Jetson orin nano を使って手元でAIを動かす「ローカルAI」について説明したいと思います。

# 番宣
[Supership](https://supership.jp/)ではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
[Supership株式会社 採用サイト](https://supership.jp/recruit/)
是非ともよろしくお願いいたします。

# まず最初に jetson とはなんぞや説明
> https://www.nvidia.com/ja-jp/autonomous-machines/embedded-systems/

jetson とは、NVIDIAが販売している、組み込み向けローカルAI環境です。
jetson の特徴としては、こんな感じです。
  - ラズパイ的なボードコンピュータです
  - Cudaコアが搭載されているので、CudaでGPGPU開発やAIを動かす事ができます
  - GPU搭載なのに、非常に消費電力が低いです(15wとか)
  - ボードコンピュータとして `結構価格が高い設定(orin nano=90k)`になっています

またカメラを接続して「AIで画像を解析」など、IoTシステムを構築することができますし、頑張ればロボットみたいなのも作れるかも知れないです。

今回は `jetson orin nano開発キッド` を利用するのですが特徴としては以下の通りです。
  - 大体９万円ぐらいします（正直高い）
  - CudaコアがRTX30系で1024コアであります（旧版がTK1で192なので大幅UP）
  - メモリが8GB(今の時代だと、ちょっと少ないかな)
  - M2SSDでBOOTができる（前のJetsonNanoだとMicroSDだったので高速起動）
  - OSはubuntu22.04（デスクトップPCとしても普通に使える）

今回記載したい事としては jetson orin nano を使って faster whisper で「動画や音声データ」から「文字起こし」ができるまでの「紆余曲折（かなり大変でした）」内容について以降より説明したいと思います。

# jetson orin nanoのセットアップ
これを実際にやってみて思った事として、ある程度デスクトップPCの組み立てとかやってないと、ちょっと手こずるかもしれないレベルでした。

またM2SSDをBootディスクで利用する場合、ちょっと敷居高いかなあって感じですが、今回は「敷居が高いなあ」のM2SSDを起動ディスクにセットアップする内容を「簡単」に説明します。

まず、ざっくりですがセットアップの単純な手順は以下の通りです。
(以下内容は2024/11時点で最新バージョンJetPack6.1を主体に説明しています)
  1. Ubuntu22.04の母艦を用意して、そこにJetPack6.1をダウンロード＋インストール
  2. M2SSDをjetson orin nanoに接続する(Boot用)
  3. ジャンパーピンを10と11の位置に指す(リカバリーモード化)
  4. Jetson orin nanoと項１の母艦をUSB TypeCで接続して起動する(ACアダプタ接続で起動、抜くことで電源OFF)
  5. 項1の母艦で先程インストールしたJetPack6.1を起動する
  6. 接続 orin nano が認識したら、セットアップを行う（大体セットアップに１時間ぐらいで、途中で色々とログイン設定など必要）

ここで「最初の関門」として「ジャンパーピンを指す所ってどこかわからない」から始まりますが、このjetson orin nanoの構成として
  1. CPUやGPU、メモリなどの `モジュール` と呼ばれるもの
  2. 電源やUSBやNICなど、PCで言うマザーボード的なもの＝ `キャリアボード`

このジャンパーピンを指す先は「キャリアボード側」で「モジュールの裏側」の「キャリアボード」に１２本のトゲトゲしたやつが、ジャンパーピンを指す場所です。
> https://lab.seeed.co.jp/entry/2022/08/29/120000

このサイトの内容が「ジャンパーピンを指すトゲトゲの位置」について、わかりやすい内容かもなので、参考にしてください。

次にピンの機能についての仕様です（公式サイトにのってる画像）
![f1699046.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975990/c9ec36e8-2b5e-7ca3-20fe-7b52a9846c0a.png)

並びとして上の画像のようにジャンパーピンを指す口が並んでるので、母艦からのJetPack経由でOSインストールする場合は、このジャンパーピンの「１０と１１」にジャンパーピンを「はめ込む」事で「FORCE_RECOVERY」が有効になり「起動してもBIOS画面にならない」状態となります。

この状態で「Ubuntuの母艦から、USBTypeCケーブルを母艦からJetson orin nano に接続して母艦でJetPackを起動させるのですが、ここで重大な落とし穴があります。

ってのも「Debian系の同じUbuntuのバージョンだと駄目」であり、あくまでUbuntuが主体となったOS(Kubuntuとか)、またJetPackのバージョンで定められた母艦のバージョン「たとえばJetPack6.1の場合はUbuntu22.04じゃないとだめ」で、普通は上位互換があるだろうって事で、最新の「24.04」で試してみると「ダメダメ」でした。

この辺間違うと「母艦に対してUbuntuダウンロード、RufusなどでUSBメモリに書き込み、母艦に指してOSセットアップ」と「地味に無駄な時間」と「腹落ちしない感」ばかりが「その時間、納得行かない感が頭の中で巡り巡ってしまう」ので、注意が必要です。

あと、M2SSDにOSのインストールが終わったら、さきほど刺したジャンパーピンを抜くのを忘れずに。
（これやらないと、OSが起動しないので）

## OS環境の設定で注意

まず多くの場合日本人がUbuntuOSを利用する場合に「まずやること＝日本語化」ですが、しかし多分「UbuntuOSの日本語対応」はやらない方が良さそうな感じかと思うので、これを説明したいとおもいます。

### OS言語を日本語化すると sudo apt update で404Errorになる

UbuntuOSを日本語化した後に `sudo apt update` 実行jで起きたエラー内容です。
~~~
E: http://jp.archive.ubuntu.com/ubuntu/dists/jammy/main/binary-arm64/Packages
  の取得に失敗しました  404  Not Found [IP: 185.125.190.82 80]
E: http://jp.archive.ubuntu.com/ubuntu/dists/jammy-updates/main/binary-arm64/Packages 
  の取得に失敗しました  404  Not Found [IP: 185.125.190.82 80]
E: http://jp.archive.ubuntu.com/ubuntu/dists/jammy-backports/main/binary-arm64/Packages
  の取得に失敗しました  404  Not Found [IP: 185.125.190.82 80]
~~~

この辺が原因なのか、色々と `apt install` 系でインストールできない事が発生しました。

一方で英語のままだとNoエラーで、このケースは発生しませんでした（orin nanoを再インストールしなおして、英語環境のまま実行した結果）。
~~~
Hit:1 https://download.docker.com/linux/ubuntu jammy InRelease
Hit:2 https://repo.download.nvidia.com/jetson/common r36.4 InRelease
Hit:3 https://repo.download.nvidia.com/jetson/t234 r36.4 InRelease
Hit:4 https://repo.download.nvidia.com/jetson/ffmpeg r36.4 InRelease
Hit:5 http://ports.ubuntu.com/ubuntu-ports jammy InRelease
Hit:6 http://ports.ubuntu.com/ubuntu-ports jammy-updates InRelease
Hit:7 http://ports.ubuntu.com/ubuntu-ports jammy-backports InRelease
Hit:8 http://ports.ubuntu.com/ubuntu-ports jammy-security InRelease
~~~

この場合、問題なく `apt install` 系でエラーは起きませんでした。

結論：日本語化せずに、英語モードで使うべきかと（別に他PCからSSHでターミナル経由からしか使わないので、これでOKかと）

# jetson orin nano で faster whisperを使ってみよう

まずはじめに、pythonとpipのインストール＋updateを行います。
~~~
sudo apt update
sudo apt install python3-pip -y
pip install -U pip
~~~

これを行った後に、一旦以下のプログラムを動かして `cuda` が利用できるかの確認をしてみます。
(faster whisperは GPU=NVIDIAしか対応してないので、以下のコマンドで利用可能かを確認します)

~~~
python3 -c "import torch;print(torch.cuda.is_available())"
~~~
これを実行するとまず `torch` がインストールされていないと、エラーが出てきます。
また、この `torch=pytorch` と呼ばれるもので、これは「機械学習用のライブラリ」で、AI界隈では「常識」のような存在だそうです。
> https://udemy.benesse.co.jp/development/python-work/pytorch.html

## 普通に pytorchをインストールする

通常だと、以下の流れでインストールを行う事で問題なく動作します。
~~~
pip3 install torch
~~~

そして、pytorchをインストール後にもう一度以下のコマンドを実行すると
~~~
python3 -c "import torch;print(torch.cuda.is_available())"
~~~
> True

の結果が帰ってくるのですが、jetson orin nano の場合は
> False

が返却されてしまいます。

これを「ググってみる」と、jetsonの場合の pytorch は、NVIDIAが提供する jetson用の pytorchのpythonライブラリをインストールする必要があるもようでした。

## NVIDIAが提供する jetson用の pytorchをインストールする

まず、jetson 用のネイティブライブラリ群のインストールする必要があります。

### jetson 用 pytorchで必要なネイティブライブラリ群をインストール

とりあえず NVIDIAが提供する jetson用の pytorchのライブラリをjetsonにインストールして `impoer torch;` を実行すると、以下のエラーが出てきます（jetson用のpytorchインストール方法は後に説明しますが、まずこの環境を先に入れたほうが良いので、以下を最初に説明します）
> ImportError: libcudnn.so.9: cannot open shared object file: No such file or directory

まずこれの問題解決として、対象のネイティブライブラリをインストールする必要があります。
おさらいとして、今回対象とするJetPackのバージョンは `6.1` なので jetson orin nano の環境は以下のようになります。
  - OSバージョン:
    Ubuntu 22.04=ubuntu2204
  - CPU
    arm64

> https://developer.download.nvidia.com/compute/cuda/repos/{OSバージョン}/{CPU}/

次にJetsonの環境に合わせたURLに対して、アクセスします。
  - https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/arm64/

アクセスするとファイル一覧が出てくるので、以下のファイルをダウンロードします。
(jetpack6.1の場合は以下のバージョン `1.1-1_all` が対象となります)
  - cuda-keyring_1.1-1_all.deb

これを作業ディレクトリなどに保存してインストールを行います。
~~~
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt update
sudo apt upgrade -y
~~~

これを行う事で、先程ImportErrorになった `libcudnn.so.9` 等がインストールされます。

### jetson用の pytorch をインストールする

一旦ネイティブライブラリ関連を先にインストールしたので、次はpytorch用のpytorchライブラリをダウンロードしてインストールで終わるわけですが、ここでも jetsonのバージョン(今回対象は 6.1)を意識する必要があります。

ライブラリをダウンロードする場合は、以下のURLにアクセスします。
> https://developer.download.nvidia.com/compute/redist/jp/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975990/7cd65d8a-f2ce-5058-4b0f-9e031db9236c.png)

すると上のように表示されるので、ここで `v61` を選択します。

![f1699046.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975990/192f717d-43fe-ed1b-4e1b-865b2516abbf.png)

今回必要なライブラリは `pytorch` なので、それを選びます。

すると
  - torch-2.5.0a0+872d972e41.nv24.08.17622132-cp310-cp310-linux_aarch64.whl

のリンク(2024/12/10現在)があるので、これを作業フォルダ等にダウンロードします。

その後以下コマンドを実行して、ライブラリをインストールします。
~~~
pip install ./torch-2.5.0a0+872d972e41.nv24.08.17622132-cp310-cp310-linux_aarch64.whl
~~~

もしインストール中に以下のWARNING(警告)が出る場合
~~~
Installing collected packages: typing-extensions, networkx, jinja2, fsspec,
filelock, torch
  WARNING: The scripts convert-caffe2-to-onnx, convert-onnx-to-caffe2 and torchrun 
  are installed in '/home/maachang/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, 
  use --no-warn-script-location.
~~~
は、以下の内容を追加する事で対応できます
- $HOME/.bashrc
~~~
export PATH=$HOME/.local/bin:$PATH
~~~

再度ですがインストール終了後、GPUが利用できるかを確認するために、以下のコマンドを実行します。
~~~
python3 -c "import torch;print(torch.cuda.is_available())"
~~~

しかし案の定以下のように別のエラーが発生します。
~~~
ImportError: libcusparseLt.so.0: cannot open shared object file: No such file or directory
~~~

これですが、以下のURLの内容にあるように
> https://developer.nvidia.com/cusparselt-downloads?target_os=Linux&target_arch=aarch64-jetson&Compilation=Native&Distribution=Ubuntu&target_version=22.04&target_type=deb_local

~~~
wget https://developer.download.nvidia.com/compute/cusparselt/0.6.3/local_installers/cusparselt-local-tegra-repo-ubuntu2204-0.6.3_1.0-1_arm64.deb
sudo dpkg -i cusparselt-local-tegra-repo-ubuntu2204-0.6.3_1.0-1_arm64.deb
sudo cp /var/cusparselt-local-tegra-repo-ubuntu2204-0.6.3/cusparselt-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install libcusparselt0 libcusparselt-dev
~~~
上の内容を実行する事で `libcusparseLt.so.0` のネイティブライブラリをインストールすることができます。

インストール結果の確認として、再々ですが、おなじみのコードを実行します。
~~~
python3 -c "import torch;print(torch.cuda.is_available())"
~~~

すると、以下のようなWORNING（警告）が出てきます。
~~~
/home/maachang/.local/lib/python3.10/site-
packages/torch/_subclasses/functional_tensor.py:267: UserWarning: Failed to initialize 
NumPy: module compiled against API version 0x10 but this version of numpy is 0xe .
Check the section C-API incompatibility at the Troubleshooting ImportError section at 
https://numpy.org/devdocs/user/troubleshooting-importerror.html#c-api-incompatibility 
for indications on how to solve this problem . (Triggered internally at 
/opt/pytorch/pytorch/torch/csrc/utils/tensor_numpy.cpp:84.)
  cpu = _conversion_method_template(device=torch.device("cpu"))
~~~

上の警告の重要な部分としては
  - (英語): NumPy: module compiled against API version 0x10 but this version of numpy is 0xe
  - (日本語翻訳)NumPy: モジュールは API バージョン 0x10 に対してコンパイルされていますが、このバージョンの NumPy は 0xe です

この環境にインストールされてる `numpy` のバージョンが古い(0x10以下の0xe)と言われてるので、とりあえず最新のバージョンをインストールしてみます。

~~~
pip install numpy --upgrade
pip3 install numpy --upgrade
~~~

これでおなじみのコードを動かしてみる。
~~~
python3 -c "import torch;print(torch.cuda.is_available())"
~~~
しかし、別のエラーが出てくる。
~~~
A module that was compiled using NumPy 1.x cannot be run in
NumPy 2.1.3 as it may crash. To support both 1.x and 2.x
versions of NumPy, modules must be compiled with NumPy 2.0.
Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.

If you are a user of the module, the easiest solution will be to
downgrade to 'numpy<2' or try to upgrade the affected module.
We expect that some modules will need time to support NumPy 2.
~~~

内容を掻い摘んで言うと、numpyのversion1系とversion2系は互換性が無いらしく、なので今回の対応としてはversion1系の最上位を入れると、この問題は解決する模様.

> https://numpy.org/ja/news/#numpy-1250-%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9

ここで見ると現状の１系の最新バージョンは
- 1.25.0

なので、これをインストールします。
~~~
pip uninstall numpy
pip install numpy==1.25.0
~~~

再度（何回実行するねん！！）いつものコードを実行してみます。
~~~
python3 -c "import torch;print(torch.cuda.is_available())"
~~~
> True

とりあえず、pytorchを問題なくインストールする事ができました（ぱちぱちぱち）！！

# faster whisperをインストールする
<font color="#888888">※ ここでは、最初に「[faster-whisperインストールに対する総括](#faster-whisperインストールに対する総括)」が下の方にあるので、そちらを最初に見たほうが良いかもしれないです。</font>

faster whisperのインストールは、比較的簡単で、以下のコマンドでインストールすることができます。
~~~
pip install faster-whisper
~~~

また、faster whisperを実行するためのプログラムは以下の内容となります。
- main.py
~~~python
from faster_whisper import WhisperModel

# 対象のファイル.
SRC_FILE = "test.mp4"

# モデルのサイズを設定します.
#MODEL_SIZE = "large-v2"
MODEL_SIZE = "large-v3"
#MODEL_SIZE="small"
#MODEL_SIZE="large-v3-turbo"
#MODEL_SIZE="turbo"

# 実行デバイス: cpu=PCのCPU演算, cuda=NvidiaのGPU演算, auto=どちらか.
DEVICE = "cuda"
#DEVICE="cpu"

# 計算に使用するタイプを指定します.
#COMPUTE_TYPE = "auto"
#COMPUTE_TYPE = "float32"
COMPUTE_TYPE = "float16"
#COMPUTE_TYPE="int8_float16"
#COMPUTE_TYPE ="int8"

# ビームサーチのパラメータ。一度にbeam_sizeの探索を行い一番良い単語の繋ぎを選択する.
BEAM_SIZE = 5

# create Model.
model = WhisperModel(MODEL_SIZE, device=DEVICE, compute_type=COMPUTE_TYPE)

segments, info = model.transcribe(SRC_FILE, beam_size=BEAM_SIZE)

print("Detected language '%s' with probability %f" % (info.language, info.language_probability))

for segment in segments:
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
~~~

またfaster whisperの利用想定として、MTGの動画から文字起こしする的な事を想定したものを想定すると、大体１時間ぐらいの動画内容を想定すると以下の内容あたりが都合良いかと思いました。

丁度国会の予算委員会のやり取りあたりを参考(５８分３５秒の内容: 画質は360pで151MB)に、faster whisperで文字起こしを実現してみます。

と言うわけで早速実行します。
~~~
python3 main.py
~~~

しかし以下のエラーが発生しました。
~~~
ValueError: This CTranslate2 package was not compiled with CUDA support
~~~
調べてみると arm64の場合、CTranslate2はダメダメなんだそうで、なのでこれをソースファイルからコンパイルする必要があるとの事でしたので、以下参考に対応しました。

## CTranslate2のコンパイル＋インストール
参考URL: https://microai.jp/blog/d453a35b-80dd-4596-8a6c-8536e6333aa5

まず、一旦faster whisperは削除。
~~~
pip uninstall ctranslate2
pip uninstall faster-whisper
~~~

(workとかの作業ディレクトリは任意で)
~~~
mkdir ~/work
cd ~/work

git clone --recursive https://github.com/OpenNMT/CTranslate2.git
cd CTranslate2
cmake -Bbuild_folder -DWITH_MKL=OFF -DOPENMP_RUNTIME=NONE -DWITH_CUDA=ON -DWITH_CUDNN=ON
cmake —build build_folder
cd build_folder
sudo make install
~~~

コンパイルまでに大体３０分ぐらいかかるのですが、これで一旦コンパイル完了。
上が終わったら、pythonのライブラリインストールが必要なので、以下のように行います。
~~~
cd ~/work/CTranslate2/python/
pip install -r install_requirements.txt
python setup.py bdist_wheel
pip install dist/*.whl
~~~

その後faster whisperをインストール
~~~
pip install faster-whisper
~~~

先程のmain.pyを再度実行してみる。
~~~
python3 main.py
~~~

しかし今度は別のエラーが発生します。
~~~
ImportError: libctranslate2.so.4: cannot open shared object file: 
No such file or directory
~~~

これは先程コンパイルしたCTranslate2ネイティブライブラリのパスが通ってないので、このパスを以下のように通します。

> vi ~/.bashrc
~~~
# CTranslate2ライブラリパス.
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
~~~

これで、ようやくmain.pyを動かす事ができました（ぱちぱちぱち）。

## faster-whisperインストールに対する総括.
まずやってみて思った事として、以下の順番でインストールすると、スムーズかと思いました。
1. CTranslate2のコンパイル＋インストール
2. LD_LIBRARY_PATHの設定
3. faster-whisperの環境をpipでインストール

<font color="888888">（faster-whisperをインストールする に戻る場合は [こちら](#faster-whisperをインストールする) をクリック）</font>

## 実際にfaster whisperを動かしてみる

まず以下のコマンド
~~~cmd
python3 main.py
~~~
でfaster whisperを動かすと、実行時に必要なデータを自動でダウンロードしてくれます（上のlarge-v2でプログラムの場合は3GB）。

ダウンロードデータは対象のモデルに対して１度ダウンロードするだけなので、毎回ダウンロードは発生しません。

ダウンロードが終わったら、文字起こし対象のファイル(今回は test.mp4)の言語判断が実行され、その後に文字起こしが始まります。

しかしmain.pyの実行を行うと、以下のようにエラーが発生します。
~~~
CUDA failed with error out of memory
~~~
これ要するに「メモリが足りない」との事で、jetson orin nanoは物理メモリが8GBなのですが、どうも現状の実行条件だと、メモリが足りなくて実行できないようです。
  - MODEL_SIZE = "large-v3"
  - COMPUTE_TYPE = "float16"

一旦文字起こしを実行したいので、以下に質を落とした形で実行しますが、途中でメモリ不足となりました。
  - MODEL_SIZE = "large-v3"
  - COMPUTE_TYPE = "int8"

なので、MODEL_SIZEを前のバージョン `large-v2` にして実行します。
(COMPUTE_TYPE=float16だとメモリ不足となるので、int8で実行）

これにより、無事プログラムは実行されました（ぱちぱちぱち）
ただ、これだと「どれくらいの時間で処理が終わった」のかわからないので、ちょっと小細工をします。

- runTask
~~~sh
#!/bin/bash
# start.
START_TIME=`date +%s`
echo "#START: $START_TIME"

# run task.
python3 main.py

# end.
END_TIME=`date +%s`
echo "#END: $END_TIME"

# execute time.
echo "#TIME SECOUND: $((END_TIME-START_TIME)) sec"
~~~

これで実行してみると
- 1999秒(33分19秒)

で変換が完了しました。

ようやくですが「実行できる環境」の確認はこれで取れました（お疲れ様でした！！）。

## jetson orin nanoで faster whisper 速度や精度を検証してみる

次にjetson orin nanoでfaster whisperを実行してるが、これがGPU実行なので速いのかを、検証したいと思いますが、その前にまず「faster whisperのパラメータ関連」について、説明したいと思います。

### MODEL_TYPEの説明

MODEL_TYPEは以下が利用できるようです。
- tiny.en
- tiny
- base.en
- base
- small.en
- small
- medium.en
- medium
- large-v1
- large-v2
- large-v3
- large
- distil-large-v2
- distil-medium.en
- distil-small.en
- distil-large-v3(日本語NG)
- large-v3-turbo
- turbo(large-v3-turboと同じらしい)

しかし実際に「日本語対応」で「実際に利用頻度が高そうなもの」としては
- small
- large-v3-turbo
- large-v2
- large-v3

（上から準に速度的に速い）この辺かと思われるので、これに対して説明したいと思います。

#### small
これ、確かに速いですが、文字起こしの精度は「悪い」です。
なので、現実的に使う場合は `large-v3-turbo` を選択したほうが良さそうです。

#### large-v3-turbo
これですが「速度」的には「smallよりちょっと遅い」が一方で「smallと比べて遥かに精度の品質が良い」ので「精度＝人の名前の間違い」とかのレベルを気にしないレベル＋速度がほしい場合は、これが一番良さそうです。

#### large-v2
事実上jetson orin nanoで動かせる一番精度の良いものだけど、速度は「結構遅い」です。

#### large-v3
jetson orin nanoだと、メモリ不足で落ちるので、普通にCPUで実行すると「鬼のように時間がかかった」けど「精度＝一番良い感じ」なので「速度は無視して何より精度」を求める場合はこちらが一番良い。

### COMPUTE_TYPEの説明

- auto
- float32
- float16
- int16
- int8_float16
- int8

> https://opennmt.net/CTranslate2/quantization.html

計算で利用するタイプだそうで、上のURLを参考にしてみてください。

ただ実際 cudaと cpuで試してみた感じだと
- cuda
  float系が利用可能
- cpu
  int系しか利用できない

みたいでした。

### 速度と精度の検証結果

やった事としては
- cuda でそれぞれの MODEL_SIZEや COMPUTE_TYPE の速度検証を行ってみました
- cpu MODEL_SIZE=large-v3-turbo 固定で、COMPUTE_TYPE=int8 での速度評価を行いました

補足として元のmp4ファイルの再生時間は `3515秒` でした。

#### jetson orin nano=cudaの実行検証結果：
|model_size|compute_type|品質|時間(秒)|時間(分)|元動画時間率|
|-----------|-------------|--------------|------------|------------|---------|
|small|int8_float16|まあまあ|580秒|9分40秒|16.5%|
|large-v2|int8_float16|良い|1999秒|33分19秒|56.9%|
|large-v3-turbo|int8_float16|普通|754秒|12分34秒|21.4%|
|large-v3-turbo|float16|普通|694秒|11分34秒|19.7%|

品質ですが、それぞれの結果の冒頭(100秒あたり)を元に判断しています。

##### small(まあまあ)
> [0.00s -> 16.00s] 以上で森本晋二君の質疑は終了いたしました。次にオヌマタクミ君の質疑を行います。
[16.00s -> 19.00s] オヌマタクミ君
[19.00s -> 23.00s] はい、立憲民主党のオヌマタクミです。石場総理はじめましてになります。
[23.00s -> 43.00s] はい、我が茨城におきましても石場総理は9月27日の総裁選挙自民投票のうち、有効投票収25,782票のうち、約37%、9,523票という評差で茨城の自民党の投票の中でもトップに選ばれました。
[43.00s -> 51.00s] 時点の高市候補に1.7倍もの差をつけた。そういったところにある茨城県の生まれ育ちでございました。
[51.00s -> 56.00s] そういう意味で、今日は石場総理と議論をさせていただくことを楽しみにしてまいりました。
[56.00s -> 67.00s] 全棲田総理から何を引き継ぎ、そして何を直さなきゃならんのか、そういったことについて石場総理と論戦をさせていただきたい、このように思いますので、今日はよろしくお願いします。
[67.00s -> 76.00s] 冒頭お伺いしたいのは政治改革であります。政治改革については、昨日の衆議院の予算委員会についても議論が行われた証知しておりますが、
[76.00s -> 82.00s] 特に政策活動費、これについてさまざまな議論が行われました。
[82.00s -> 90.00s] その政策活動については、今年の通常国会におきましても、5年で50億円が当時の幹事長に渡されるとか、
[90.00s -> 99.00s] あるいは議論の中で10年後に両収書を公開するんだとか、こういったことで通常国会でも論戦が行われたところでございます。
[99.00s -> 106.00s] まず、石場総理にお伺いしたいのは、この2024年の通常国会におきまして、政策活動費の議論が行われました。

ざっくり評価：
- 普通に読むことはできるレベルだとは思う
- 実行時間が速いのと、メモリ使用量などが少なくて済む点は利点かと
- 一方で漢字の変換ミスが目立つ `オヌマタクミ` `全棲田総理` `石場総理` `両収書` など
- 文字起こしの出力に対して、尺が結構まちまちな所など

##### large-v2(良い)
> [0.00s -> 13.00s] 以上で森本慎二君の質疑は終了 いたしました
[13.00s -> 19.00s] 次に尾沼拓実君の質疑を行います 尾沼拓実君
[19.00s -> 24.60s] はい立憲民主党の尾沼拓実です 石場総理はじめましてになります
[24.60s -> 30.10s] 我が茨城におきましても石場総理 は九月の二十七日の総裁選挙自民
[30.10s -> 36.80s] 投票のうち有効投票数二万五千 七百八十二票のうち約三十七%九
[36.80s -> 42.44s] 千五百二十三票という票査で茨城 の自民党の党員投票の中でもトップ
[42.44s -> 47.72s] に選ばれました時点の高市候補 に一七倍もの差をつけたそういった
[47.72s -> 51.70s] ところにある茨城県の生まれ育ち でございましたねそういう意味
[51.70s -> 55.70s] できょうは石場総理と議論させて いただくことを楽しみにしてまいり
[55.70s -> 59.98s] ました 前岸田総理から何を引き継ぎそして
[59.98s -> 63.76s] 何を直さなきゃならんのかそう いったことについて石場総理と
[63.76s -> 66.74s] 論戦をさせていただきたいこの ように思いますのできょうはよろしく
[66.74s -> 69.82s] お願いします 冒頭お伺いしたいのは政治改革
[69.82s -> 74.30s] であります政治改革については 昨日の衆議院の予算委員会について
[74.30s -> 80.14s] も議論が行われたと承知しております が特に政策活動費これについて
[80.22s -> 85.50s] 様々な議論が行われましたその政策 活動については今年の通常国会
[85.50s -> 90.54s] におきましても五年で五十億円 が当時の幹事長に渡されるとか
[90.54s -> 95.66s] あるいは議論の中で十年後に領収書 を公開するんだとかこういった
[95.66s -> 100.14s] ことで通常国会でも論戦が行われた ところでございますまず石場総理
[100.14s -> 104.70s] にお伺いしたいのはこの二〇二 四年の通常国会におきまして政策
[104.70s -> 109.14s] 活動費の議論が行われましたこの 評価についてお伺いしたいと思います

ざっくり評価：
- 文字起こしの品質的にはよさそう
- 変換単位の尺の長さも大体同じなので、見やすいっちゃあ見やすい
- 欠点としては、変換時間が長いのと、メモリも食いすぎる事と文脈の区切りが曖昧な場合がある

##### large-v3-turbo(普通)
> [0.00s -> 12.20s] 以上で森本慎二君の質疑は終了いたしました
[12.20s -> 15.88s] 次に尾沼拓美君の質疑を行います
[15.88s -> 18.58s] 尾沼拓美君
[18.58s -> 23.06s] 立憲民主党の尾沼拓美です 石破総理はじめましてになります
[23.06s -> 27.32s] 我が茨城におきましても石破総理は
[27.32s -> 34.14s] 9月27日の総裁選挙 自民投票のうち有効投票数25782票のうち
[34.14s -> 39.54s] 約37% 9523票という票差で
[39.54s -> 43.10s] 茨城の自民党の党員投票の中でもトップに選ばれました
[43.10s -> 46.68s] 時点の高市候補に1.7倍もの差をつけた
[46.68s -> 50.14s] そういったところにある茨城県の生まれ育ちでございました
[50.14s -> 54.64s] そういう意味で今日は石破総理と議論させていただくことを
[54.64s -> 55.90s] 楽しみにしてまいりました
[55.90s -> 59.44s] 前岸田総理から何を引き継ぎ
[59.44s -> 61.36s] そして何を直さなきゃならんのか
[61.36s -> 62.66s] そういったことについて
[62.66s -> 65.04s] 石破総理と論戦をさせていただきたい
[65.04s -> 66.06s] このように思いますので
[66.06s -> 67.18s] 今日はよろしくお願いします
[67.18s -> 70.18s] 冒頭お伺いしたいのは政治改革であります
[70.18s -> 72.28s] 政治改革については
[72.28s -> 74.48s] 昨日の衆議院の予算委員会についても
[74.48s -> 76.56s] 議論が行われたと承知しておりますが
[76.56s -> 78.56s] 特に政策活動費
[78.56s -> 81.88s] これについてさまざまな議論が行われました
[81.88s -> 86.26s] その政策活動については今年の通常国会におきましても
[86.26s -> 90.28s] 5年で50億円が当時の幹事長に渡されているとか
[90.28s -> 94.78s] あるいは議論の中で10年後に領収書を公開するんだとか
[94.78s -> 98.94s] こういったことで通常国会でも論戦が行われたところでございます
[98.94s -> 100.94s] まず石破総理にお伺いしたいのは
[100.94s -> 104.04s] この2024年の通常国会におきまして
[104.04s -> 106.14s] 政策活動費の議論が行われました

ざっくり評価:
- largeと比べても、それほど遜色ないレベルで普通に読めるレベルの文字起こし内容
- 漢字の変換ミスも特に目立たない
- 速度的にもlargeよりはるかに高速(2.88倍)なので、これが一番良さそう
- 欠点としては、文字変換出力の区切りが全体的に短く区切られてる感じ

##### large-v3(かなり良い）

jetson orin nano だと、メモリ不足で落ちましたが、一方現在記事を記載中のPC(core i5-8250U)で、以下分までを実行してみました。

一番時間かかるが精度が良いと言われてる large-v3 せっかくなので試したいと思ったので、急遽実行してみました。

ちなみに下の内容出すだけで 223秒でCPUが常時５０％超えのファンがけたたましい（以下略)

> [0.00s -> 12.20s] 以上で森本慎二君の質疑は終了 いたしました
[12.20s -> 18.60s] 次に尾沼匠君の質疑を行います 尾沼匠君
[18.60s -> 23.06s] 立憲民主党の尾沼匠です 石破総理はじめましてになります
[23.06s -> 29.70s] 我が茨城におきましても石破総理 は九月の二十七日の総裁選挙
[29.70s -> 35.22s] 自民投票のうち有効投票数二万 五千七百八十二票のうち約三十
[35.22s -> 41.94s] 七%九千五百二十三票という票差 で茨城の自民党の党員投票の中
[41.94s -> 46.00s] でもトップに選ばれました 次点の高市候補に一点七倍もの
[46.00s -> 50.20s] 差をつけたそういったところにある 茨城県の生まれ育ちでございまして
[50.20s -> 53.08s] ですね そういう意味で今日は石破総理
[53.08s -> 55.90s] と議論させていただくことを楽しみ にしてまいりました
[55.90s -> 59.68s] 前岸田総理から何を引き継ぎ そして何を引き継ぎ
[59.68s -> 63.46s] そして何を直さなきゃならんのか そういったことについて石破総理
[63.46s -> 66.72s] と論戦をさせていただきたいこの ように思いますので今日はよろしく
[66.72s -> 69.80s] お願いします 冒頭お伺いしたいのは政治改革
[69.80s -> 73.30s] であります 政治改革については昨日の衆議院
[73.30s -> 76.78s] の予算委員会についても議論が 行われたと承知しておりますが
[76.78s -> 82.30s] 特に政策活動費これについてさま ざまな議論が行われました
[82.30s -> 87.40s] その政策活動費については今年の 通常国会におきましても五年で
[87.40s -> 89.68s] 五十億円が当時の幹事長に渡された ということです
[89.68s -> 94.40s] を支え入れるとかあるいは議論 の中で十年後に領収書を公開する
[94.40s -> 99.30s] んだとかこういったことで通常国会 でも論戦が行われたところでございます
[99.30s -> 103.64s] まず石破総理にお伺いしたいのは この二〇二四年の通常国会におき
[103.64s -> 107.56s] まして政策活動費の議論が行 われましたこの評価についてお
[107.56s -> 113.52s] 伺いしたいと思います 石破内閣総理大臣
[113.52s -> 119.22s] 経緯は今委員御指摘のとおりでございます これは再発を防止するために

ざっくり評価:
- 内容はきれいに文字起こしされているが、一方で large系だと数字が何故か漢字表記
- 漢字の変換ミスはほとんどなさそう（ちなみにオヌマタクミ＝正解は `小沼巧` だが上だと `尾沼巧` と流石に人間でも人物名の名前は間違うので、許容範囲かな）
- 欠点としては、時間が超かかる(i5-8250Uで 6200秒=103分20秒超時間かかる）

##### jetson orin nano オススメのパラメータ
- large-v3-turbo
- float16
これが良さそうだと思いました。

#### jetson orin nano=cudaと、手元PC(CPU)で実行した結果の比較内容：
|model_size|compute_type|時間(秒)|時間(分)|元動画時間率|cuda float16と比較|
|-----------|-------------|------------|------------|---------|---------|
|large-v3-turbo(cuda)|float16|694秒|11分34秒|19.7%|1|
|large-v3-turbo(cuda)|int8|762秒|12分41秒|21.4%|1.1|
|large-v3-turbo(CPU M1(macAir2020))|int8|1249秒|20分48秒|35.5%|1.8|
|large-v3-turbo(CPU corei9-8core(macbookPro2019))|int8|1451秒|24分11秒|41.3%|2.09|
|large-v3-turbo(CPU xeon-12core(macPro2013))|int8|2312秒|38分31秒|65.8%|3.33|
|large-v3-turbo(CPU N100)|int8|2568秒|42分47秒|73.1%|3.7|

次に large-v3-turbo での実行時間をcudaと手元にあるPC(CPU)で試した結果となります。

また、一番右に「jetson orin nanoで一番オススメパラメータ」に対する実行時間比較が可能な倍率的な内容を掲載してるので、これを見ると「jetson orin nanoとの速度差」がよくわかるものとなっています。

一方でM1チップ(1.8倍遅い)が、CPUの中では2019のcorei9より速いわけで、改めてM1チップの性能すごいなあって思いました。

あと思ったよりも健闘してるのが「N100(3.7倍遅い)」で、これはAmazonで２万円ちょっとで販売されてる小型中華PC、これにUbuntu入れてるのですが、普通に文字起こしをする分には十分に使えるレベルなのかって思いました(faster whisperが速いって事の証明かと)。

あと、補足として具体的に実行時のリソース状況を見たい場合は以下が便利だったので紹介します。

- jetson-status
https://qiita.com/yamamo-to/items/161f7dcf96704b07a1f9

インストール
> sudo -H pip3 install jetson-stats

サービスを有効にする
> sudo systemctl restart jtop.service

実行
> sudo jtop

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975990/84e000cc-6670-bd56-1d4c-b17a687da6c7.png)

こんな感じでCPUやGPUの利用状況が１画面で閲覧できるので便利でした。

一旦 faster whisper関連の検証結果は以上となります（ありがとうございました）。

# jetson orin nanoを使ったローカルAI文字起こしシステムの考察

次に、この `jetson orin nano` と `faster whisper` による、ローカルAI環境を利用した実際のシステムについて、考察したいと思います。

その前に、元となる jetson orin nano について改めて振り返りたいと思います。
1. GPGPUが使えるが、一方で超低電力(わずか15w)
2. GPGPUが使えるので、通常のCPUより高速でAI関連の処理が可能
3. M2SSDが起動メディアで使えるので、普通のPCレベルで高速(前のjetson nano=microSDオンリ)
4. Amazonで売ってるN100中華小型PCと、大体同じ大きさなので、置き場所をあんまり考慮しなくて良さそう（専用のケース購入＋VESAマウントで、ディスプレイに取り付け可能）
5. OSがubuntuなので、これまでのシステム開発のノウハウも普通に利活用できそう
6. メモリが８GBしかなく、GPGPUの場合はswap領域使えないので、faster whisper実行でメモリ利用がいっぱいになってしまう点(large-v3-turboだと、若干余裕ありそうだけど)
7. ラズパイと同じく拡張ハードウェアが利用できるので低電力と合わせるとIoTにも利用可能
8. CPUファン的なものがついてるが、faster whisper実行してもCPU温度的には低く「ファン音とか気にしなくて」良さそう
9. jetson orin nano の最大の欠点として「セットアップが超面倒」な件

あと、リアルタイム音声文字起こしの「ボトルネック」としては「たとえば、これをサーバ一括で処理」させようとした場合「動画や音声なので、比較的でかいトラフィックが発生」するので、ネット回線もサーバもそれなりに大変になるが、一方でこれを「ローカルAIで文字起こし」だと「その結果をサーバーに送信」する場合は「テキストデータ」なので「トラフィック量もごくわずか」なものとなるので「ネット回線やサーバに優しい」ものとなりますね。
- 音声データ: test.mp4の場合だと151MB
- 文字起こしテキスト: test.mp4を large-v3-turbo だと 84.8KB(0.056%に容量圧縮)
- 文字起こしテキスト(gz): 26KB(0.017%に容量圧縮)

仮に jetson orin nano で電話システムもどき「音声 → AIで文字化(gz) → 転送 → 文字をAIで音声化」めちゃめちゃ「通信コスト抑えられる」なあって思いますが、まあ「９万円のjetson orin nano × 2」でこれやるの草って感じに思いますが、普通に作ろうと思えば作れそうですね。

また一方で `CPU` で faster whisper を実行すると、CPU利用率が「常時５０％ぐらい」で、普通に「CPUファンが高速回転」するので、音がうるさいのと「ノートPCの場合」だと「バッテリモードで動いてる可能性」も「MTG」とかなら「普通にありそうなシチュエーション」なので、バッテリ消費が心配になるなど、通常のローカルPCでローカルAIは、ちょっとしんどい部分があります。

また jetson orin nano では「非常にセットアップがしんどい」のは、今回の内容を見てもらうと「理解」していただけると思いますが、これはDockerで解決はできるので、利用条件が決まったら、Docker化をすることで「ローカルAI環境を横展開」することもできます。

この辺を鑑みると`jetson orin nano + faster whisper` の利用想定としては
1. ローカルAIとしてのリアルタイム音声の文字変換として利用
2. 変換結果の文字をAI解釈してくれるサーバに転送して答えをもらう
3. jetson orin nanoのメモリに余裕があれば、カメラをjetsonに設置して、喋ってる顔から喋ってる人の判断して、対象の音声に対して誰が喋った的な補足ができるようにするとか？

まあ項３は「あんな事いいなできたらいいな」的なものなので、実際は項１と２に対するものが `jetson orin nano + faster whisper` 的なローカルAI環境として最適な利用方法なのかって思います。

最初は jetson orin nano をサーバ的な形で利用すると「電力消費も抑えられる」し「AIブン回せ放題」とか「妄想してた」のですが、肝心の「GPGPUは物理メモリOnly」で、AIって「かなりメモリを食う」ので「ディスクのスワップとか使えない」だから「８GBだと、それほど大したことができない＝ローカルAIとして利活用が最適」と、実際に「机上の空論」じゃなく「実地でつかって見る」事で「得られた」ものであると思いました。

あと、次に示すものは「当初考えた jetson orin nano + faster whisper を使った、文字起こしシステム」ですが、でもこの場合わざわざ９万円もする高額な jetson orin nano じゃなくて、別にAmazonで売ってるN100系の２万円ちょっとの中華小型PCで全然良さそうとか思ったのですが、普通に「会議とかの録画記録内容を、文字起こしができたらいいな」って思ったので、こちらも合わせて紹介したいと思います。

## （番外編）コスパを追求した動画文字起こしシステム案

本来最初にjetson orin nanoを使って、このシステムの形を「考えてた」のですが、実際に色々と faster whisper 環境を検証した所、別に jetson orin nano 使わなくていいんじゃねえか？的な感覚となったため、改めて「机上の空論じゃなく、実地体験を重視すべき」だなあって感じた次第です。

ただ、こんな環境があれば「会社のMTGの録画内容」とかの文字起こしが「楽にできる」的な形で「一定の要望」がありそうなので、せっかくなのでこれも「合わせて説明」したいと思います。

今回の当該システムの構成される主な内容はとして以下となります。
- AWS
- faster whisperを実行するパソコン群(Jetson orin nano or N100 中華小型PCなど)

イメージ：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975990/8b9c7f9f-fd20-bea1-9f22-342a11a5ae2d.png)

まず、①AWS lambdaでserverless環境のWebアプリを構築します。
（ここでは、私が去年に紹介した[LFU](https://github.com/maachang/LFU)を利用)

次に②動画(mp4)や音声(mp3)のアップロードは AWS lambda側のWebアプリで署名URL発行して、S3にUploadする形を取ります（これによって、lambdaのアップロード容量問題を解決）。

また、S3のファイルアップロード先の当該Bucketには、１日後に削除するライフサイクルルールを設ける事で、自動で削除する形とします。

そして③S3のファイルアップロードにイベントを設置し、ファイルアップロード完了したら、SQSに「文字おこし変換対応のJSONメッセージ」を送付します。

LOCAL環境では、当該SQSにそれぞれメッセージが無いかを確認し、存在する場合は④faster whisperで文字起こしを開始し、終了したらslackに終了メッセージを通知します。

文字起こしが終わったら⑤slackにメッセージが届くので、それを利用者が確認し、文字起こし結果を「ダウンロード」します。

このシステムの利点としては、文字起こしを行う頻度が高い場合は、LOCAL環境に物理的なjetson orin nanoか、余ってるPCや、Amazonで売ってる２万円ぐらいのN100中華小型PCなどを設置していれば良く、またAWS lambdaなので、Webアプリ運用コストがほぼゼロ円で済むのと、S3のデータは１日後に削除されるので、それほど物理コストが発生しない点があります。

また、現状秋葉原とかで５年ぐらい前のIntel第８世帯のCPU（コア４）とかのPCが「投げ売り」されてるので、企業としても「余ってるノートPC」とかを、これらを利用する等によって、低コストで環境作成が行えます。

また「膨大なMTG録音内容」などがある場合、これらを文字起こしして、そのデータを新たな学習データとして利用するための文字起こしとしても、利用することができるなど、結構な利用用途も「模索」できます。

このような形で、ローカルAI環境を用いてシステム構築を考える的な発想により、今までだとchatGPTに代表されるような「クラウド」でのAIサービスが多く散見される一方で「手元で試せるAI＝ローカルAI」で「何か敷居が下がる」感じもするので、ぜひ試してみてはいかがでしょうか。

# 最後に

jetson orin nano を使ってみて思ったのは、とにかく「まともに動かすまでに、相当手間がかかった」わけですが、一方で「GPGPU環境が超省電力で利用可能」なので「ローカルAI環境が低電力、高速な環境が手に入れられる」と正に「ローカルAI環境」として「ぴったり」なので、これまでと違った角度で「AIの利用」が見込めるものかと思います。

弊社でも、色々な形でローカルAIを含めた色々なAI環境を利用した、何か画期的な仕組みを考えていこうかと思っています。

以上長文となりましたが、最後まで読んでいただきありがとうございました__|＼○_