Conversational AI / NLP

NVIDIA Riva – 日本語 ASR を Jetson Orin Nano 開発者キットへインストールする

Reading Time: 6 minutes

注: この投稿は、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 の概要については以下のリンクを参照してください。 

今回インストールを行う際に使用するハードウェアとソフトウェアは以下になります。

  • 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 でリモートログインした状態で各コマンド入力を行っています。

なお、システム要件の詳細は以下のリンクに記載があります。

Jetson で実行する場合の (上記リンクに記載されている内容も含めた) ポイントを以下に挙げます。詳細は上記リンクも参照してください。

サポートされている Jetson プラットフォームは、Xavier シリーズ、Orin シリーズ以降のプラットフォーム (2023 年 6 月時点) 。 

  1. Riva 2.2.0 以降は、Jetpack 5.x 以降が必須です。 (2023 年 1 月時点で Riva 2.5.0 以降では Jetpack 5.0.2 必須) 
  2. モデルと Docker コンテナー イメージのダウンロードに 15 ギガバイト程度のディスク スペースが必要になります。また、RMIR モデル (Riva model intermediate representation models) のデプロイを行う場合、追加で 14 ギガバイト程度のディスク スペースが必要です。 
  3. オンボードの eMMC ストレージを使用する AGX シリーズ開発者キットを使用する場合は、オンボード eMMC の空き容量が不足する可能性があるので大容量 (空き容量 60 ギガバイト以上推奨) の外部ストレージ (USB or NVMe SSD) を準備して rootfs をそこへ移動、もしくは環境を構築しておくことをお勧めします。 
    – 参考: Jetson Linux を Jetson AGX Orin Devkit の NVMe SSD へインストールする
  4. Jetson へインストールされている docker コマンドは sudo 無しで実行できるようにしておきます。 
  5. 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 コンテナー イメージとして公開されています。そのため、インストールにはそれらのリソースへアクセスするためのアカウントやツールが必要になります。

  1. NVIDIA NGC のアカウントをお持ちでない場合は作成します。詳細は NGC User Guide もしくは関連する Web サイトを参照してください。
  2. ARM64 Linux 版の NGC CLI tool を Jetson へインストールします。
  3. NGC から Quick Start Scripts をダウンロードしてセットアップを行います。

以降、本投稿では上記 3. の手順の説明を行います。

なお、本投稿は Riva Skills Embedded Quick Start v2.13.0 (2023 年 9 月) を使用して作成しています。ご自身が使用するバージョンに合わせて適宜読み替えてください。 

Riva Skills Embedded Quick Start のダウンロードとインストール

作業用のフォルダーを作成したら、クリップボードにコピーされた 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 を導入すると、用途に合わせてアプリケーションを調整し、それをあらゆるクラウド、データ センター、エッジ、組み込みデバイスに展開できます。
表 1. 音声とマイク入力の比較

最後に

今回は、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 

    Tags