Conversational AI / NLP

NVIDIA NIM で日本語対応の Nemotron Voice Agent を構築する

Reading Time: 5 minutes

1. はじめに

音声 AI エージェントは、ユーザーの音声をテキストに変換する音声認識 (ASR: Automatic Speech Recognition)、入力を理解して回答を生成する大規模言語モデル (LLM: Large Language Model)、回答を音声に変換する音声合成 (TTS: Text-to-Speech) の 3 つの要素から構成できます。

NVIDIA NIM™ は、学習済みモデルと推論ランタイム、標準 API をコンテナーにまとめた推論マイクロサービスです。モデルごとに異なる推論環境を一から構築しなくても、NIM コンテナーを起動することで API として利用できます。

本記事では、次の 3 つのモデルを、それぞれ独立した NIM としてローカル環境にデプロイします。

  • 音声認識: Nemotron ASR Streaming Multilingual
  • 応答生成: NVIDIA Nemotron 3 Nano
  • 音声合成: Magpie TTS Multilingual

Nemotron ASR Streaming Multilingual は、日本語を含む 40 ロケールのストリーミング音声認識に対応しています。Nemotron 3 Nano は日本語を含む多言語に対応した小型の Mixture-of-Experts (MoE) モデルです。また、Magpie TTS Multilingual は、日本語を含む複数言語のストリーミングおよびオフライン音声合成に対応しています。

最後に、NVIDIA が公開している Nemotron Voice Agent Blueprint v2.0.0 を利用して 3 つの NIM を接続し、ブラウザーから日本語で会話できる音声 AI エージェントを構築します。音声 AI エージェント部分を独自実装するのではなく、公式のリファレンス実装を最小限変更して利用することで、本記事では各モデルのデプロイと API の接続に焦点を当てます。

本記事の構成は、1 台のワークステーションで機能を確認するためのデモです。外部公開を前提とした認証、信頼された TLS 証明書、冗長化、監視などは含みません。本番環境で必要になる検討事項は、最後に改めて説明します。

全体構成

処理の流れは次のとおりです。

ASR、LLM、TTS は独立したコンテナーとして手動で起動します。Voice Agent はモデルを内包せず、各 NIM のエンドポイントを呼び出すオーケストレーターとして起動します。この分離により、それぞれのモデルの役割と API の境界を確認しやすくなり、モデルの差し替えも容易になります。

動作確認環境

本記事では、次の環境で 3 つの NIM と Voice Agent を 1 台の GPU 上で同時に実行しました。

  • GPU: NVIDIA RTX PRO 6000 Blackwell Max-Q Workstation Edition (96 GB)
  • NVIDIA Driver: 610.43.02
  • OS: Ubuntu 24.04.4 LTS
  • Docker: 29.5.3
  • Docker Compose: 5.1.4
  • Nemotron ASR Streaming NIM: 1.2.0
  • Nemotron 3 Nano NIM: 2.0.8
  • Magpie TTS Multilingual NIM: 1.8.0
  • Nemotron Voice Agent: v2.0.0

必要な GPU メモリや対応 GPU は、使用するプロファイルによって異なります。実行前に LLM NIM Support Matrix (2.0.8)ASR NIM Support Matrix (26.05.0)TTS NIM Support Matrix (26.05.0) を確認してください。

事前準備

以降のコマンドは 3 つの NIM と Voice Agent を実行する同じ Linux ホストで実行します。あらかじめ次を準備してください。

  • 使用する NIM の Support Matrix に掲載された NVIDIA GPU と、対応する NVIDIA Driver
  • NVIDIA AI Enterprise の有効なライセンスまたは NVIDIA Developer Program の登録
  • Docker Engine、Docker Compose プラグイン、NVIDIA Container Toolkit
  • NIM のコンテナー イメージとモデルを保存できる空きディスク容量

NIM コンテナーとモデルを NGC から取得するため、NGC Personal API Key を用意します。NGC の API キーのページ から API キーを作成し、少なくとも NGC Catalog へのアクセスを許可してください。

作成した API キーを環境変数に設定し、NGC Container Registry にログインします。

export NGC_API_KEY="your-ngc-api-key"

echo "${NGC_API_KEY}" | docker login nvcr.io \
  --username '$oauthtoken' \
  --password-stdin

本記事で使用する作業ディレクトリを作成します。

mkdir --parents nemotron-voice-chat/nim-export/asr
mkdir --parents nemotron-voice-chat/nim-export/tts
mkdir --parents nemotron-voice-chat/nim-cache/llm
cd nemotron-voice-chat/

chmod 777 nim-export/asr nim-export/tts nim-cache/llm

NVIDIA Speech NIM Microservices のエクスポート処理と LLM NIM がコンテナー内の非 root ユーザーでファイルを書き込めるように、ここでは新規作成した 3 ディレクトリだけに書き込み権限を付与しています。複数の利用者がログインするホストでは 777 をそのまま使用せず、コンテナーの実行 UID/GID に所有者を合わせるなど、環境の権限管理方針に従ってください。

モデル キャッシュについて: Speech NIM で利用できるモデル形式は、モデルと GPU によって異なります。本記事では検証済みの手順に統一するため、ASR と TTS の最適化済みモデルを nim-export/ にエクスポートして再利用します。対応する事前ビルド済みモデルを通常のキャッシュへ保存する方法は、Speech NIM の Model Caching (26.05.0) を参照してください。

2. Nemotron ASR Streaming Multilingual を NIM でデプロイする

Nemotron ASR Streaming (26.05.0) は、リアルタイム音声認識向けのストリーミング ASR です。英語専用の type=en-US と多言語対応の type=multi が用意されています。日本語を使用するため、ここでは type=multi を選択します。

使用するコンテナーとモデルプロファイルを設定します。

export ASR_NIM_IMAGE="nvcr.io/nim/nvidia/nemotron-asr-streaming:1.2.0"
export ASR_NIM_TAGS_SELECTOR="name=nemotron-asr-streaming,type=multi,mode=str"

最適化済みモデルをエクスポートする

検証環境のように事前ビルド済みエンジンを利用しない場合は、最初に次のコマンドを実行します。NIM は GPU に合わせてモデルを準備し、結果を nim-export/asr に保存します。この処理には時間がかかります。

docker run --rm \
  --gpus all \
  --shm-size=8GB \
  --env NGC_API_KEY \
  --env NIM_TAGS_SELECTOR="${ASR_NIM_TAGS_SELECTOR}" \
  --env NIM_EXPORT_PATH=/opt/nim/export \
  --env TRITON_TIMEOUT_SEC=1800 \
  --mount type=bind,source="${PWD}/nim-export/asr",target=/opt/nim/export \
  "${ASR_NIM_IMAGE}"

ログに Models exported to /opt/nim/export と表示され、コンテナーが終了すれば準備完了です。検証環境では、コンテナーイメージのダウンロードを含む初回実行に約 10 分かかり、約 4.3 GB のファイルが nim-export/asr に保存されました。所要時間はネットワークと GPU によって異なります。

ASR NIM を起動する

エクスポートしたモデルを使用して ASR NIM を起動します。

docker run --detach \
  --name nemotron-asr \
  --gpus all \
  --shm-size=8GB \
  --env NGC_API_KEY \
  --env NIM_TAGS_SELECTOR="${ASR_NIM_TAGS_SELECTOR}" \
  --env NIM_DISABLE_MODEL_DOWNLOAD=true \
  --env NIM_EXPORT_PATH=/opt/nim/export \
  --env NIM_HTTP_API_PORT=9001 \
  --env NIM_GRPC_API_PORT=50052 \
  --publish 9001:9001 \
  --publish 50052:50052 \
  --mount type=bind,source="${PWD}/nim-export/asr",target=/opt/nim/export \
  "${ASR_NIM_IMAGE}"

準備が完了するまでログを確認します。

docker logs --follow nemotron-asr

初期化の進行を確認したら、Ctrl+C でログの追跡だけを終了します。コンテナーはバックグラウンドで動作し続けます。起動完了の判断には次の Readiness API を使用します。

curl --fail http://localhost:9001/v1/health/ready

レスポンスの statusready になれば ASR NIM は推論リクエストを受け付けられます。検証時には {"object":"health.response","message":"ready","status":"ready"} が返りました。

Nemotron ASR Streaming の多言語モデル自体は、language_codeauto を指定するか言語指定を省略すると、発話言語を自動判定します。ja-JP のようなロケールを指定して認識言語を限定することもできます。本記事の Voice Agent 統合例では、自動判定はせず、UI で選択したセッション言語 ja-JP を gRPC リクエストへ設定します。

ASR API で音声を認識する

Nemotron ASR Streaming では、録音済みの音声ファイルを小さなチャンクに分けてストリーミング API へ送り、リアルタイム入力を模擬して認識できます。以下の手順では、NIM に同梱されているサンプル スクリプトとサンプル日本語音声を使用します。

このサンプル音声をストリーミング gRPC API に送り、認識結果を表示します。--simulate-realtime は、音声の長さに合わせてチャンクを送信してリアルタイム入力を模擬します。Linux 上の Docker ホストを host.docker.internal で参照できるように host-gateway を設定します。なおファイアウォールの設定によっては host.docker.internal を使用できない場合があります。その場合は Docker 用のネットワークを作成してください。また以降の手順でもネットワーク設定の編集が必要になる場合があります。

docker run --rm \
  --add-host host.docker.internal:host-gateway \
  --entrypoint python3 \
  "${ASR_NIM_IMAGE}" \
  /opt/riva/examples/transcribe_file.py \
  --server host.docker.internal:50052 \
  --input-file /opt/riva/wav/ja-JP_sample.wav \
  --language-code ja-JP \
  --automatic-punctuation \
  --simulate-realtime

音声認識結果の表記や句読点は完全に一致するとは限りません。「運動のため隣の駅まで歩きます。」に相当する日本語が表示されれば、ASR のストリーミング API が応答しています。

3. Nemotron 3 Nano を NIM でデプロイする

次に、音声認識結果から回答を生成する LLM として Nemotron 3 Nano を起動します。本記事ではモデル固有の NIM コンテナー nemotron-3-nano:2.0.8 と、1 GPU の FP8 プロファイルを使用します。

LLM NIM は OpenAI 互換 API を提供します。モデルデータを再利用できるように、先ほど作成した nim-cache/llm/opt/nim/.cache にマウントします。日本語 LLM を NVIDIA DGX Spark、NVIDIA Jetson Thor、NVIDIA RTX PRO 6000 Blackwell で動かす手順は、過去の記事「Nemotron-Nano-9B-v2-Japanese の推論チュートリアル」も参考になります。本記事は Nemotron 3 Nano を使用するため、以降の手順はそのまま実施してください。

export LLM_NIM_IMAGE="nvcr.io/nim/nvidia/nemotron-3-nano:2.0.8"

docker run --detach \
  --name nemotron-llm \
  --gpus all \
  --shm-size=16GB \
  --env NGC_API_KEY \
  --env NIM_MODEL_PROFILE="vllm-fp8-tp1-pp1-34.0" \
  --env NIM_SERVER_PORT=8000 \
  --env NIM_MAX_MODEL_LEN=32768 \
  --env NIM_PASSTHROUGH_ARGS="--gpu-memory-utilization 0.6 --enable-auto-tool-choice --tool-call-parser qwen3_coder --reasoning-parser nemotron_v3 --max-num-seqs 256" \
  --publish 8000:8000 \
  --mount type=bind,source="${PWD}/nim-cache/llm",target=/opt/nim/.cache \
  "${LLM_NIM_IMAGE}"

--gpu-memory-utilization 0.6 は、KV キャッシュの割り当て計算に使用する GPU メモリ比率を設定します。NIM_MAX_MODEL_LEN=32768 は最大コンテキスト長、--max-num-seqs 256 は vLLM が同時に処理するシーケンス数の上限です。これらは、Nemotron Voice Agent Blueprint の workstation 用 Nemotron 3 Nano と同じ設定であり、本記事の検証環境でもこの値を使用しました。ワークロードや GPU 構成が異なる場合は、メモリ使用量と必要なコンテキスト長、同時接続数に合わせた検証が必要です。

NIM_PASSTHROUGH_ARGS は、NIM から推論バックエンドの vLLM へ追加引数を渡します。--enable-auto-tool-choice--tool-call-parser qwen3_coder は OpenAI 互換の自動ツール選択を、--reasoning-parser nemotron_v3 は Nemotron 3 の reasoning 部分と最終回答を分離するパーサーを有効にします。本記事内ではツールを定義していませんが、Nemotron Voice Agent Blueprint 設定との差を増やさないため、同じ引数を使用しています。

初回起動時はモデルのダウンロードとロードに時間がかかります。ログを確認しながら、Readiness API が応答するまで待ちます。

docker logs --follow nemotron-llm

初期化の進行を確認したら、Ctrl+C でログの追跡だけを終了します。コンテナーはバックグラウンドで動作し続けます。

curl --fail http://localhost:8000/v1/health/ready

ASR と同様に、レスポンスの statusready になれば推論リクエストを受け付けられます。検証環境では、コンテナーイメージのダウンロード、モデルのダウンロード、ロードおよび自動チューニングを含む初回起動に約 10 分かかり、約 31 GB のファイルが nim-cache/llm に保存されました。2 回目以降はキャッシュが再利用されます。所要時間はネットワークと GPU によって異なります。

LLM API で回答を生成する

Nemotron 3 Nano の OpenAI 互換 HTTP API に、日本語の質問を送ります。Voice Agent の設定と同様に、回答の確認に不要な reasoning を出力しないよう enable_thinking を無効にします。

curl --fail-with-body --silent --show-error \
  http://localhost:8000/v1/chat/completions \
  --header 'Content-Type: application/json' \
  --data-binary @- <<'JSON'
{
  "model": "nvidia/nemotron-3-nano",
  "messages": [
    {
      "role": "user",
      "content": "日本の首都はどこですか"
    }
  ],
  "max_tokens": 128,
  "chat_template_kwargs": {
    "enable_thinking": false
  }
}
JSON

回答内容は生成ごとに異なりますが、レスポンスの choices[0].message.content に「東京」を含む日本語の回答があれば、LLM の推論 API が応答しています。

4. Magpie TTS Multilingual を NIM でデプロイする

Magpie TTS Multilingual (26.05.0) は、日本語を含む複数言語に対応した音声合成モデルです。オフライン合成に加え、音声を生成しながら返すストリーミング合成も利用できます。

使用するコンテナーとモデル プロファイルを設定します。batch_size=8 は約 11 GB の GPU メモリを使用する最小の標準プロファイルです。

export TTS_NIM_IMAGE="nvcr.io/nim/nvidia/magpie-tts-multilingual:1.8.0"
export TTS_NIM_TAGS_SELECTOR="name=magpie-tts-multilingual,batch_size=8"

最適化済みモデルをエクスポートする

ASR と同様に、事前ビルド済みエンジンを利用しない場合は、最初に次のコマンドを実行します。最適化済みモデルを nim-export/tts に保存します。この処理には時間がかかります。

docker run --rm \
  --gpus all \
  --shm-size=16GB \
  --env NGC_API_KEY \
  --env NIM_TAGS_SELECTOR="${TTS_NIM_TAGS_SELECTOR}" \
  --env NIM_EXPORT_PATH=/opt/nim/export \
  --env TRITON_TIMEOUT_SEC=1800 \
  --mount type=bind,source="${PWD}/nim-export/tts",target=/opt/nim/export \
  "${TTS_NIM_IMAGE}"

ログに Models exported to /opt/nim/export と表示され、コンテナーが終了すれば準備完了です。検証環境では、コンテナーイメージのダウンロードを含む初回実行に約 20 分かかり、約 3.9 GB のファイルが nim-export/tts に保存されました。所要時間はネットワークと GPU によって異なります。

TTS NIM を起動する

エクスポートしたモデルを使用して TTS NIM を起動します。

docker run --detach \
  --name magpie-tts \
  --gpus all \
  --shm-size=16GB \
  --env NGC_API_KEY \
  --env NIM_TAGS_SELECTOR="${TTS_NIM_TAGS_SELECTOR}" \
  --env NIM_DISABLE_MODEL_DOWNLOAD=true \
  --env NIM_EXPORT_PATH=/opt/nim/export \
  --env NIM_HTTP_API_PORT=9000 \
  --env NIM_GRPC_API_PORT=50051 \
  --publish 9000:9000 \
  --publish 50051:50051 \
  --mount type=bind,source="${PWD}/nim-export/tts",target=/opt/nim/export \
  "${TTS_NIM_IMAGE}"

準備が完了するまでログを確認します。

docker logs --follow magpie-tts

初期化の進行を確認したら、Ctrl+C でログの追跡だけを終了します。コンテナーはバックグラウンドで動作し続けます。

curl --fail http://localhost:9000/v1/health/ready

ASR や LLM と同様に、レスポンスの statusready になれば TTS NIM は推論リクエストを受け付けられます。

利用可能な話者は API から確認できます。

curl --silent --show-error \
  http://localhost:9000/v1/audio/list_voices

検証では、API が返した日本語話者から Magpie-Multilingual.JA-JP.Siwei を使用しました。

TTS API で音声を合成する

TTS のオフライン HTTP API で「日本の首都はどこですか」という音声を生成し、api-test-question-ja.wav に保存します。

curl --fail-with-body --silent --show-error \
  http://localhost:9000/v1/audio/synthesize \
  --form language=ja-JP \
  --form text=日本の首都はどこですか \
  --form voice=Magpie-Multilingual.JA-JP.Siwei \
  --output api-test-question-ja.wav

現在の nemotron-voice-chat ディレクトリに、WAV ファイルが作成されていることを確認します。何も出力がなければ無事生成されています。

test -s api-test-question-ja.wav

5. Nemotron Voice Agent で 3 つの NIM を接続する

ここまでで、3 つの NIM がそれぞれ次のホスト側ポートで動作しています。

NIMプロトコルエンドポイント用途
Nemotron ASR StreaminggRPClocalhost:50052音声からテキストへのストリーミング変換
Nemotron 3 NanoHTTPhttp://localhost:8000/v1OpenAI 互換 API による回答生成
Magpie TTS MultilingualgRPClocalhost:50051テキストから音声へのストリーミング変換

Nemotron Voice Agent Blueprint を取得する

検証で使用した v2.0.0 を取得します。バージョンを固定することで、将来 Nemotron Voice Agent Blueprint が更新されても本記事と同じ構成を再現できます。

git clone --branch v2.0.0 \
  https://github.com/NVIDIA-AI-Blueprints/nemotron-voice-agent.git
cd nemotron-voice-agent
cp .env.example .env
chmod 600 .env

外部 NIM を使用する構成に変更する

Nemotron Voice Agent Blueprint の 3 ファイルを変更して NIM の接続先と日本語の既定値を設定し、Voice Agent アプリケーションだけを起動します。

必須の変更対象は 3 ファイルです。次のコマンドを、clone した nemotron-voice-agent ディレクトリで実行します。

まず .env に API キー、HTTPS、WebSocket、音声出力バッファを設定します。

printf 'NVIDIA_API_KEY=%s\n' "${NGC_API_KEY}" |
  sed --in-place \
    --expression 's|^# PIPELINE_TLS=true$|PIPELINE_TLS=true|' \
    --expression 's|^# AUDIO_OUT_10MS_CHUNKS=10$|AUDIO_OUT_10MS_CHUNKS=10|' \
    --expression '/^NVIDIA_API_KEY=/ {' \
    --expression 'r /dev/stdin' \
    --expression 'd' \
    --expression '}' \
    .env

printf '\nTRANSPORT_SELECTION=websocket\n' >> .env

ブラウザーと Voice Agent 間は簡単に試せる WebSocket を使用します。本番用途では、ネットワーク状態に応じて再生を調整できる WebRTC も検討してください。

AUDIO_OUT_10MS_CHUNKS は、1 回の送信にまとめる 10 ms 音声フレームの数です。本記事では WebSocket の標準値 10 (100 ms) を使用します。高い同時接続数では 10-40 が調整範囲として案内されていますが、値を大きくすると再生開始と割り込みへの応答が遅くなります(Nemotron Voice Agent v2.0.0: Tune Pipeline Performance)。

次に src/examples/multilingual/services.local.yamlworkstation セクションで、3 つのサービスをホスト上の NIM に向け、日本語のボイスを選択します。

sed --in-place '/^workstation:/,/^dgxspark:/ {
  s|base_url: "http://nvidia-llm:8000/v1"|base_url: "http://host.docker.internal:8000/v1"|
  s|server: "tts-service:50051"|server: "host.docker.internal:50051"|
  s|voice_id: "Magpie-Multilingual.EN-US.Aria"|voice_id: "Magpie-Multilingual.JA-JP.Siwei"|
  s|server: "nemotron-asr-streaming-multilingual:50052"|server: "host.docker.internal:50052"|
}' src/examples/multilingual/services.local.yaml

Voice Agent 自身はコンテナー内で動作するため、ここでは localhost ではなく、Docker ホストを表す host.docker.internal を使用します。

この変更により、ローカルの magpie-tts サービスで使用する既定の話者は Siwei になります。

最後に examples_registry.yamlmultilingual-assistant の既定値を日本語と Nemotron 3 Nano に変更します。

sed --in-place '/^  multilingual-assistant:/,/^  omni-assistant:/ {
  s|default_session_language: de-DE|default_session_language: ja-JP|
  s|llm: \[nemotron-super\]|llm: [nemotron-nano]|
}' examples_registry.yaml

変更結果が意図した設定になっていることを確認します。

sed --quiet --regexp-extended \
  's/^NVIDIA_API_KEY=nvapi-[[:alnum:]_-]{20,}$/NVIDIA_API_KEY=set/p' \
  .env

grep --extended-regexp \
  '^(PIPELINE_TLS|TRANSPORT_SELECTION|AUDIO_OUT_10MS_CHUNKS)=' \
  .env

grep --extended-regexp \
  'host\.docker\.internal|voice_id: "Magpie-Multilingual\.JA-JP\.Siwei"' \
  src/examples/multilingual/services.local.yaml

sed --quiet '/^  multilingual-assistant:/,/^  omni-assistant:/p' \
  examples_registry.yaml | \
  grep --extended-regexp \
    'default_session_language: ja-JP|llm: \[nemotron-nano\]'

想定される出力は次のとおりです。

NVIDIA_API_KEY=set
PIPELINE_TLS=true
AUDIO_OUT_10MS_CHUNKS=10
TRANSPORT_SELECTION=websocket
      base_url: "http://host.docker.internal:8000/v1"
      server: "host.docker.internal:50051"
      voice_id: "Magpie-Multilingual.JA-JP.Siwei"
      server: "host.docker.internal:50052"
      default_session_language: ja-JP
      llm: [nemotron-nano]

API キーの値そのものは表示しません。先頭に NVIDIA_API_KEY=set が表示されない場合は、事前準備で NGC_API_KEY を設定したターミナルからやり直してください。

Voice Agent のみを起動する

Voice Agent サービスだけを起動します。

docker compose \
  --file docker-compose.yml \
  up --detach --no-deps multilingual-assistant-workstation

Voice Agent の状態を確認します。

docker compose --file docker-compose.yml ps
docker compose --file docker-compose.yml logs --follow \
  multilingual-assistant-workstation

初回は Voice Agent のコンテナー イメージのビルドに時間がかかる場合があります。ログに起動完了が表示されたら Ctrl+C でログの追跡を終了し、ps の状態が healthy になることを確認します。続けて HTTPS の Deployment API から、起動中の Voice Agent と既定のセッション言語を確認します。

curl --fail --silent --show-error --insecure \
  https://localhost:7860/api/deployment |
  grep --only-matching --extended-regexp \
    '"(id|default_session_language)":"[^"]+"' |
  sed --quiet '1,2p'

次のように multilingual-assistantja-JP が表示されれば、Voice Agent の API は応答しています。

"id":"multilingual-assistant"
"default_session_language":"ja-JP"

確認できたら、ブラウザーで次の URL を開きます。

https://localhost:7860

別のコンピューターから接続する場合は、localhost を Voice Agent を実行しているホストの IP アドレスまたはホスト名に置き換えます。デモ用の自己署名証明書に対するブラウザーの警告を確認して一時的に許可した後、Connect をクリックし、ブラウザーのマイク利用を許可してください。なお自己署名証明書を利用者へ恒常的に受け入れさせる構成は本番用途には適しません。

モデル間の通信

ユーザーが話し始めると、Voice Agent は次の順序で各 NIM を呼び出します。

  1. ブラウザーがマイク音声を WebSocket で Voice Agent に送信します。
  2. Voice Agent が音声チャンクを ASR の gRPC API に転送します。
  3. ASR の途中結果は画面表示に利用され、確定したテキストは LLM に送られます。
  4. LLM のストリーミング出力を Voice Agent が文単位で処理します。
  5. 確定した文を TTS のストリーミング gRPC API に送り、生成された音声チャンクをブラウザーに返します。

この処理は逐次的にすべての生成を待つのではなく、各段階でストリーミングされます。ユーザーの発話中に ASR の途中結果を受け取り、LLM の回答全体が完成する前に TTS を開始することで、会話の待ち時間を短縮しています。

固有名詞や専門用語の認識を調整する場合は、ASR NIM の word boosting (26.05.0) を利用できます。Voice Agent への組み込みには追加の変更が必要になるため、本記事のデプロイ手順には含めませんが、実用上は有効なアプローチです。

停止する

Voice Agent を停止します。

docker compose --file docker-compose.yml down

手動で起動した 3 つの NIM も停止する場合は、次のコマンドを実行します。

docker stop nemotron-asr nemotron-llm magpie-tts

停止したコンテナーを同じ設定で再開する場合は、まず以下のコマンドで 3 つの NIM を起動し、それぞれの Readiness API が ready を返すことを再確認します。docker start は既存コンテナーに保存された作成時の設定を使用するため、シェルの環境変数を再設定する必要はありません。

docker start nemotron-asr nemotron-llm magpie-tts

続いて、nemotron-voice-chat/nemotron-voice-agent ディレクトリで Voice Agent を再作成します。

docker compose \
  --file docker-compose.yml \
  up --detach --no-deps multilingual-assistant-workstation

コンテナーを削除しても、bind mount した nim-export/nim-cache/ のモデルはホスト側に残ります。ただし、NIM コンテナーを削除した後に再作成する場合は、別のシェルセッションでは失われている次の環境変数を設定し直してから、各節の docker run コマンドを実行してください。

  • 共通: NGC_API_KEY
  • ASR: ASR_NIM_IMAGE / ASR_NIM_TAGS_SELECTOR
  • LLM: LLM_NIM_IMAGE
  • TTS: TTS_NIM_IMAGE / TTS_NIM_TAGS_SELECTOR

まとめ

本記事では、日本語に対応した Nemotron ASR Streaming Multilingual、Nemotron 3 Nano、Magpie TTS Multilingual を、それぞれ独立した NVIDIA NIM としてデプロイしました。さらに Nemotron Voice Agent Blueprint の接続先だけを最小限変更し、3 つの NIM を組み合わせた日本語音声 AI エージェントを構築しました。Nemotron Voice Agent を活用し、ぜひ様々な音声アプリケーションを開発してください。

Tags