Jetson OrinとNVIDIA Riva ASRで文字の書き起こしをする
はじめに
NVIDIA Rivaは、以下の機能を提供してくれるSDKです。
- Automatic Speech Recognition (ASR)
- Text-To-Speech (TTS)
- Neural Machine Translation (NMT)
- Neural Language Processing (NLP)
このなかで、ASRがいわゆる音声認識です。音声データを入力するとそれに対応した文字列を返してくれます。
ここでは、Jetson Orin上でNVIDIA RivaのASRを使って、マイクから拾った日本語の音声の文字起こしをしてみます。
環境構築
以下の環境でセットアップと動作確認を行いました。
- Jetson AGX Orin Developer Kit
- Jetpack 5.1
Jetpackは5.1にしないと動かないようなので、必要に応じてアップグレードしましょう。
以下のステップについては、RivaのQuick Start GuideのEmbedded
セクションに記述されています。
Powerモードの設定
Powerモードを変更して、パフォーマンスを最大に設定します。
sudo nvpmodel -m 0
Dockerの設定
Dockerのデフォルトランタイムをnvidia
に設定するために、/etc/docker/daemon.json
に"default-runtime": "nvidia"
をに追加します。
例えば、以下のようになります。
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia"
}
/etc/docker/daemon.json
を書き換えたら、dockerサービスを再起動しておきます。
sudo systemctl restart docker
デフォルトランタイムがnvidia
になっていることを確認します。
$ docker info | grep 'Default Runtime'
Default Runtime: nvidia
NGC CLIの導入
モデルのダウンロードなどにNGC CLIが必要なため、https://ngc.nvidia.com/setup から、ARM64 Linux用のCLIをダウンロードします。CLI自体はNGCのアカウントがなくてもダウンロードできるようですが、APIキーが必要なので、アカウントを持っていない場合はサインアップしましょう。
wget --content-disposition https://ngc.nvidia.com/downloads/ngccli_arm64.zip && unzip ngccli_arm64.zip && chmod u+x ngc-cli/ngc
find ngc-cli/ -type f -exec md5sum {} + | LC_ALL=C sort | md5sum -c ngc-cli.md5
echo "export PATH=\"\$PATH:$(pwd)/ngc-cli\"" >> ~/.bash_profile && source ~/.bash_profile
CLIがセットアップできたら、ngc
コマンドの初期設定を行います。
ngc config set
途中でAPIキーの入力を要求されるので、https://ngc.nvidia.com/setup から取得して入力します。
NVIDIA Rivaのインストール
NGC CLIを使って、Rivaのスクリプトをダウンロードします。
ngc registry resource download-version nvidia/riva/riva_quickstart_arm64:2.10.0
riva_quickstart_v2.10.0
というディレクトリが作成されるので、その中にあるconfig.sh
を編集します。
編集する場所は2箇所です。
まず、使用するRivaの機能を選択します。
ここでは、ASRをtrue
にして、それ以外の機能はfalse
にします。日本語に対応していない機能をtrue
にすると、セットアップに失敗します。
# Enable or Disable Riva Services
service_enabled_asr=true
service_enabled_nlp=false
service_enabled_tts=false
service_enabled_nmt=false
また、対象言語としてja-JP
を設定します。
# Language code to fetch models of a specify language
# Currently only ASR supports languages other than English
# Supported language codes: ar-AR, en-US, en-GB, de-DE, es-ES, es-US, fr-FR, hi-IN, it-IT, ja-JP, ru-RU, ko-KR, pt-BR, zh-CN
# for any language other than English, set service_enabled_nlp and service_enabled_tts to False
# for multiple languages enter space separated language codes.
language_code=("ja-JP")
config.sh
を編集した後、riva_init.sh
を実行すると必要なDockerイメージやモデルがダウンロードされます。
bash riva_init.sh
ダウンロードが終了すれば、riva_start.sh
を実行することでRivaのサーバーがDockerコンテナで実行されます。
bash riva_start.sh
問題がなければ、以下のようにDockerコンテナ内のbashプロンプトが表示されます。
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
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@bb1e57cce1ad:/opt/riva#
もし何らかの問題が起こって起動できなかった場合は、ログを確認しましょう。
docker logs riva-speech
例えば、riva_start.sh
では以下のポートを使用する設定になっているため、別のアプリケーションなどで使用しているとエラーになります。
- 8000, 8001, 8002, 8888
- 50051
Rivaの動作確認
Rivaのコンテナの/opt/riva/
以下には、Rivaのクライアント、サンプルコード、サンプル音声などがあります。
そこで、ASRのクライアントと日本語音声を使って、Rivaの音声認識の動作確認ができます。
python3 examples/riva_streaming_asr_client.py --language-code ja-JP --input-file wav/ja-JP_sample.wav
上記のコマンドを実行すると、問題がなければ以下のような出力で終了します。
Number of clients: 1
Number of iteration: 1
Input file: wav/ja-JP_sample.wav
File duration: 3.85s
1 threads done, output written to output_<thread_id>.txt
出力はoutput_0.txt
というファイルにあるので、確認しましょう。
以下のような内容になっていれば、問題なく動作しています。
マイク入力をRivaのASRサーバーに渡して音声認識する
Rivaの動作確認ができたので、ここからはDockerコンテナ内ではなくホストマシン側で作業します。Rivaのサンプルには、マイク入力を受け取って文字起こしをするスクリプトが含まれているので、それを使ってみます。
まず、RivaクライアントのPython用のライブラリをインストールします。
pip3 install nvidia-riva-client
そして、Rivaをダウンロードしたディレクトリのexamples
フォルダにあるtranscribe_mic.py
を実行します。
python3 transcribe_mic.py --language-code ja-JP
問題なければ、マイクが拾った音声をテキストとして出力してくます。
まとめ
Jetson AGX Orin上で、NVIDIA Riva Speech SDKを使って日本語の音声認識をしてみました。環境をセットアップしてしまえば、手軽に日本語音声の書き起こしができます。
使ってみた感想としては、ごく日常的な会話などはいい感じに認識してくれます。
ただ、英単語などもすべて日本語として書き起こされてしまうので、そのあたりは必要であれば何らかの後処理をしないとだめかもしれません。
記事の修正について
以前、transcribe_mic.py
を使うのではなくpyaudio
を使う記事になっていましたが、修正しました。修正前に作成したスクリプトなどは以下のリポジトリに置いてあります。
https://github.com/fukuoka-to/stream-riva-asr-client
Discussion