Nemotron Streaming

Deux modèles ASR streaming de NVIDIA partagent la target Swift NemotronStreamingASR. Tous deux sont des encodeurs FastConformer cache-aware de 600M de paramètres associés à un décodeur RNN-T, tous deux émettent ponctuation et majuscules nativement comme des tokens BPE classiques, tous deux tournent sur l'Apple Neural Engine via CoreML, et la variante multilingue propose en plus des bundles MLX pour l'inférence résidente sur GPU. Choisissez celle qui correspond à votre application :

VarianteCouvertureChunk par défautUpstream
Nemotron 3.5 Multilingue40 locales linguistiques (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 (Anglais)Anglais uniquement — bundle plus petit, latence par défaut plus faible160 msnvidia/nemotron-speech-streaming-en-0.6b

Propriétés partagées

Architecture

Trois modèles CoreML pipelinés par chunk audio :

ComposantDescription
EncodeurFastConformer cache-aware 24 couches, 1024 hidden. Reçoit un chunk mel de 32 frames (320 ms par défaut) plus six tenseurs d'état — cache attention KV [24, 1, 56, 1024], cache conv depthwise [24, 1, 1024, 8], loopback mel pre_cache, et un one-hot language_mask à 128 slots qui pilote le prompt kernel.
Prompt kernelLinear(1152→2048) → ReLU → Linear(2048→1024) — injecte le one-hot de langue dans chaque frame encodé, de sorte que les mêmes 600M de poids servent les 40 locales linguistiques.
DécodeurRéseau de prédiction LSTM deux couches, 640 hidden. Consomme le token non-blank précédent, émet un embedding plus état (h, c) mis à jour.
JointFusionne sorties encodeur et décodeur en logits sur 13 087 tokens BPE + blank. Ponctuation, majuscules et tags de langue ne sont que des tokens supplémentaires dans le vocabulaire BPE — pas de heads dédiées.

Pas de head 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 — associez la session à Silero VAD ; sur silence prolongé, appelez finalize() pour valider l'énoncé courant et createSession() pour le suivant.
  2. Frontière de ponctuation — quand le transcript partiel se termine par ., ? ou !, traitez-le comme un signal naturel de commit. Pas de modèle supplémentaire, mais dépend du fait que l'audio induise effectivement une ponctuation finale.

Bundles

Quatre variantes publiées de Nemotron-3.5-ASR-Streaming-0.6B, plus le modèle anglais-seul plus ancien sur la même target Swift :

VarianteSur disquePic streaming (M5 Pro)HuggingFace
CoreML INT8 (par défaut)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
Anglais-seul (CoreML INT8)~580 MBaufklarer/Nemotron-Speech-Streaming-0.6B-CoreML-INT8

Upstream : nvidia/nemotron-3.5-asr-streaming-0.6b (multilingue) et nvidia/nemotron-speech-streaming-en-0.6b (anglais-seul).

La quantification est essentiellement sans perte : CoreML INT8, MLX bf16 et MLX 8-bit restent à ±0,3 pp WER de la source fp32 NeMo. MLX 4-bit coûte ~6 pp de WER moyen pour la plus petite taille disque et RSS de streaming.

Démarrage rapide — transcription par lots

Conforme à SpeechRecognitionModel, donc s'intègre dans tout chemin de code qui attend un modèle STT générique :

import NemotronStreamingASR

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

Démarrage rapide — streaming asynchrone

for await partial in model.transcribeStream(audio: samples, sampleRate: 16000, language: "ja-JP") {
    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 croissant.

API de session longue durée (entrée micro)

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
Paramètres600M120M
EncodeurFastConformer 24 couches, 1024 hiddenFastConformer 17 couches, 512 hidden
Décodeur2-layer LSTM, RNN-T1-layer LSTM, RNN-T
Détection EOUExterne (VAD ou ponctuation)Token <EOU> intégré
PonctuationTokens BPE inline natifsNon (post-traitement)
Langues40 locales linguistiques (en-US, en-GB, es-ES, fr-FR, de-DE, ja-JP, ko-KR, zh-CN, hi-IN, ar, …)25 européennes
Chunk par défaut320 ms320 ms
Taille du bundle612 MB (CoreML INT8) ; 473 MB (MLX 4-bit)~150 MB
Choisissez Nemotron quand…

…vous avez besoin de transcription streaming multilingue (un des 40 locales) avec ponctuation et majuscules out-of-the-box, et que vous acceptez de segmenter vous-même les énoncés (VAD ou signal de ponctuation). Pour la dictée iOS contrainte en anglais seulement avec signal EOU intégré, Parakeet-EOU reste le choix plus petit.