あなたの言語・ドメイン、またはアクセント向けに Nemotron 3.5 ASR をファインチューニングする方法
NVIDIA は Hugging Face Blog で、Nemotron 3.5 ASR モデルを特定の言語やドメイン、アクセントに微調整(Fine-Tuning)するための具体的なガイドラインと手順を公開した。
キーポイント
Nemotron 3.5 ASR の汎用性と限界
大規模な事前学習済みモデルは強力だが、特定の業界用語や複雑なアクセントには対応が不十分な場合があり、微調整の必要性が生じる。
ドメイン特化型データセットの構築方法
医療、法務、あるいは特定の方言など、ターゲットとする領域に合わせた高品質な音声・テキストペアデータの収集と前処理の重要性を解説している。
効率的な微調整(Fine-Tuning)手法
LoRA や QLoRA などのパラメータ効率化技術を活用し、限られた計算リソースでモデル性能を最適化する具体的なトレーニング設定を示している。
評価指標とベンチマークの重要性
微調整後のモデルが実際に目標とする言語やアクセントで精度向上を果たしたかを検証するための、適切な評価基準の設定方法を提示している。
単一チェックポイントによる柔軟な運用
1つのモデルチェックポイントで80msから1.12秒までの遅延と精度のトレードオフを推論時に切り替えることができ、再学習は不要です。
低リソース言語への効果的な微調整
事前トレーニングデータが少ない言語や専門用語、特定のアクセントに対して、数時間のドメイン固有データで微調整を行うことで大幅な精度向上が期待できます。
簡潔な5ステップの微調整ワークフロー
ターゲット言語のデータをtarred形式で準備し、キャッシュ対応FastConformer-RNTレシピでベースモデルから微調整・評価・展開を行う標準的な手順が提供されています。
重要な引用
Fine-tuning Nemotron 3.5 ASR allows you to adapt the model to your specific language, domain, or accent.
Domain-specific data is crucial for improving performance in specialized fields like healthcare or legal transcription.
Using parameter-efficient fine-tuning techniques like LoRA can significantly reduce computational costs.
The same checkpoint covers the whole spectrum — you choose the operating point at inference time, no retraining required.
A few hours of in-domain audio plus the right recipe closes a surprising amount of it.
"Fine-tuning is transformative for under-resourced languages — the biggest wins came where the base model was weakest."
影響分析・編集コメントを表示
影響分析
この記事は、NVIDIA の高性能 ASR モデルを汎用的なツールから、実務で即戦力となるカスタムソリューションへと転換させるための具体的な道筋を示した点で重要です。特に、計算リソースの制約がある現場でも LoRA などの手法を用いて効率的にモデルを最適化できることを示すことで、ASR 技術の実装ハードルを下げ、業界特化型の音声認識サービスの普及を加速させる可能性があります。
編集コメント
汎用モデルの限界を補完し、実社会での活用範囲を広げるための「微調整」の実践ガイドとして非常に価値が高い記事です。特にリソース制約のある開発者にとって、LoRA を活用した効率的なアプローチは即座に適用可能な知見と言えます。
Nemotron 3.5 ASR(自動音声認識)を、特定の言語やドメイン、アクセントに合わせてファインチューニングする方法について解説します。
まず、目的のデータセットを準備してください。これは、対象とする言語やドメイン、アクセントに特化した、高品質な音声と対応するテキストのペアで構成されるべきです。データ量は多いほどモデルの性能向上が期待できますが、質も極めて重要です。ノイズの少ない、正確な転写が行われたデータを選びましょう。
次に、適切な事前学習済みモデルを選択します。Nemotron 3.5 ASR は多言語対応を前提としていますが、特定のドメインやアクセントに特化させるためには、元の汎用モデルからファインチューニングを行うのが一般的です。Hugging Face のモデルカードやドキュメントを確認し、最適なベースモデルを選びましょう。
ファインチューニングの実行には、PyTorch や Hugging Face Transformers などのライブラリを活用します。学習率、バッチサイズ、エポック数などのハイパーパラメータを調整し、過学習を防ぎつつ目標とする性能に到達させるよう注意深く設定してください。特に、ドメイン固有の用語や発音パターンが反映されるように、データの前処理とモデルのアーキテクチャを見直すことが重要です。
最後に、評価指標を用いてファインチューニング後のモデルを厳密に検証します。Word Error Rate (WER) や Character Error Rate (CER) などの標準的な指標に加え、対象ドメインやアクセントにおける実際の使用ケースでの性能も確認してください。必要に応じて、さらにデータを増やすか、ハイパーパラメータを再調整して最適化を図りましょう。
このように体系的なアプローチでファインチューニングを行うことで、Nemotron 3.5 ASR をあなたの特定の言語、ドメイン、アクセントに最適化し、高精度な音声認識を実現できます。
NVIDIA Nemotron 3.5 ASR(https://huggingface.co/nvidia/nemotron-3.5-asr-streaming-0.6b)をご紹介します。これは、ストリーミング対応の多言語音声認識モデルで、単一のチェックポイントから40 の言語ローカルの音声をリアルタイムで文字起こしでき、句読点と大文字化も内蔵されています。これは今年早些に Hugging Face(https://huggingface.co/nvidia/nemotron-speech-streaming-en-0.6b)および NIM として(https://build.nvidia.com/nvidia/nemotron-asr-streaming/modelcard)リリースされた、人気のある Nemotron 3 ASR モデル(英語のみ対応)の後継モデルです。リリース以来、Nemotron 3 ASR は Artificial Analysis による独立ベンチマークで検証され、ストリーミング音声認識モデル全体の中で遅延が 2 位にランクインしています(https://artificialanalysis.ai/speech-to-text/streaming)。これは、音声終了から最終文字起こしまでの時間がわずか 0.07 秒であることを意味します。また、AA-WER ストリーミングインデックス対最終文字起こしまでの時間のリーダーボードでは「最も魅力的な四半区画」に位置しており、精度と遅延のトレードオフを総合的に評価したモデルの中で最高峰の一つとなっています。このモデルは、キャッシュ対応型 FastConformer-RNT 構造(Cache-Aware FastConformer-RNNT)を採用しており、多くのストリーミング音声認識で遅延の原因となる冗長な再計算を行わずに音声をストリーミング処理します。その結果、低遅延と高精度を両立し、どちらかを犠牲にする必要がありません。Nemotron 3.5 ASR は Hugging Face でオープンウェイトとして提供されており、API の依存や呼び出しごとの課金なしで、モデルの検証、ファインチューニング、デプロイが可能です。データがあなたのインフラストラクチャから外部に流出することは、あなたが選択しない限りありません。また、強力なベースモデルであるため、独自の言語、ドメイン、またはアクセントに合わせてファインチューニングすることが可能です。本記事の後半では、その具体的な手順を解説します。
今日における多言語音声認識の問題点
もし、音声の文字起こしを必要とする製品を構築した経験があれば、おそらく以下のいずれかの壁にぶつかったことがあるでしょう:
- 多言語対応のコスト。複数の言語をサポートしたい場合、40 種類もの異なるモデル、あるいは 40 種類ものベンダー API を無理やり組み合わせることになります。それぞれが独自の癖、レイテンシプロファイル、請求体系を持っています。その結果、インフラストラクチャは個別の統合事例を展示した博物館のような状態になってしまいます。
- ストリーミング処理と精度のトレードオフ。リアルタイム字幕には低遅延が必要ですが、多くの「ストリーミング」ASR システムは、オーディオの重複するウィンドウを何度も再処理することでこれを偽装しています。これにより計算リソースが浪費され、遅延も増加します。遅延を下げてしまうと、精度は崖から転げ落ちるほど急激に低下してしまいます。
- 後処理パイプライン。ASR の生出力は、句読点もなく小文字で埋め尽くされたテキストの壁であることがよくあります。そこで句読点と大文字化のために第 2 のモデルを追加し、さらに動き回る部品が増えることになります。
- 「既知の言語」という前提。多くのシステムでは、事前に言語を指定する必要があります。しかし、通話者が文脈の中で英語とスペイン語を行き来するカスタマーサポートラインの場合、どうすればよいのでしょうか?
Nemotron 3.5 ASR は、これら 4 つの問題をすべて単一のモデルに統合するために構築されました。
その機能
1 つのモデル、40 の言語ローカル。 単一の 600M パラメータチェックポイントは、英語(US/GB)、スペイン語(US/ES)、ドイツ語、フランス語(FR/CA)、イタリア語、アラビア語、日本語、韓国語、ポルトガル語(BR/PT)、ロシア語、ヒンディー語、トルコ語、ベトナム語、オランダ語、ウクライナ語、ポーランド語、フィンランド語、中国語(標準語)、チェコ語、ブルガリア語、スロバキア語、スウェーデン語、クロアチア語、ルーマニア語、エストニア語、デンマーク語、ハンガリー語、ノルウェー語ブークモール、ノルウェー語ニーノシュク、ヘブライ語、ギリシャ語、リトアニア語、ラトビア語、マルタ語、スロベニア語、タイ語を転写します。言語ごとのデプロイメントは不要で、モデルの切り替えも不要です。
リアルタイムストリーミング、正しく実現。 このモデルは キャッシュ対応型ファストコンフォーマー(Cache-Aware FastConformer)エンコーダー を基盤に構築されています。従来の「バッファリング」方式のストリーミングでは、各ステップでオーディオの重複するチャンクを再処理し、同じ作業を何度も繰り返すことになります。一方、このモデルは エンコーダーの内部状態をキャッシュ(記憶領域)して再利用 します。すべてのオーディオフレームが正確に一度だけ処理され、重複はありません。その結果、計算量とエンドツーエンドのレイテンシが劇的に低下し、精度の低下もありません。
句読点と大文字化、ネイティブ対応。 出力は、適切な大文字小文字、カンマ、ピリオド、疑問符を含む、そのままプロダクションで使えるテキストです。モデルから直接出力されます。句読点を復元する別のステップは不要です。
言語条件付け、お好みの方式を。 2 つの方式で実行できます:
- 入力言語がわかる場合(例:target_lang=en-US)、モデルに指定してください。通常、これが最も高い精度を得られる方法です。
- 入力言語がわからない場合(例:target_lang=auto)、モデルに検出させます。モデルが言語を自動検出し、それに応じて転写を行います。
仕組み(2 分間で解説)
このモデルには主に 2 つの構成要素があります。
- キャッシュ対応型 FastConformer エンコーダー(24 レイヤー)。FastConformer は、線形スケーラブルなアテンションを備えた Conformer アーキテクチャの効率的な進化版です。「キャッシュ対応」という部分はストリーミングのための魔法であり、エンコーダーは過去のフレームからの自己アテンションおよび畳み込み活性化値をキャッシュに保持します。新しいオーディオが入力されると、実際に新しい部分のみを計算し、再計算されることはありません。
- RNNT(Recurrent Neural Network Transducer)デコーダー。RNNT はストリーミング ASR における中核的なデコーダーであり、オーディオストリームがフレーム単位で入力されるにつれてテキストを逐次生成します。これはライブ文字起こしにおいてまさに必要な機能です。
これらの上に、プロンプトベースの言語 ID 条件付けを追加しています。オーディオと同時に言語信号を入力することで、1 つの重みセットが対象言語に特化した出力を行うことができます。あるいは自動モードでは、モデル自身が言語を推論します。
このモデルは、句読点付きで適切に大文字化されたテキストに正規化された、パブリックデータと独自データを組み合わせた膨大な音声データを用いて訓練されており、対応するすべての言語をカバーしています。
知っておくべき重要なパラメータ:att_context_size
ストリーミング ASR は本質的に、「いつテキストを出力するか」という点と、「コミットする前にモデルがどの程度の未来のオーディオを参照できるか」という点とのトレードオフです。Nemotron ASR では、このバランスをアテンションコンテキストサイズを通じて直接的に調整できます。
アテンションコンテキスト
チャンクサイズ(レイテンシ)
ユースケース
[56, 0]
80ms(超低遅延)
超低遅延音声エージェント
[56, 1]
160ms (低遅延)
インタラクティブ音声エージェント、会話型 AI
[56, 3]
320ms (バランス型)
会話型 AI、ライブキャプション
[56, 6]
560ms (中程度)
合理的なレイテンシで高い精度を実現
[56, 13]
1.12s (高遅延)
最高精度だが、レイテンシは高い
同じチェックポイントがすべてのモードをカバーしています。推論時に動作点を選択するだけで、再学習は不要です。
数分で試す
このモデルは NeMo チェックポイントとして提供されます。NeMo のブランチをクローンし、ストリーミング推論スクリプトで対象のオーディオファイルを指定してください:
git clone https://github.com/NVIDIA-NeMo/NeMo.git
既知の言語で文字起こしする場合:
python ${NEMO_ROOT}/examples/asr/asr_cache_aware_streaming/speech_to_text_cache_aware_streaming_infer.py \
model_path=${MODEL_PATH} \
dataset_manifest=${MANIFEST_PATH} \
output_path=${OUTPUT_FOLDER} \
target_lang=es-ES \
att_context_size="[56,3]" \
strip_lang_tags=true
または、モデルに言語を自動検出させる場合:
python ${NEMO_ROOT}/examples/asr/asr_cache_aware_streaming/speech_to_text_cache_aware_streaming_infer.py \
model_path=${MODEL_PATH} \
dataset_manifest=${MANIFEST_PATH} \
output_path=${OUTPUT_FOLDER} \
target_lang=auto \
att_context_size="[56,3]" \
strip_lang_tags=true
オーディオファイルはモノラル形式の .wav である必要があります。マニフェストは標準的な NeMo の JSON-lines ファイルです:
{"audio_filepath": "/path/to/clip.wav", "duration": 4.27, "text": "reference transcript"}
モデルは各完了した文の末尾に自動的に language_tag を予測します。つまり、「This is a test sample. <en-US>」という形式です。「strip_lang_tags=True」と設定すると、可読性を高めるために言語タグ <xx-XX> が削除されます。
詳細解説:あなたの言語向け Nemotron ASR のファインチューニング
Nemotron 3.5 ASR はそのままでも強力ですが、これは一部の言語には圧倒的に多くのデータが含まれる一方で、他の言語は少ないという混合データセットで訓練されたものです。ロングテール(少数派)のローカルエリアには改善の余地があり、ドメイン固有のオーディオを数時間と適切なレシピ組み合わせることで、驚くほど大きな性能向上が期待できます。
これを具体的に示すため、ベースモデルを用いて中リソースの欧州言語 2 つであるギリシャ語とブルガリア語に対してファインチューニングを行い、保持されたデータ(学習に使用していないデータ)で正直に評価するワークド・エクサンプルを実行しました。以下の結果は、その実行からのものです。このセクションは高レベルな概要であり、コード例はコンパニオンの GitHub リポジトリ にあります。プロセス全体をカバーする agentic SKILL.md を公開した際、本ブログはそれに応じて更新されます。
なぜファインチューニングするのか?
効果が発揮されるいくつかの状況:
- ロングテールのローカルエリアの性能向上。事前学習データが少ない言語ほど、最も大きな恩恵を受けられます。
- ドメイン固有の専門知識や専門用語。医療、法律、金融、あるいは技術分野の用語など、ベースモデルがほとんど遭遇したことのない語彙です。
- アクセント、方言、および音響特性。電話回線、遠距離マイク、車内、または特定の話し手集団向けなど。
- 新言語。まだカバーされていないローカルエリアをブートストラップする場合。
微調整の威力を予感させる
🎥 ビデオウォークスルー: YouTube で視聴
このウォークスルーでは、多言語ストリーミング推論、レイテンシと精度のトレードオフ、デプロイメントオプション、および以下で説明する微調整ワークフローを実演します。
レシピの概要
全体の流れは 5 つの手順です:
- ターゲット言語用の圧縮された音声データにトレーナーを指し示す — ファイルごとの展開は不要で、NeMo/Lhotse によって効率的にストリーミングされます。
- 基本チェックポイント(init_from_nemo_model)から、各クリップの言語タグに基づいて条件付けられた、同じ Cache-Aware FastConformer-RNT レシピを使用して微調整を行います。
- モデルが一度も見たことのない保持セットで評価を行う — デプロイする際と同じ低レイテンシストリーミング設定(例:att_context_size=[56,0]、80ms チャンク;0ms 先読み)で行います。
- 言語性能が弱い領域ではデータを追加して再学習します。
- 微調整済みのチェックポイントをエクスポートし、デプロイします。
ステップ 1 — データ
私たちは、公開されている多言語コーパス(Granary、Common Voice、FLEURS)から、2 つの言語(ギリシャ語とブルガリア語)にわたるバランスの取れた約 2000 時間のミックスを構築し、圧縮された NeMo/Lhotse シャードとして保持しました。最も重要な 2 つの詳細は以下の通りです:
- すべてのクリップには target_lang タグが付与されています — これがモデルのプロンプトベース言語条件付けを駆動するものであり、タグを正しく取得し(かつモデルが認識できる値を使用すること)が不可欠です。
- ベースモデルのテキストスタイル(句読点付き、適切な大文字小文字の使用された転写テキスト)に合わせる必要があります。これはモデルが生成する形式そのものです。
学習データに含まれていない保持された FLEURS テスト分割(Held-out FLEURS test splits)により、言語ごとに現実世界での正直なベンチマークが得られました。
ステップ 2 — 訓練
固定ステップ予算(ストリーミング/反復可能データとのスケジューリングにおける正しい方法)によって駆動される、ストリーミング RNNT モデルの straightforward なフルファインチューニングです。これは単一 GPU でクイックパスを実行し、より完全な実行にはマルチ GPU へクリーンにスケーリングできます。このような小規模データセットでは、1 エポックは数時間ではなく数分で完了します。
ステップ 3 — 評価
保持された FLEURS テストセット上で Word Error Rate (WER) を測定しました。80ms チャンクでのストリーミングモード、つまり未来の音声データを「覗き見」できない最も厳しい条件下です。ベースモデルからの改善は大きく、特に当初エラー率が最も高かった言語で顕著でした:
言語
ベースモデル
ファインチューン済み
WER の相対的改善率
🇬🇷 ギリシャ語
35
24
32%
🇧🇬 ブルガリア語
22
15
31%
*保持された FLEURS テストセットにおける生 WER(%)、最低レイテンシのストリーミング。ベースモデルとファインチューン済みモデルの両方で同一の評価を実施。
ベースモデルでエラー率が高かった言語は、短いファインチューニングの後、実際に有用なものとなりました。ブルガリア語のエラー率は半減以上になっています。
ステップ 4 — 効果的なデータのスケーリング*
より多くのデータがどこまで効果をもたらすかをテストするため、Granary Dataset の一部である MOSEL/VoxPopuli から約 2,000 時間の追加の議会スピーチデータを混合し、トレーニングプールを約 290 時間から約 2,300 時間に拡大しました。このより長い学習プロセスの途中でも、最も弱い言語のパフォーマンスがさらに向上し(例えばブルガリア語が高々 20 台後半に達するなど)、明白な要因を確認できました:母国語データの増加は常に有益であるということです。ただし、言語やドメインによる効果の偏りは大きいため、推測するのではなく測定することが重要です。
ステップ 5 — デプロイ
微調整(fine-tuning)されたモデルはベースモデルと同じアーキテクチャを採用しているため、そのまま同じサービングパスに導入できます。推論時におけるレイテンシと精度の最適なバランス点は、att_context_size パラメータを介して Part 1 と同様に選択可能です。
私たちが学んだこと
- 微調整は、リソースが不足している言語において劇的な変化をもたらします。最大の効果は、ベースモデルのパフォーマンスが最も低かった領域で得られました。
- デプロイ時のレイテンシ条件下で、未使用のデータ(held-out data)を用いて評価を行ってください。トレーニングセットでのスコアは楽観的になりがちですが、0 ミリ秒の先読み(look-ahead)を前提とした独立したテストセットこそが真実を語ります。
- 言語タグを正しく設定してください。プロンプトによる条件付けは強力ですが、言語ラベルの不一致には容赦がありません。
- 他の言語も保護してください。多言語モデルの専門化を行う際は、モデル内の他の言語の一部("replay")を混合して再評価し、対象とする地域・言語の精度を高める一方で、他の言語のパフォーマンスが低下しないように注意してください。
- より多くのデータが役立ちますが、その効果は均一ではありません。時間を追加することでほとんどの言語の性能が確実に向上しましたが、ある言語では頭打ちとなりました。これは、データの純粋な量だけでなく、ドメインの一致も同様に重要であることを示しています。
📦 完全な手順(データ準備スクリプト、トレーニング設定、正確なコマンド、およびすべてのベンチマーク数値)は、コンパニオン GitHub リポジトリ に掲載されています。このセクションは概要であり、リポジトリが実際の構築プロセスとなります。
本番環境での提供については、今月下旬に予定されている NIM リリースにご注目ください。これにより gRPC ストリーミングが利用可能になり、NVIDIA Ampere、Hopper、Blackwell、Lovelace、Turing、Volta、および Jetson に対応します。
これを使って何ができるか
このモデルが可能にするいくつかのユースケースは以下の通りです:
- 1 秒未満の音声エージェント — ASR(自動音声認識)→ LLM → TTS のループにおいて、音声からテキストへの変換部分がボトルネック不再是なくなります。
- リアルタイム多言語会議キャプション — 一つのストリームで、異なる言語を話す参加者に対し、リアルタイムでキャプションを提供します。
- グローバル規模のコールセンター分析 — 言語ごとのベンダーが散在する代わりに、単一の ASR バックエンドを使用します。
- ライブ配信やイベント向けのリアルタイム字幕と翻訳。
- プライバシーが敏感な環境やオフライン環境向けに、Jetson 上でのオンデバイス文字起こし。
はじめに
単一のストリーミング ASR モデルで多言語音声アプリケーションの構築を始めたいですか?
🤗 Nemotron 3.5 ASR を試す:nvidia/nemotron-3.5-asr-streaming-0.6b
🧠 NVIDIA NeMo で実行およびファインチューニング:github.com/NVIDIA-NeMo/NeMo
📚 トレーニング例の探索:ファインチューニングノートブック
音声エージェントの構築、多言語字幕システムの開発、コンタクトセンター分析、またはオンデバイス音声アプリケーションの開発を問わず、Nemotron 3.5 ASR は、あなたのユースケースに合わせて展開、カスタマイズ、ファインチューニングが可能な単一の多言語モデルを提供します。
あなたが何を開発するかを見るのが楽しみです。ベンチマーク結果、ファインチューニングの結果、および言語適応については、モデルディスカッションページで共有してください:
💬 Model Discussions: https://huggingface.co/nvidia/nemotron-3.5-asr-streaming-0.6b/discussions
モデル: https://huggingface.co/nvidia/nemotron-3.5-asr-streaming-0.6b
ライセンス: OpenMDW-1.1
ランタイム: NeMo 26.06+
原文を表示
Introducing NVIDIA Nemotron 3.5 ASR, streaming multilingual: a 600M-parameter speech-to-text model that transcribes 40 language-locales from a single checkpoint, in real time, with punctuation and capitalization built in. It is the successor of the popular Nemotron 3 ASR model (English only) which was released on Hugging Face and as a NIM earlier this year. Since its release, Nemotron 3 ASR has been validated by independent benchmarks at Artificial Analysis, where it ranks 2nd in latency among all streaming ASR models— with just 0.07 seconds to final transcript after end of speech — and sits in the "most attractive quadrant" of the AA-WER Streaming Index vs. Time to Final Transcription leaderboard, placing it among the best models on the combined accuracy-latency tradeoff. The model uses a Cache-Aware FastConformer-RNNT architecture that streams audio without the redundant recomputation that makes most streaming ASR slow — so you get low latency *and* high accuracy, not one at the expense of the other. Nemotron 3.5 ASR ships as open weights on Hugging Face — you can inspect, fine-tune, and deploy it without API dependencies or per-call billing. No data leaves your infrastructure unless you choose. And because it's a strong base model, you can fine-tune it for your own language, domain, or accent. The second half of this post walks through exactly how.
The problem with multilingual speech recognition today
If you've ever built a product that needs to transcribe speech, you've probably hit one of these walls:
- The polyglot tax. You want to support multiple languages, so you stitch together 40 different models — or 40 different vendor APIs — each with its own quirks, latency profile, and billing. Your infrastructure becomes a museum of one-off integrations.
- The streaming-vs-accuracy tradeoff. Real-time captioning needs low latency, but most "streaming" ASR systems fake it by re-processing overlapping windows of audio over and over. That burns compute and adds delay. Turn down the latency and accuracy falls off a cliff.
- The post-processing pipeline. Raw ASR output is often an unpunctuated, lowercase wall of text. You bolt on a second model for punctuation and capitalization, adding yet another moving part.
- The "known language" assumption. Many systems require you to tell them the language up front. But what about a customer-support line where callers switch between English and Spanish mid-sentence?
Nemotron 3.5 ASR was built to collapse all four of those problems into one model.
What it does
One model, 40 language-locales. A single 600M-parameter checkpoint transcribes English (US/GB), Spanish (US/ES), German, French (FR/CA), Italian, Arabic, Japanese, Korean, Portuguese (BR/PT), Russian, Hindi, Turkish, Vietnamese, Dutch, Ukrainian, Polish, Finnish, Mandarin, Czech, Bulgarian, Slovak, Swedish, Croatian, Romanian, Estonian, Danish, Hungarian, Norwegian Bokmål, Norwegian Nynorsk, Hebrew, Greek, Lithuanian, Latvian, Maltese, Slovenian, and Thai. No per-language deployment, no model-swapping.
Real-time streaming, done right. The model is built on a Cache-Aware FastConformer encoder. Traditional "buffered" streaming re-processes overlapping chunks of audio at every step, doing the same work many times over. This model instead caches the encoder's internal state and reuses it — every audio frame is processed exactly once, with no overlap. The result is dramatically lower compute and end-to-end latency, with no accuracy penalty.
Punctuation and capitalization, natively. The output is production-ready text — proper casing, commas, periods, question marks — straight from the model. No separate punctuation-restoration step.
Language conditioning, your choice. You can run it two ways:
- Tell the model the input language (target_lang=en-US) when you know it — typically the best accuracy.
- Let the model detect the language (target_lang=auto) when you don't — the model detects the language and transcribes accordingly.
How it works (the 2-minute version)
The model has two main pieces:
- A Cache-Aware FastConformer encoder (24 layers). FastConformer is an efficient evolution of the Conformer architecture with linearly scalable attention. The "cache-aware" part is the streaming magic: the encoder keeps a cache of its self-attention and convolution activations from previous frames, so as new audio arrives it only computes what's genuinely new. Nothing is recomputed.
- An RNNT (Recurrent Neural Network Transducer) decoder. RNNT is the workhorse decoder for streaming ASR — it emits text as audio streams in, frame by frame, which is exactly what you want for live transcription.
On top of this, the model adds prompt-based language-ID conditioning: a language signal is fed alongside the audio, which lets one set of weights specialize its output to the target language — or, in auto mode, infer the language itself.
It was trained on a massive speech data spanning all supported languages, using a blend of public and proprietary data normalized to punctuated, properly-cased text.
A knob worth knowing: att_context_size
Streaming ASR is fundamentally a tradeoff between *how soon* you emit text and *how much future audio* the model gets to "peek at" before committing. Nemotron ASR exposes this directly through the attention context size:
Attention Context
Chunk Size (Latency)
Use Case
[56, 0]
80ms (Ultra-Low)
Ultra low latency Voice Agents
[56, 1]
160ms (Low)
Interactive Voice Agents, Conversational AI
[56, 3]
320ms (Balanced)
Conversational AI, Live caption
[56, 6]
560ms (Medium)
High accuracy with reasonable latency
[56, 13]
1.12s (High)
Highest accuracy with high latency
The same checkpoint covers the whole spectrum — you choose the operating point at inference time, no retraining required.
Try it in minutes
The model ships as a NeMo checkpoint. Clone the NeMo branch and point the streaming inference script at your audio:
git clone https://github.com/NVIDIA-NeMo/NeMo.git
Transcribe with a known language:
python ${NEMO_ROOT}/examples/asr/asr_cache_aware_streaming/speech_to_text_cache_aware_streaming_infer.py \
model_path=${MODEL_PATH} \
dataset_manifest=${MANIFEST_PATH} \
output_path=${OUTPUT_FOLDER} \
target_lang=es-ES \
att_context_size="[56,3]" \
strip_lang_tags=true
Or let the model detect the language:
python ${NEMO_ROOT}/examples/asr/asr_cache_aware_streaming/speech_to_text_cache_aware_streaming_infer.py \
model_path=${MODEL_PATH} \
dataset_manifest=${MANIFEST_PATH} \
output_path=${OUTPUT_FOLDER} \
target_lang=auto \
att_context_size="[56,3]" \
strip_lang_tags=true
Audio should be mono-channel .wav. The manifest is a standard NeMo JSON-lines file:
{"audio_filepath": "/path/to/clip.wav", "duration": 4.27, "text": "reference transcript"}
Model automatically predicts language_tag at the end of each completed sentence, i.e. “This is a test sample. <en-US>”. “strip_lang_tags=True” removes the language tag <xx-XX> for better readability.
Deep Dive: Fine-Tuning Nemotron ASR for Your Language
Nemotron 3.5 ASR is strong out of the box — but it was trained on a mix where some languages have far more data than others. The long-tail locales have headroom, and a few hours of in-domain audio plus the right recipe closes a surprising amount of it.
To make this concrete, we ran a worked example: take the base model and sharpen it on two mid-resource European languages — Greek, and Bulgarian — then measure honestly on held-out data. The results below are from that run. This section is a high-level overview and the coding example lives in the companion GitHub repo. When we publish an agentic SKILL.md covering the whole process, this blog will be updated accordingly.
Why fine-tune?
A few situations where it pays off:
- Sharpening a long-tail locale. Languages with less pretraining data have the most to gain.
- Domain expertise or specialized vocabulary Medical, legal, financial, or technical vocabulary the base model rarely saw.
- Accent, dialect, and acoustics. Telephony, far-field, in-car, or a specific speaker population.
- New languages. Bootstrapping a locale that isn't yet covered.
A Preview of the Power of Fine-Tuning
🎥 Video Walkthrough: Watch on YouTube
This walkthrough demonstrates multilingual streaming inference, latency/accuracy tradeoffs, deployment options, and the fine-tuning workflow described below.
The recipe at a glance
The whole workflow is five moves:
- Point the trainer at tarred speech data for the target languages — no per-file unpacking, streamed efficiently by NeMo/Lhotse.
- Fine-tune from the base checkpoint (init_from_nemo_model) using the same Cache-Aware FastConformer-RNNT recipe, conditioned on each clip's language tag.
- Evaluate on a held-out set the model never saw — at the same low-latency streaming setting you'll deploy (e.g. att_context_size=[56,0], 80ms chunk; 0ms lookahead).
- Add more data where the language is weak and retrain.
- Export and deploy the fine-tuned checkpoint.
Step 1 — Data
We assembled a balanced, ~2000-hour mix across the two languages (Greek and Bulgarian) from public multilingual corpora (Granary, Common Voice, FLEURS), kept as tarred NeMo/Lhotse shards. The two details that matter most:
- Every clip carries a target_lang tag — this is what drives the model's prompt-based language conditioning, so getting the tag right (and using a value the model recognizes) is essential.
- Match the base model's text style — punctuated, properly-cased transcripts, since that's what the model produces.
Held-out FLEURS test splits (which were not in training) gave us an honest, in-the-wild benchmark per language.
Step 2 — Train
A straightforward full fine-tune of the streaming RNNT model, driven by a fixed step budget (the right way to schedule with streaming/iterable data). It runs on a single GPU for a quick pass and scales cleanly to multi-GPU for a fuller run. On a small dataset like this, an epoch is minutes, not hours.
Step 3 — Evaluate
We measured Word Error Rate on the held-out FLEURS test set, in streaming mode with 80ms chunk — the most demanding condition, with no future-audio "peeking." The improvement over the base model is large, especially for the languages that started out weakest:
Language
Base model
Fine-tuned
Relative Improvement in WER
🇬🇷 Greek
35
24
32%
🇧🇬 Bulgarian
22
15
31%
*Raw WER (%) on held-out FLEURS test, lowest-latency streaming. Same evaluation for both the base and the fine-tuned models.*
Languages with higher error rates in the base model became genuinely useful after a short fine-tune — Bulgarian error rates more than halved.
Step 4 — Scale the data where it helps
To test how far more data goes, we then mixed in ~2,000 additional hours of parliamentary speech (MOSEL/VoxPopuli) part of the Granary Dataset, taking the training pool from ~290 hours to ~2,300 hours. Even partway through that longer run, the weakest languages improved further (e.g. Bulgarian dropping into the high-20s), confirming the obvious lever: more in-language data keeps helping — though gains are uneven across languages and domains, so measure rather than assume.
Step 5 — Deploy
The fine-tuned model is the same architecture as the base, so it drops straight into the same serving path and you pick your latency/accuracy operating point at inference time via att_context_size, exactly as in Part 1.
What we learned
- Fine-tuning is transformative for under-resourced languages — the biggest wins came where the base model was weakest.
- Evaluate at deployment latency, on held-out data. Training-set scores flatter you; a separate test set at 0 ms look-ahead tells the truth.
- Get the language tag right. The prompt conditioning is powerful but unforgiving of mismatched language labels.
- Protect the other languages. When specializing in a multilingual model, blend in a slice of the model's other languages ("replay") and re-check them, so you sharpen your target locales without eroding the rest.
- More data helps, unevenly. Adding hours reliably moved most languages; one plateaued — a reminder that domain match matters as much as raw quantity.
📦 The full walkthrough — data prep scripts, training configs, the exact commands, and the complete benchmark numbers — is in the companion GitHub repo. This section is the overview; the repo is the build.
For production serving, look out for the NIM release later this month, providing gRPC streaming, and support across NVIDIA Ampere, Hopper, Blackwell, Lovelace, Turing, Volta, and Jetson.
What you can build with it
A few of the use cases this model unlocks:
- Sub-second voice agents — ASR → LLM → TTS loops where the speech-to-text leg is no longer the bottleneck.
- Live multilingual meeting captions — one stream, participants in different languages, captions in real time.
- Call-center analytics at global scale — one ASR backend instead of a per-language vendor sprawl.
- Real-time captioning + translation for livestreams and events.
- On-device transcription on Jetson for privacy-sensitive or disconnected environments.
Get Started
Ready to build multilingual speech applications with a single streaming ASR model?
🤗 Try Nemotron 3.5 ASR: nvidia/nemotron-3.5-asr-streaming-0.6b
🧠 Run and fine-tune with NVIDIA NeMo: github.com/NVIDIA-NeMo/NeMo
📚 Explore the training example: Fine-Tuning Notebook
Whether you're building voice agents, multilingual captioning systems, contact-center analytics, or on-device speech applications, Nemotron 3.5 ASR provides a single multilingual model that can be deployed, customized, and fine-tuned for your use case.
We'd love to see what you build. Share your benchmarks, fine-tuning results, and language adaptations on the model discussion page:
💬 Model Discussions: https://huggingface.co/nvidia/nemotron-3.5-asr-streaming-0.6b/discussions
Model: https://huggingface.co/nvidia/nemotron-3.5-asr-streaming-0.6b
License: OpenMDW-1.1
Runtime: NeMo 26.06+
関連記事
今日のまとめ
AI日報で今日の重要ニュースをまとめ読み