Nemotron Streaming

Nemotron-Speech-Streaming-0.6B ist das englische Low-Latency-Streaming-ASR von NVIDIA: ein cache-bewusster FastConformer-Encoder mit RNN-T-Decoder. Interpunktion und Großschreibung werden als reguläre BPE-Tokens direkt ausgegeben. Das CoreML-Paket auf dieser Seite enthält einen INT8-paletisierten Encoder und läuft auf der Apple Neural Engine.

Worum es geht

Architektur

Drei CoreML-Modelle, pro Audio-Chunk verkettet:

ComponentDescription
Encoder24-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.
DecoderTwo-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.

Kein EOU-Kopf

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

  1. Externes VAD — kombiniere die Session mit Silero VAD. Bei anhaltender Stille rufe finalize() auf, um die aktuelle Äußerung festzuschreiben, und createSession() für die nächste.
  2. Interpunktionsgrenze — endet die Teiltranskription auf ., ? oder !, behandle das als natürliches Commit-Signal. Kein zusätzliches Modell, hängt jedoch davon ab, dass das Audio terminale Interpunktion tatsächlich auslöst.

Modell

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-Checkpoint).

Schnellstart — Batch-Transkription

Implementiert SpeechRecognitionModel, lässt sich also in jeden Codepfad einfügen, der ein generisches STT-Modell akzeptiert:

import NemotronStreamingASR

let model = try await NemotronStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000)

Schnellstart — asynchrones Streaming

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

Jedes PartialTranscript enthält text, isFinal (nur beim letzten Partial nach finalize() true), confidence und einen monoton wachsenden segmentIndex.

Langlaufende Session-API (Mikrofoneingabe)

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

CLI

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

Nemotron Streaming 0.6BParakeet-EOU 120M
Parameter600M120M
Encoder24-layer FastConformer, 1024 hidden17-layer FastConformer, 512 hidden
Decoder2-layer LSTM, RNN-T1-layer LSTM, RNN-T
EOU-ErkennungExtern (VAD oder Interpunktion)Eingebauter <EOU>-Token
InterpunktionNative inline BPE-TokensNein (Nachbearbeitung)
SprachenNur Englisch25 europäische
Standard-Chunk160 ms320 ms
Paketgröße~580 MB~150 MB
Wähle Nemotron, wenn…

…du ein hochwertigeres englisches Transkript mit Interpunktion und Großschreibung direkt aus der Box möchtest und es dir recht ist, Äußerungen selbst zu segmentieren (VAD oder Interpunktions-Cue). Für eingeschränktes iOS-Diktat mit integriertem EOU-Signal ist Parakeet-EOU weiterhin die kleinere und einfachere Wahl.