Nemotron Streaming

Zwei NVIDIA-Streaming-ASR-Modelle teilen sich das Swift-Target NemotronStreamingASR. Beide sind 600M-Parameter Cache-aware FastConformer-Encoder mit RNN-T-Decoder, beide geben Interpunktion und Großschreibung nativ als reguläre BPE-Tokens aus, beide laufen über CoreML auf der Apple Neural Engine; die mehrsprachige Variante hat zusätzlich MLX-Bundles für GPU-residente Inferenz. Wähle die zu deiner Anwendung passende Variante:

VarianteAbdeckungStandard-ChunkUpstream
Nemotron 3.5 Mehrsprachig40 Sprach-Locales (en-US, en-GB, es-ES, fr-FR, de-DE, ja-JP, ko-KR, zh-CN, hi-IN, ar, …)320 msnvidia/nemotron-3.5-asr-streaming-0.6b
Nemotron Speech Streaming (Englisch)Nur Englisch — kleineres Bundle, geringere Standard-Latenz160 msnvidia/nemotron-speech-streaming-en-0.6b

Gemeinsame Eigenschaften

Architektur

Pro Audio-Chunk werden drei CoreML-Modelle in der Pipeline ausgeführt:

KomponenteBeschreibung
Encoder24-schichtiger Cache-aware FastConformer, 1024 Hidden. Verarbeitet einen 32-Frame-Mel-Chunk (Standard 320 ms) plus sechs Zustandstensoren — Attention-KV-Cache [24, 1, 56, 1024], depthwise Conv-Cache [24, 1, 1024, 8], pre_cache Mel-Loopback und eine 128-Slot One-Hot language_mask, die den Prompt-Kernel steuert.
Prompt-KernelLinear(1152→2048) → ReLU → Linear(2048→1024) — integriert das One-Hot der Sprache in jeden codierten Frame, sodass dieselben 600M Gewichte alle 40 Sprach-Locales bedienen.
DecoderZweischichtiges LSTM-Predictor-Netzwerk, 640 Hidden. Nimmt das vorherige Non-Blank-Token, gibt ein Embedding plus aktualisierten (h, c)-Zustand zurück.
JointFusioniert Encoder- und Decoder-Ausgaben zu Logits über 13 087 BPE-Tokens + Blank. Interpunktion, Großschreibung und Sprach-Tags sind nur zusätzliche Tokens im BPE-Vokabular — keine separaten Heads.

Kein EOU-Head

Anders als Parakeet-EOU gibt Nemotron kein dediziertes End-of-Utterance-Token aus. Zwei Wege, kontinuierliches Audio in Äußerungen zu segmentieren:

  1. Externes VAD — koppele die Session mit Silero VAD; bei anhaltender Stille rufe finalize() auf, um die aktuelle Äußerung zu committen, und createSession() für die nächste.
  2. Interpunktionsgrenze — endet der Partial-Transkript mit ., ? oder !, behandle das als natürlichen Commit-Cue. Keine Extra-Modelle, hängt aber davon ab, dass das Audio tatsächlich Schluss-Interpunktion induziert.

Bundles

Vier veröffentlichte Varianten von Nemotron-3.5-ASR-Streaming-0.6B sowie das ältere Englisch-only-Modell auf demselben Swift-Target:

VarianteAuf DiskStreaming-Peak (M5 Pro)HuggingFace
CoreML INT8 (Standard)612 MB1238 MBaufklarer/Nemotron-3.5-ASR-Streaming-0.6B-CoreML-INT8
MLX bf161217 MB1474 MBaufklarer/…MLX-bf16
MLX 8-bit732 MB997 MBaufklarer/…MLX-8bit
MLX 4-bit473 MB747 MBaufklarer/…MLX-4bit
Englisch-only (CoreML INT8)~580 MBaufklarer/Nemotron-Speech-Streaming-0.6B-CoreML-INT8

Upstream: nvidia/nemotron-3.5-asr-streaming-0.6b (mehrsprachig) und nvidia/nemotron-speech-streaming-en-0.6b (Englisch-only).

Quantisierung ist praktisch verlustfrei: CoreML INT8, MLX bf16 und MLX 8-bit liegen innerhalb von ±0,3 pp WER zur fp32-NeMo-Quelle. MLX 4-bit kostet ca. 6 pp durchschnittlichen WER für die kleinste Disk- und Streaming-RSS-Größe.

Quick Start — Batch-Transkription

Konform zu SpeechRecognitionModel, lässt sich also in jeden Code-Pfad einsetzen, der ein generisches STT-Modell akzeptiert:

import NemotronStreamingASR

let model = try await NemotronStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000, language: "en-US")

Quick Start — Async-Streaming

for await partial in model.transcribeStream(audio: samples, sampleRate: 16000, language: "ja-JP") {
    if partial.isFinal { print("FINAL: \(partial.text)") }
    else               { print("... \(partial.text)") }
}

Jedes PartialTranscript trägt text, isFinal (nur true für das letzte Partial nach finalize()), confidence und einen monoton steigenden segmentIndex.

Langlebige Session-API (Mikrofoneingabe)

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) }

CLI

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 vs. Parakeet-EOU

Nemotron Streaming 0.6BParakeet-EOU 120M
Parameter600M120M
Encoder24-schichtiger FastConformer, 1024 Hidden17-schichtiger FastConformer, 512 Hidden
Decoder2-layer LSTM, RNN-T1-layer LSTM, RNN-T
EOU-DetektionExtern (VAD oder Interpunktion)Eingebautes <EOU>-Token
InterpunktionNative inline BPE-TokensNein (Post-Process)
Sprachen40 Sprach-Locales (en-US, en-GB, es-ES, fr-FR, de-DE, ja-JP, ko-KR, zh-CN, hi-IN, ar, …)25 europäische
Standard-Chunk320 ms320 ms
Bundle-Größe612 MB (CoreML INT8); 473 MB (MLX 4-bit)~150 MB
Wann Nemotron wählen…

…wenn du mehrsprachige Streaming-Transkription (eines der 40 Sprach-Locales) mit Interpunktion und Großschreibung out-of-the-box brauchst und Äußerungen selbst segmentierst (VAD oder Interpunktions-Cue). Für ressourcenbeschränkte iOS-Diktiergeräte ausschließlich auf Englisch mit eingebautem EOU-Signal bleibt Parakeet-EOU die kleinere Wahl.