🔖

Jetson OrinとNVIDIA Riva ASRで文字の書き起こしをする

2023/03/24に公開

はじめに

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 GuideEmbeddedセクションに記述されています。

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というファイルにあるので、確認しましょう。
以下のような内容になっていれば、問題なく動作しています。

ASRの動作確認(Docker)

マイク入力を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