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 :
| Variante | Couverture | Chunk par défaut | Upstream |
|---|---|---|---|
| Nemotron 3.5 Multilingue | 40 locales linguistiques (en-US, en-GB, es-ES, fr-FR, de-DE, ja-JP, ko-KR, zh-CN, hi-IN, ar, …) | 320 ms | nvidia/nemotron-3.5-asr-streaming-0.6b |
| Nemotron Speech Streaming (Anglais) | Anglais uniquement — bundle plus petit, latence par défaut plus faible | 160 ms | nvidia/nemotron-speech-streaming-en-0.6b |
Propriétés partagées
- Ponctuation et majuscules natives — pas de post-traitement nécessaire ; points, virgules et casse font partie du vocabulaire
- 600M paramètres — encodeur FastConformer cache-aware 24 couches + décodeur LSTM RNN-T 2 couches + joint network
- Streaming cache-aware — les caches d'attention et de convolution circulent de chunk en chunk pour préserver le contexte au-delà des frontières
- Plusieurs tailles de chunk — multilingue : 80, 320, 560, 1120 ms (320 ms par défaut) ; anglais : 80, 160, 560, 1120 ms (160 ms par défaut)
- Multilingue uniquement : un prompt kernel (Linear 1152→2048→1024) injecte un slot one-hot de langue dans chaque frame encodé, si bien que les mêmes poids servent les 40 locales. La variante anglais-seul n'a pas de prompt kernel.
Architecture
Trois modèles CoreML pipelinés par chunk audio :
| Composant | Description |
|---|---|
| Encodeur | FastConformer 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 kernel | Linear(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écodeur | Ré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. |
| Joint | Fusionne 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 :
- VAD externe — associez la session à Silero VAD ; sur silence prolongé, appelez
finalize()pour valider l'énoncé courant etcreateSession()pour le suivant. - 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 :
| Variante | Sur disque | Pic streaming (M5 Pro) | HuggingFace |
|---|---|---|---|
| CoreML INT8 (par défaut) | 612 MB | 1238 MB | aufklarer/Nemotron-3.5-ASR-Streaming-0.6B-CoreML-INT8 |
| MLX bf16 | 1217 MB | 1474 MB | aufklarer/…MLX-bf16 |
| MLX 8-bit | 732 MB | 997 MB | aufklarer/…MLX-8bit |
| MLX 4-bit | 473 MB | 747 MB | aufklarer/…MLX-4bit |
| Anglais-seul (CoreML INT8) | ~580 MB | — | aufklarer/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.6B | Parakeet-EOU 120M | |
|---|---|---|
| Paramètres | 600M | 120M |
| Encodeur | FastConformer 24 couches, 1024 hidden | FastConformer 17 couches, 512 hidden |
| Décodeur | 2-layer LSTM, RNN-T | 1-layer LSTM, RNN-T |
| Détection EOU | Externe (VAD ou ponctuation) | Token <EOU> intégré |
| Ponctuation | Tokens BPE inline natifs | Non (post-traitement) |
| Langues | 40 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éfaut | 320 ms | 320 ms |
| Taille du bundle | 612 MB (CoreML INT8) ; 473 MB (MLX 4-bit) | ~150 MB |
…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.