Nemotron ストリーミング
NVIDIA のストリーミング ASR モデル 2 種類が NemotronStreamingASR Swift ターゲットを共有します。いずれも 600M パラメータのキャッシュ対応 FastConformer エンコーダと RNN-T デコーダの組み合わせで、句読点と大文字化を通常の BPE トークンとしてネイティブに出力し、CoreML 経由で Apple Neural Engine 上で動作します。多言語版にはさらに GPU 常駐推論用の MLX バンドルも用意されています。用途に合わせて選択してください:
| バリアント | 対応 | デフォルトチャンク | アップストリーム |
|---|---|---|---|
| Nemotron 3.5 多言語版 | 40 言語ロケール(en-US、en-GB、es-ES、fr-FR、de-DE、ja-JP、ko-KR、zh-CN、hi-IN、ar、…) | 320 ms | nvidia/nemotron-3.5-asr-streaming-0.6b |
| Nemotron Speech Streaming(英語版) | 英語のみ — バンドルが小さく、デフォルトレイテンシが低い | 160 ms | nvidia/nemotron-speech-streaming-en-0.6b |
共通プロパティ
- 句読点と大文字化がネイティブ — 後処理不要。ピリオド、カンマ、大文字小文字が語彙の一部
- 600M パラメータ — キャッシュ対応 24 層 FastConformer エンコーダ + 2 層 LSTM RNN-T デコーダ + Joint ネットワーク
- キャッシュ対応ストリーミング — attention と conv のキャッシュをチャンク間で引き継ぎ、チャンク境界をまたいだ連続的な文脈を保持
- 複数のチャンクサイズ — 多言語版:80、320、560、1120 ms(デフォルト 320 ms)/英語版:80、160、560、1120 ms(デフォルト 160 ms)
- 多言語版のみ:プロンプトカーネル(Linear 1152→2048→1024)がワンホットの言語スロットを各エンコード済みフレームに織り込み、同じ重みで 40 言語ロケールすべてに対応します。英語版にはプロンプトカーネルがありません。
アーキテクチャ
音声チャンクごとに 3 つの CoreML モデルをパイプライン実行:
| コンポーネント | 説明 |
|---|---|
| エンコーダ | 24 層のキャッシュ対応 FastConformer、隠れ次元 1024。32 フレームの mel チャンク(デフォルト 320 ms)に加え、6 つの状態テンソル — attention KV キャッシュ [24, 1, 56, 1024]、depthwise conv キャッシュ [24, 1, 1024, 8]、pre_cache mel ループバック、そしてプロンプトカーネルを駆動する 128 スロットのワンホット language_mask — を受け取ります。 |
| プロンプトカーネル | Linear(1152→2048) → ReLU → Linear(2048→1024) — 言語のワンホットを各エンコード済みフレームに織り込み、同じ 600M の重みで 40 言語ロケールすべてに対応します。 |
| デコーダ | 2 層 LSTM 予測ネットワーク、隠れ次元 640。直前の非空白トークンを入力として、埋め込みと更新された (h, c) 状態を出力します。 |
| Joint | エンコーダとデコーダの出力を融合し、13 087 BPE トークン + 空白の logits を生成。句読点・大文字化・言語タグはすべて BPE 語彙内の追加トークンで、専用ヘッドはありません。 |
EOU ヘッドなし
Parakeet-EOU と異なり、Nemotron は専用の発話終端トークンを出力しません。連続音声を発話に分割する方法は 2 通り:
- 外部 VAD — セッションを Silero VAD と組み合わせ、無音が続いたら
finalize()を呼び出して現在の発話をコミットし、次の発話用にcreateSession()を呼びます。 - 句読点境界 — 部分文字起こしが
.、?、!で終わったら自然なコミットの合図とみなします。追加モデル不要ですが、終端句読点が実際に生成されることに依存します。
バンドル
Nemotron-3.5-ASR-Streaming-0.6B の公開バリアントは 4 つ、それに加えて同じ Swift ターゲットに乗る旧来の英語専用モデル:
| バリアント | ディスク使用量 | ストリーミングピーク(M5 Pro) | HuggingFace |
|---|---|---|---|
| CoreML INT8 (デフォルト) | 612 MB | 1238 MB | aufklarer/Nemotron-3.5-ASR-Streaming-0.6B-CoreML-INT8 |
| MLX bf16 | 1217 MB | 1474 MB | aufklarer/…MLX-bf16 |
| MLX 8-bit | 732 MB | 997 MB | aufklarer/…MLX-8bit |
| MLX 4-bit | 473 MB | 747 MB | aufklarer/…MLX-4bit |
| 英語専用(CoreML INT8) | ~580 MB | — | aufklarer/Nemotron-Speech-Streaming-0.6B-CoreML-INT8 |
アップストリーム: nvidia/nemotron-3.5-asr-streaming-0.6b(多言語版)および nvidia/nemotron-speech-streaming-en-0.6b(英語専用)。
量子化はほぼロスレス:CoreML INT8、MLX bf16、MLX 8-bit は fp32 NeMo ソースに対して WER ±0.3 pp 以内に収まります。MLX 4-bit は平均 WER で約 6 pp の損失と引き換えに、最小のディスクサイズとストリーミング RSS を実現します。
クイックスタート — バッチ文字起こし
SpeechRecognitionModel に準拠しているため、汎用 STT モデルを受け取るあらゆるコードパスにそのまま組み込めます:
import NemotronStreamingASR
let model = try await NemotronStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000, language: "en-US")
クイックスタート — 非同期ストリーミング
for await partial in model.transcribeStream(audio: samples, sampleRate: 16000, language: "ja-JP") {
if partial.isFinal { print("FINAL: \(partial.text)") }
else { print("... \(partial.text)") }
}
各 PartialTranscript には text、isFinal(finalize() 後の最後の部分結果のみ true)、confidence、単調増加の segmentIndex が含まれます。
長時間セッション API(マイク入力)
let session = try model.createSession(language: "en-US")
// each mic chunk:
let partials = try session.pushAudio(float32Chunk16kHz)
for p in partials { showPartial(p.text) } // isFinal is false mid-stream
// when the utterance ends (VAD silence or explicit stop):
let trailing = try session.finalize()
for p in trailing { commit(p.text) }
コマンドライン
speech transcribe recording.wav --engine nemotron --language en-US # batch
speech transcribe recording.wav --engine nemotron --language en-US --stream # streaming final
speech transcribe recording.wav --engine nemotron --language ja-JP --stream --partial # partials
speech transcribe meeting.wav --engine nemotron --language de-DE # any of the 40 locales
Nemotron と Parakeet-EOU の比較
| Nemotron Streaming 0.6B | Parakeet-EOU 120M | |
|---|---|---|
| パラメータ | 600M | 120M |
| エンコーダ | 24 層 FastConformer、隠れ次元 1024 | 17 層 FastConformer、隠れ次元 512 |
| デコーダ | 2-layer LSTM, RNN-T | 1-layer LSTM, RNN-T |
| EOU 検出 | 外部(VAD または句読点) | 内蔵 <EOU> トークン |
| 句読点 | BPE トークンとしてネイティブ | なし(後処理) |
| 言語 | 40 言語ロケール(en-US、en-GB、es-ES、fr-FR、de-DE、ja-JP、ko-KR、zh-CN、hi-IN、ar、…) | 欧州 25 言語 |
| デフォルトチャンク | 320 ms | 320 ms |
| バンドルサイズ | 612 MB(CoreML INT8)/473 MB(MLX 4-bit) | ~150 MB |
…多言語のストリーミング文字起こし(40 言語ロケールのいずれか)が必要で、句読点と大文字化を箱から出してすぐ得たく、発話分割は自分で行ってよい場合(VAD または句読点キュー)。組み込み EOU 信号を持つ端末制約付き iOS ディクテーション(英語のみ)であれば、Parakeet-EOU の方が依然として小さい選択肢です。