Nemotron ストリーミング
Nemotron-Speech-Streaming-0.6B は NVIDIA の低レイテンシ英語ストリーミング ASR です。キャッシュ対応 FastConformer エンコーダと RNN-T デコーダを組み合わせ、句読点と大文字化を通常の BPE トークンとして直接出力します。本サイトで配布する CoreML バンドルは INT8 パレット化エンコーダを含み、Apple Neural Engine で動作します。
概要
- ネイティブな句読点と大文字化 — 後処理不要。ピリオド、カンマ、大文字小文字はすべて語彙の一部
- 6 億パラメータ — Parakeet-EOU (120M) より大きく、難しい音声での文字起こし品質が大幅に向上
- キャッシュ対応 FastConformer — 24 層エンコーダ、注意機構と畳み込みのキャッシュがチャンク間で流れ、連続したコンテキストを維持
- 4 つのチャンクサイズ — 推論ステップあたり 80、160、560、1120 ms(160 ms がデフォルトで、現在公開されているバリアント)
- 英語のみ — 英語音声で学習済み。多言語用途については Qwen3-ASR または Omnilingual ASR
アーキテクチャ
音声チャンクごとに 3 つの CoreML モデルをパイプライン処理:
| Component | Description |
|---|---|
| エンコーダ | 24-layer cache-aware FastConformer, 1024 hidden. Takes a 17-frame mel chunk (160 ms default) plus five state tensors — attention KV cache [24, 1, 70, 1024], depthwise conv cache [24, 1, 1024, 8], and a pre_cache mel loopback that prepends recent-past audio so chunk boundaries stay continuous. |
| デコーダ | Two-layer LSTM prediction network, 640 hidden. Consumes the previous non-blank token, emits an embedding plus updated (h, c) state. |
| Joint | Fuses encoder and decoder outputs into logits over 1024 BPE tokens + blank. Punctuation and capitalization are just more tokens in the BPE vocab — no extra heads. |
EOU ヘッドなし
Parakeet-EOU とは異なり、Nemotron は専用の発話終端トークンを出力しません。連続音声を発話に分割する方法は 2 つあります:
- 外部 VAD — セッションを Silero VAD と組み合わせ、持続的な無音時に
finalize()で現在の発話を確定し、次のセッションはcreateSession()で開始します。 - 句読点の境界 — 部分文字起こしが
.、?、!で終わる場合、自然な確定シグナルとして扱います。追加モデルは不要ですが、音声が実際に終端句読点を誘発することに依存します。
モデル
| Component | Size | HuggingFace |
|---|---|---|
| Encoder (INT8) | 562 MB | aufklarer/Nemotron-Speech-Streaming-0.6B-CoreML-INT8 |
| Decoder | 14 MB | |
| Joint | 3.3 MB |
Upstream: nvidia/nemotron-speech-streaming-en-0.6b (NeMo .nemo チェックポイント)。
クイックスタート — バッチ文字起こし
SpeechRecognitionModel に準拠しているので、汎用 STT モデルを受け取るあらゆるコードパスにそのまま組み込めます:
import NemotronStreamingASR
let model = try await NemotronStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000)
クイックスタート — 非同期ストリーミング
for await partial in model.transcribeStream(audio: samples, sampleRate: 16000) {
if partial.isFinal { print("FINAL: \(partial.text)") }
else { print("... \(partial.text)") }
}
各 PartialTranscript には text、isFinal(finalize() 後の最後の部分結果のみ true)、confidence、単調増加の segmentIndex が含まれます。
長期セッション API(マイク入力)
let session = try model.createSession()
// 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) }
コマンドライン
audio transcribe recording.wav --engine nemotron # batch
audio transcribe recording.wav --engine nemotron --stream # streaming final
audio transcribe recording.wav --engine nemotron --stream --partial # with partials
Nemotron と Parakeet-EOU の比較
| Nemotron Streaming 0.6B | Parakeet-EOU 120M | |
|---|---|---|
| パラメータ | 600M | 120M |
| Encoder | 24-layer FastConformer, 1024 hidden | 17-layer FastConformer, 512 hidden |
| Decoder | 2-layer LSTM, RNN-T | 1-layer LSTM, RNN-T |
| EOU 検出 | 外部(VAD または句読点) | 内蔵 <EOU> トークン |
| 句読点 | ネイティブなインライン BPE トークン | なし(後処理) |
| 言語 | 英語のみ | 25 欧州言語 |
| デフォルトチャンク | 160 ms | 320 ms |
| バンドルサイズ | ~580 MB | ~150 MB |
Nemotronを選ぶタイミング…
句読点と大文字化が箱から出してすぐ使える高品質な英語トランスクリプトが必要で、発話の分割を自分で行う(VADや句読点キュー)ことに問題がない場合。組み込みEOU信号を持つ制約されたiOSディクテーションには、Parakeet-EOUの方が依然として小さくシンプルな選択肢です。