Nemotron Streaming

Nemotron-Speech-Streaming-0.6B est l'ASR en streaming anglais à faible latence de NVIDIA : un encodeur FastConformer avec cache associé à un décodeur RNN-T, émettant ponctuation et majuscules sous forme de tokens BPE ordinaires. Le paquet CoreML proposé ici embarque un encodeur palettisé INT8 et s'exécute sur l'Apple Neural Engine.

Présentation

Architecture

Trois modèles CoreML chaînés par bloc audio :

ComponentDescription
Encodeur24-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.
DécodeurTwo-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.

Pas de tête EOU

Contrairement à Parakeet-EOU, Nemotron n'émet pas de token dédié de fin d'énoncé. Deux façons de segmenter l'audio continu en énoncés :

  1. VAD externe — associe la session à Silero VAD ; lors d'un silence prolongé, appelle finalize() pour valider l'énoncé courant puis createSession() pour le suivant.
  2. Frontière de ponctuation — si la transcription partielle se termine par ., ? ou !, traite cela comme un signal naturel de validation. Pas de modèle supplémentaire, mais dépend du fait que l'audio induise effectivement une ponctuation terminale.

Modèle

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 (checkpoint .nemo NeMo).

Démarrage rapide — transcription par lot

Conforme à SpeechRecognitionModel, il s'intègre dans tout code acceptant un modèle STT générique :

import NemotronStreamingASR

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

Démarrage rapide — streaming asynchrone

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

Chaque PartialTranscript porte text, isFinal (true uniquement pour le dernier partiel après finalize()), confidence, et un segmentIndex monotone.

API de session persistante (entrée micro)

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
Paramètres600M120M
Encoder24-layer FastConformer, 1024 hidden17-layer FastConformer, 512 hidden
Decoder2-layer LSTM, RNN-T1-layer LSTM, RNN-T
Détection EOUExterne (VAD ou ponctuation)Token <EOU> intégré
PonctuationTokens BPE natifs en ligneNon (post-traitement)
LanguesAnglais uniquement25 européennes
Bloc par défaut160 ms320 ms
Taille du paquet~580 MB~150 MB
Choisissez Nemotron quand…

…vous voulez une transcription anglaise de meilleure qualité avec ponctuation et majuscules prêtes à l'emploi, et que vous acceptez de segmenter vous-même les énoncés (VAD ou indice de ponctuation). Pour la dictée iOS contrainte avec un signal EOU intégré, Parakeet-EOU reste le choix plus petit et plus simple.