注: この投稿は、11 月 15 日に 「Riva Skills Embedded Quick Start (NGC) – v2.13.0」に合わせて全面的に更新されました。
この投稿では、NVIDIA NGC で公開されている Riva Skills Embedded Quick Start を使用して Jetson Orin Nano 開発者キットへ Riva 日本語 ASR をインストールする手順を紹介します。
参考: この投稿では主に動作環境のセットアップを解説します。NVIDIA Riva ASR の概要については以下のリンクを参照してください。
- NVIDIA Riva > SPEECH RECOGNITION > ASR Overview
今回インストールを行う際に使用するハードウェアとソフトウェアは以下になります。
- Jetson AGX Orin 開発者キット (または、Jetson Orin Nano 開発者キット) – Jetpack 5.1.2 (Jetson Linux 35.4.1)
– PC ディスプレイ (※)
– USB キーボード、マウス (※)
– Samsung 970 EVO Plus (500Gb), NVMe SSD M.2 M-Key
– Logicool H540 USB ヘッドセット (オプション: 音声マイク入力用) - Riva Skills Embedded Quick Start (NGC) — v2.13.0 (Sep. 7, 2023)
(※) SSH 等で Jetson 開発者キットへリモート ログインする場合、PC ディスプレイや USB キーボード、マウスは必須ではありません。この投稿では SSH でリモートログインした状態で各コマンド入力を行っています。
なお、システム要件の詳細は以下のリンクに記載があります。
- NVIDIA Riva > GETTING STARTED > Embedded
- NVIDIA Riva > REFERENCE > Support Matrix > … > Embedded
Jetson で実行する場合の (上記リンクに記載されている内容も含めた) ポイントを以下に挙げます。詳細は上記リンクも参照してください。
サポートされている Jetson プラットフォームは、Xavier シリーズ、Orin シリーズ以降のプラットフォーム (2023 年 6 月時点) 。
- Riva 2.2.0 以降は、Jetpack 5.x 以降が必須です。 (2023 年 1 月時点で Riva 2.5.0 以降では Jetpack 5.0.2 必須)
- モデルと Docker コンテナー イメージのダウンロードに 15 ギガバイト程度のディスク スペースが必要になります。また、RMIR モデル (Riva model intermediate representation models) のデプロイを行う場合、追加で 14 ギガバイト程度のディスク スペースが必要です。
- オンボードの eMMC ストレージを使用する AGX シリーズ開発者キットを使用する場合は、オンボード eMMC の空き容量が不足する可能性があるので大容量 (空き容量 60 ギガバイト以上推奨) の外部ストレージ (USB or NVMe SSD) を準備して rootfs をそこへ移動、もしくは環境を構築しておくことをお勧めします。
– 参考: Jetson Linux を Jetson AGX Orin Devkit の NVMe SSD へインストールする - Jetson へインストールされている docker コマンドは sudo 無しで実行できるようにしておきます。
- Jetson にインストールされている /etc/docker/daemon.json ファイルに以下の行を追加することで、Jetsonプラットフォームのデフォルト ランタイムを nvidia に設定します。ファイルを編集した後、sudo systemctl restart docker を使用して Docker サービスを再起動します。
# before:
1: {
2: "runtimes": {
3: "nvidia": {
4: "path": "nvidia-container-runtime",
5: "runtimeArgs": []
6: }
7: }
8: }
# after:
1: {
2: "runtimes": {
3: "nvidia": {
4: "path": "nvidia-container-runtime",
5: "runtimeArgs": []
6: }
7: },
8: "default-runtime": "nvidia"
9: }
6. (オプション) USB マイク入力などを行いたい場合は、Jetson にデバイスを事前に接続しておきます。(再起動が必要になる場合があります)
重要: Orin Nano 開発者キット (メモリ: 8G バイト) を使用して、後述する offline モデルを有効にする場合、事前に「RAM optimization (RAM の最適化)」手順を実行してください。具体的な手順は本書終盤の Appendix にも記載されています。
インストール、セットアップの概要
Riva Skills Embedded Quick Start は NVIDIA NGC 上で Dokcker コンテナー イメージとして公開されています。そのため、インストールにはそれらのリソースへアクセスするためのアカウントやツールが必要になります。
- NVIDIA NGC のアカウントをお持ちでない場合は作成します。詳細は NGC User Guide もしくは関連する Web サイトを参照してください。
- ARM64 Linux 版の NGC CLI tool を Jetson へインストールします。
- NGC から Quick Start Scripts をダウンロードしてセットアップを行います。
以降、本投稿では上記 3. の手順の説明を行います。
なお、本投稿は Riva Skills Embedded Quick Start v2.13.0 (2023 年 9 月) を使用して作成しています。ご自身が使用するバージョンに合わせて適宜読み替えてください。
Riva Skills Embedded Quick Start のダウンロードとインストール
- Local Deployment Using Quick Start Scripts — https://docs.nvidia.com/deeplearning/riva/user-guide/docs/quick-start-guide.html#local-deployment-using-quick-start-scripts
作業用のフォルダーを作成したら、クリップボードにコピーされた CLI コマンドライン文字列をターミナルへペーストして実行します。
# Create work folder
mkdir -p ${HOME}/Riva && cd ${HOME}/Riva
export RIVA_VER=2.13.0
# Download Riva quickstart scripts
ngc registry resource download-version nvidia/riva/riva_quickstart_arm64:${RIVA_VER}
日本語 ASR モデルのダウンロードとセットアップ
前のセクションでダウンロードした英語版の Riva 環境を変更します。
v2.13.0 リリース時点でサポートされている日本語の機能は ASR のみです。従って、Quick Start スクリプトでダウンロードした config.sh を日本語 ASR 用に編集します。
各パラメーターに設定可能な設定値は Quick Start のバージョンにより異なります。最新の設定値は config.sh スクリプトファイル内のコメント文を参照してください。
以下は v2.13.0 における設定例です。
# before
# Enable or Disable Riva Services
service_enabled_asr=true
service_enabled_nlp=true
service_enabled_tts=true
service_enabled_nmt=true
:
# Language code to fetch ASR models of a specific language
# :
language_code=("en-US")
:
# ASR acoustic model architecture
# :
asr_acoustic_model=("conformer")
:
# ASR acoustic model architecture variant
# :
asr_acoustic_model_variant=("")
:
use_existing_rmirs=false
# after
# Enable or Disable Riva Services
service_enabled_asr=true
service_enabled_nlp=false
service_enabled_tts=false
service_enabled_nmt=false
:
# Language code to fetch ASR models of a specific language
# :
language_code=("ja-JP")
# or: asr_language_code=("ja-en-JP")
:
# ASR acoustic model architecture
# :
asr_acoustic_model=("conformer")
# or: asr_acoustic_model=("citrinet_1024")
:
# ASR acoustic model architecture variant
# :
asr_acoustic_model_variant=("unified")
# or: asr_acoustic_model_variant=("unified_ml_cs")
:
use_existing_rmirs=false
Embedded 版の Quick Start でダウンロード、セットアップされるモデルは streaming モデルのみです。従って、offline モデルも同時にダウンロード、セットアップする場合は「### Offline w/ CPU decoder
」の下の行のコメントを外してその行を有効にしてください。
注: Orin Nano 開発者キット (メモリ: 8G バイト) では、搭載しているDRAMメモリ量の制限により Steaming モデルと Offline モデルを同時にロードすることはできません。また、Orin Nano 開発者キットを使用して offline モデルを有効にする場合、事前に「RAM optimization (RAM の最適化)」の手順を実行した上で (具体的な手順は本書終盤の Appendix にも記載されています)、config.sh スクリプトのStreaming モデルのセットアップ部分 (「### Streaming w/ CPU decoder, best latency configuration
」の下の行) をコメントアウトして無効にしてください。
165: if [[ $riva_target_gpu_family == "tegra" ]]; then
166:
167: if [[ ${asr_acoustic_model} == "jasper" || \
168: ${asr_acoustic_model} == "quartznet" || \
169: ${asr_acoustic_model} == "conformer_xl" ]]; then
170: echo "Conformer-XL, Jasper and Quartznet models are not available for arm64 architecture"
171: exit 1
172: fi
173:
174: if [[ ${asr_acoustic_model} == "citrinet_256" && ${lang_code} != "en-US" ]]; then
175: echo "For arm64 architecture, citrinet_256 acoustic model is only available for language code en-US."
176: exit 1
177: fi
178:
179: models_asr+=(
180: ### Streaming w/ CPU decoder, best latency configuration
181: "${riva_ngc_org}/${riva_ngc_team}/models_asr_${asr_acoustic_model}${asr_acoustic_model_variant}_${modified_lang_code}_str:${riva_ngc_model_version}-${riva_target_gpu_family}-${riva_tegra_platform}"
182:
183: ### Offline w/ CPU decoder
184: # "${riva_ngc_org}/${riva_ngc_team}/rmir_asr_${asr_acoustic_model}${asr_acoustic_model_variant}_${modified_lang_code}_ofl${decoder}:${riva_ngc_model_version}"
185: )
186: else
注: 使用しているプラットフォームが Jetson Xavier シリーズの場合は、config.sh の以下の部分も変更します。事前にこれを行っていないと、次のステップの riva_init.sh スクリプト以降の挙動が変わってしまい、riva-speech-server コンテナーのターミナルへログイン出来ません。
# before
riva_tegra_platform="orin"
# after
riva_tegra_platform="xavier"
次にモデルのダウンロードと初期セットアップを行います。初めて riva_init.sh スクリプトを実行する際には、モデルの展開や最適化等も実行されるため、ある程度の時間がかかります。特に offline モデルを有効にした場合、初期セットアップにはAGX Orin で 15 分以上、Orin Nano で 35 分以上の時間がかかる場合が‘ありますので注意してください。
#export RIVA_VER=2.13.0
export RIVA_HOME=${HOME}/Riva/riva_quickstart_arm64_v${RIVA_VER}
cd ${RIVA_HOME} # for Jetson: ${HOME}/Riva/riva_quickstart_arm64_v${RIVA_VER}
bash riva_init.sh # If you already have done this step before, you can skip here.
ダウンロードしたモデルの動作確認
Riva サーバーの Docker コンテナーを起動します。
# Start riva-server
bash riva_start.sh
以下は起動中のターミナル出力例です。 使用する Jetson の種類やモデルの数により異なりますが起動するまで 1 ~2 分程度の時間がかかります。
Starting Riva Speech Services. This may take several minutes depending on the number of models deployed.
Waiting for Riva server to load all models...retrying in 10 seconds
Waiting for Riva server to load all models...retrying in 10 seconds
Waiting for Riva server to load all models...retrying in 10 seconds
Waiting for Riva server to load all models...retrying in 10 seconds
Waiting for Riva server to load all models...retrying in 10 seconds
Waiting for Riva server to load all models...retrying in 10 seconds
Waiting for Riva server to load all models...retrying in 10 seconds
Riva server is ready...
Use this container terminal to run applications:
root@0db239e533a2:/opt/riva#
正常に動作すると Docker コンテナーのターミナルに入ります。コンテナー内のターミナルから riva_streaming_asr_client コマンドを使い streaming モデルの日本語 ASR を実行します。
# Usage: riva_streaming_asr_client:
# --audio_file=<filenameor folder>
# --chunk_duration_ms=<integer>
# --simulate_realtime=<true|false>
# --language_code=<bcp 47 language code (suchas en-US)>
#
# Additional options can be found at the link below:
# https://github.com/nvidia-riva/python-clients/blob/main/scripts/asr/riva_streaming_asr_client.py
# For streaming recognition, run:
riva_streaming_asr_client --simulate_realtime=true --chunk_duration_ms=160 \
--language_code=ja-JP --audio_file=/opt/riva/wav/ja-JP_sample.wav
以下は出力例になります。
I1012 02:14:46.865350 660 grpc.h:94] Using Insecure Server Credentials
Loading eval dataset...
filename: /opt/riva/wav/ja-JP_sample.wav
Done loading 1 files
運動のため、隣の駅まで歩きます
運動のため、隣の駅まで歩きます。
-----------------------------------------------------------
File: /opt/riva/wav/ja-JP_sample.wav
Final transcripts:
0 : 運動のため、隣の駅まで歩きます。
… 中略 …
Audio processed: 4.0000e+00 sec.
-----------------------------------------------------------
Latencies (ms):
Median 90th 95th 99th Avg
4.11468e+01 8.32746e+01 8.86385e+01 1.26163e+02 4.91205e+01
Intermediate latencies (ms):
Median 90th 95th 99th Avg
4.10536e+01 5.41479e+01 6.01758e+01 1.26163e+02 4.59174e+01
Final latencies (ms):
Median 90th 95th 99th Avg
8.86385e+01 8.86385e+01 8.86385e+01 8.86385e+01 8.59566e+01
Run time: 3.93727e+00 sec.
Total audio processed: 3.85200e+00 sec.
Throughput: 9.78343e-01 RTFX
config.sh スクリプトで offline モデルを有効にしていた場合はriva_asr_client コマンドで offline モデルの実行も可能です。
# For offline recognition, run:
riva_asr_client --language_code=ja-JP --audio_file=/opt/riva/wav/ja-JP_sample.wav
streaming モデルの動作確認まで完了したらコンテナーを終了 [CNTL+D] してから riva_clean.sh スクリプト (あるいは riva_stop.sh スクリプト) で動作している riva-server コンテナーを一旦削除 (riva_stop.sh を使った場合はコンテナーを終了) します。
# show docker container instances
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5bebd2c490e7 nvcr.io/nvidia/riva/riva-speech:2.13.0-l4t-aarch64 "start-riva --riva-u…" 9 minutes ago Up 9 minutes 0.0.0.0:8000-8002->8000-8002/tcp, :::8000-8002->8000-8002/tcp, 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp, 0.0.0.0:50051->50051/tcp, :::50051->50051/tcp riva-speech
# clean-up riva-server
$ cd $RIVA_HOME && bash riva_clean.sh
Cleaning up local Riva installation.
Image nvcr.io/nvidia/riva/riva-speech:2.13.0-l4t-aarch64 found. Delete? [y/N] N <ENTER>
Skipping...
Image nvcr.io/nvidia/riva/riva-speech:2.13.0-servicemaker-l4t-aarch64 found. Delete? [y/N] N <ENTER>
Skipping...
Error response from daemon: get home/nvidia/Riva/riva_quickstart_arm64_v2.13.0/model_repository: no such volume
'/home/nvidia/Riva/riva_quickstart_arm64_v2.13.0/model_repository' is not a Docker volume, or has already been deleted.
Found models at '/home/nvidia/Riva/riva_quickstart_arm64_v2.13.0/model_repository'. Delete? [y/N] N <ENTER>
Skipping...
# make sure no container exists.
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
NVIDIA Riva Clients-Python クライアント アプリケーション
Python クライアントの環境構築を行います。必要なソースとライブラリをインストールします。
クライアント アプリケーションのインストールは Docker ホスト、コンテナーいずれにもインストール可能です。以降の手順はホスト側へインストールした例になりますが、コンテナー環境へインストールする場合はコンテナーのターミナル内でコマンドを入力してください。
注: 搭載メモリの少ない Jetson を使用している場合 (8G 版の Jetson Orin Nano/NX, Xavier NX など)、riva-server コンテナーを起動した状態でクライアントアプリケーションをインストールするとメモリ不足でインストール時にエラーになる場合があります。
今回はメモリ不足によるエラーを回避するため、前のセクションで事前に riva_clean.sh スクリプト (あるいは riva_stop.sh スクリプト) を使い、起動済みの riva-server コンテナーを削除 (あるいは終了) してメモリの開放を行っています。
クライアント アプリケーションのインストール手順は以下になります。
# Install Riva client app.
cd ${HOME}/Riva
git clone https://github.com/nvidia-riva/python-clients.git && cd python-clients
sudo apt update && sudo apt install git python3.8-venv -y
python3 -m venv venv-riva-clients
. venv-riva-clients/bin/activate
# Upgrade from 20.0.2 to 23.1.2 (as of May 19, 2023)
pip install --upgrade pip
git submodule init
git submodule update --remote --recursive
pip install wheel
pip install -r requirements.txt
python3 setup.py bdist_wheel
pip install --force-reinstall dist/*.whl
pip install nvidia-riva-client
参考: riva-server コンテナー起動時のメモリ使用量の例
- Streaming モデルのみ使用時のメモリ使用量 (Jetson Orin Nano 開発者キット)
$ free -h
total used free shared buff/cache available
Mem: 7.3Gi 5.4Gi 847Mi 16Mi 1.1Gi 1.6Gi
Swap: 3.6Gi 8.0Mi 3.6Gi
- Streaming モデルと Offline モデルを同時にロードした時のメモリ使用量 (Jetson AGX Orin 開発者キット 32G バイト版)
$ free -h
total used free shared buff/cache available
Mem: 29Gi 11Gi 15Gi 21Mi 2.8Gi 17Gi
Swap: 14Gi 0B 14Gi
オプション: マイク入力を行う場合の環境設定
まず、設定が必要になります。
sudo apt-get install portaudio19-dev python3-dev
pip install pyaudio
次に下記コマンドを実行後、Jetson を再起動します。
sudo adduser $USER audio
sudo adduser $USER pulse-access
マイク設定をした場合は再度ターミナルを開き、下記ディレクトリに移動し Python の仮想環境を立ち上げます。
cd ${HOME}/Riva/python-clients
. venv-riva-clients/bin/activate
ASR Python クライアントの動作確認
モデルのダウンロードは「日本語 ASR モデルのダウンロードとセットアップ」のセクションで完了済みのため、再ダウンロードしないように config.sh スクリプトを修正します。
# before
use_existing_rmirs=false
# after
use_existing_rmirs=true
ホスト側に新しくターミナルをオープンし (Terminal #2)、riva-server コンテナーを起動します。
注: 前の手順で riva_clean.sh スクリプトの代わりに riva_stop.sh スクリプトを使って riva-server コンテナーを終了した場合、下の手順の「bash riva_init.sh」コマンドは不要です。
# Terminal #2
export RIVA_VER=2.11.0
export RIVA_HOME=${HOME}/Riva/riva_quickstart_arm64_v${RIVA_VER}
cd ${RIVA_HOME} # for Jetson: ${HOME}/Riva/riva_quickstart_arm64_v${RIVA_VER}
bash riva_init.sh # If you already have done this step before, you can skip here.
bash riva_start.sh
Python クライアント アプリケーションをインストールした venv ターミナルから (Terminal #1)、ストリーミング モデルの Python クライアントを起動して動作確認を行います。
# Terminal #1
# cd ${HOME}/Riva/python-clients
# . venv-riva-clients/bin/activate
# For Streaming model
python scripts/asr/transcribe_file.py --input-file {your example audio file} \
--simulate-realtime --show-intermediate --language-code ja-JP
# For Offline model
python scripts/asr/transcribe_file_offline.py --input-file {your example audio file} \
--automatic-punctuation --language-code ja-JP
オプション: マイクの動作確認
使用可能なマイク デバイスの情報を確認します。いくつか ALSA lib のメッセージが表示される場合がありますが、以下の例の様にオーディオ デバイスのリストが表示されれば問題ありません。
筆者が接続したマイク デバイスは下記のように確認できます。筆者の環境では 0 が接続したマイク デバイスの ID でした。
$ python scripts/asr/transcribe_mic.py --list-devices
…snip…
:
Input audio devices:
0: Logicool USB Headset H540: Audio (hw:0,0)
5: NVIDIA Jetson Orin NX APE: - (hw:2,0)
6: NVIDIA Jetson Orin NX APE: - (hw:2,1)
:
37: default
下記コマンドを実行します。先程確認したマイク デバイス ID を指定します。
# run mic input
# For Streaming model
python scripts/asr/transcribe_mic.py --language-code ja-JP --input-device 0
NVIDIA Riva の Web サイトを筆者自身が読み上げた音声をマイク入力したのが以下の例です。
Riva ASR の出力例 | NVIDIA Riva Web サイト |
## 自動音声認識とテキスト読み上げからなるスピーチエアスキルは、あらゆる業界において、企業が顧客とやり取りし、顧客をサポートする仕組みを一変させます ## ビデアaiプラットフォームの一部である ## アリーバはコンタクトセンターの窓口支援、仮装アシスタント、デジタルアバター、ブランドボイス、ビデオ会議の文字起こしなど、各種用途に合わせて、完全にカスタマイズできるリアルイムaiパイプライを構築し、展開するためのgpuで最適化する最新のワークフローを提供します ## リーバーを導入すると、用途に合わせてアプリケーションを調整し、それをあらゆるクラウド、データセンター、エッジ、組込みデバイスに展開できます | 自動音声認識 (ASR) とテキスト読み上げ (TTS) からなるスピーチ AI スキルは、あらゆる業界において、企業が顧客とやりとりし、顧客をサポートする仕組みを一変させます。 NVIDIA AI プラットフォームの一部である NVIDIA® Riva は、コンタクト センターの窓口支援、仮想アシスタント、デジタル アバター、ブランド ボイス、ビデオ会議の文字起こしなど、各種用途に合わせて完全にカスタマイズできるリアルタイム AI パイプラインを構築し、展開するための、GPU で最適化する最新のワークフローを提供します。 Riva を導入すると、用途に合わせてアプリケーションを調整し、それをあらゆるクラウド、データ センター、エッジ、組み込みデバイスに展開できます。 |
最後に
今回は、Jetson 向けにデプロイ済みの日本語 ASR モデルをダウンロードして Jetson 開発者キットで動作させました。
2023 年 9 月時点で日本語 ASR はオープン ベータとなっており、対象の Jetson をお持ちであればどなたでも無料でお試しいただけます。今後 GA リリースへ向けて、精度の向上やモデルのカスタマイズなどに対応していく予定です。
Appendix
RAM Optimization (RAM の最適化)
RAM optimization – https://www.jetson-ai-lab.com/tips_ram-optimization.html
Disabling the Desktop GUI (デスクトップ GUI の無効化)
下記 a) のコマンドを入力し、GUI デスクトップを無効にして GUI 用に使用されているメモリを開放します。元に戻すときは b) のコマンドを入力して Jetson を再起動してください。
a) 起動時にデスクトップを無効にする
# To disable desktop on boot
sudo systemctl set-default multi-user.target
b) 起動時にデスクトップを有効にする
# To enable desktop on boot
sudo systemctl set-default graphical.target
Disabling misc services (その他の使用していないサービスの無効化)
Argus カメラを使用していない場合は、そのサービスを終了します。他に未使用のサービスがあれば、それらも終了します。
# Disabling misc services
sudo systemctl disable nvargus-daemon.service
Mounting Swap (Swap ファイルのマウント)
下記の例では NVMe SSD 内の /mnt フォルダーの下に Swap ファイルを作成しています。
sudo systemctl disable nvzramconfig
sudo fallocate -l 16G /mnt/16GB.swap
sudo mkswap /mnt/16GB.swap
sudo swapon /mnt/16GB.swap
次に、作成した Swap ファイルが Jetson 再起動後も有効になるように /etc/fstab ファイルを編集します。
# Then add the following line to the end of /etc/fstab to make the change persistent:
/mnt/16GB.swap none swap sw 0 0
Jetson を再起動して Swap サイズが拡大されていることを確認します。
$ free -h
total used free shared buff/cache available
Mem: 7.3Gi 390Mi 6.5Gi 18Mi 435Mi 6.7Gi
Swap: 15Gi 0B 15Gi