Nemotron ストリーミング

Nemotron-Speech-Streaming-0.6B は NVIDIA の低レイテンシ英語ストリーミング ASR です。キャッシュ対応 FastConformer エンコーダと RNN-T デコーダを組み合わせ、句読点と大文字化を通常の BPE トークンとして直接出力します。本サイトで配布する CoreML バンドルは INT8 パレット化エンコーダを含み、Apple Neural Engine で動作します。

概要

アーキテクチャ

音声チャンクごとに 3 つの CoreML モデルをパイプライン処理:

ComponentDescription
エンコーダ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.
JointFuses 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 つあります:

  1. 外部 VAD — セッションを Silero VAD と組み合わせ、持続的な無音時に finalize() で現在の発話を確定し、次のセッションは createSession() で開始します。
  2. 句読点の境界 — 部分文字起こしが .?! で終わる場合、自然な確定シグナルとして扱います。追加モデルは不要ですが、音声が実際に終端句読点を誘発することに依存します。

モデル

ComponentSizeHuggingFace
Encoder (INT8)562 MBaufklarer/Nemotron-Speech-Streaming-0.6B-CoreML-INT8
Decoder14 MB
Joint3.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 には textisFinalfinalize() 後の最後の部分結果のみ 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.6BParakeet-EOU 120M
パラメータ600M120M
Encoder24-layer FastConformer, 1024 hidden17-layer FastConformer, 512 hidden
Decoder2-layer LSTM, RNN-T1-layer LSTM, RNN-T
EOU 検出外部(VAD または句読点)内蔵 <EOU> トークン
句読点ネイティブなインライン BPE トークンなし(後処理)
言語英語のみ25 欧州言語
デフォルトチャンク160 ms320 ms
バンドルサイズ~580 MB~150 MB
Nemotronを選ぶタイミング…

句読点と大文字化が箱から出してすぐ使える高品質な英語トランスクリプトが必要で、発話の分割を自分で行う(VADや句読点キュー)ことに問題がない場合。組み込みEOU信号を持つ制約されたiOSディクテーションには、Parakeet-EOUの方が依然として小さくシンプルな選択肢です。