Nemotron Streaming
Dos modelos NVIDIA de ASR en streaming comparten el target Swift NemotronStreamingASR. Ambos son encoders FastConformer cache-aware de 600M de parámetros emparejados con un decoder RNN-T, ambos emiten puntuación y mayúsculas de forma nativa como tokens BPE regulares, ambos corren sobre el Apple Neural Engine vía CoreML, y la variante multilingüe además incluye bundles MLX para inferencia residente en GPU. Elige la que encaje con tu aplicación:
| Variante | Cobertura | Chunk por defecto | Upstream |
|---|---|---|---|
| Nemotron 3.5 Multilingüe | 40 locales lingüísticos (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 (Inglés) | Solo inglés — bundle más pequeño, menor latencia por defecto | 160 ms | nvidia/nemotron-speech-streaming-en-0.6b |
Propiedades compartidas
- Puntuación y mayúsculas nativas — no hace falta post-procesador; puntos, comas y casing forman parte del vocabulario
- 600M parámetros — encoder FastConformer cache-aware de 24 capas + decoder LSTM RNN-T de 2 capas + joint network
- Streaming cache-aware — los caches de attention y conv fluyen entre chunks para conservar contexto continuo a través de los límites
- Múltiples tamaños de chunk — multilingüe: 80, 320, 560, 1120 ms (320 ms por defecto); inglés: 80, 160, 560, 1120 ms (160 ms por defecto)
- Solo multilingüe: un prompt kernel (Linear 1152→2048→1024) inyecta un slot one-hot de idioma en cada frame codificado, así los mismos pesos sirven a los 40 locales. La variante solo-inglés no tiene prompt kernel.
Arquitectura
Tres modelos CoreML en pipeline por cada chunk de audio:
| Componente | Descripción |
|---|---|
| Encoder | FastConformer cache-aware de 24 capas, 1024 hidden. Recibe un chunk mel de 32 frames (320 ms por defecto) más seis tensores de estado — cache attention KV [24, 1, 56, 1024], cache conv depthwise [24, 1, 1024, 8], loopback mel pre_cache, y una one-hot language_mask de 128 slots que alimenta al prompt kernel. |
| Prompt kernel | Linear(1152→2048) → ReLU → Linear(2048→1024) — inyecta el one-hot de idioma en cada frame codificado, de modo que los mismos 600M de pesos sirven a los 40 locales lingüísticos. |
| Decoder | Red de predicción LSTM de dos capas, 640 hidden. Consume el token no-blank anterior y emite un embedding más estado (h, c) actualizado. |
| Joint | Fusiona las salidas de encoder y decoder en logits sobre 13 087 tokens BPE + blank. Puntuación, mayúsculas y tags por idioma son simplemente más tokens en el vocabulario BPE — sin heads adicionales. |
Sin head EOU
A diferencia de Parakeet-EOU, Nemotron no emite un token dedicado de fin de enunciado. Dos formas de segmentar audio continuo en enunciados:
- VAD externo — empareja la sesión con Silero VAD; ante silencio sostenido, llama
finalize()para confirmar el enunciado actual ycreateSession()para el siguiente. - Frontera de puntuación — cuando el transcript parcial termina en
.,?o!, trátalo como una señal natural de commit. Sin modelo extra, pero depende de que el audio realmente induzca puntuación final.
Bundles
Cuatro variantes publicadas de Nemotron-3.5-ASR-Streaming-0.6B, más el modelo solo-inglés más antiguo sobre el mismo target Swift:
| Variante | En disco | Pico streaming (M5 Pro) | HuggingFace |
|---|---|---|---|
| CoreML INT8 (por defecto) | 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 |
| Solo inglés (CoreML INT8) | ~580 MB | — | aufklarer/Nemotron-Speech-Streaming-0.6B-CoreML-INT8 |
Upstream: nvidia/nemotron-3.5-asr-streaming-0.6b (multilingüe) y nvidia/nemotron-speech-streaming-en-0.6b (solo inglés).
La cuantización es prácticamente sin pérdida: CoreML INT8, MLX bf16 y MLX 8-bit quedan dentro de ±0,3 pp WER frente a la fuente fp32 NeMo. MLX 4-bit cuesta ~6 pp de WER medio a cambio del menor tamaño en disco y RSS de streaming.
Inicio rápido — transcripción por lotes
Cumple SpeechRecognitionModel, así que encaja en cualquier ruta de código que reciba un modelo STT genérico:
import NemotronStreamingASR
let model = try await NemotronStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000, language: "en-US")
Inicio rápido — streaming asíncrono
for await partial in model.transcribeStream(audio: samples, sampleRate: 16000, language: "ja-JP") {
if partial.isFinal { print("FINAL: \(partial.text)") }
else { print("... \(partial.text)") }
}
Cada PartialTranscript incluye text, isFinal (true solo en el último parcial tras finalize()), confidence y un segmentIndex monótonamente creciente.
API de sesión persistente (entrada de micrófono)
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 | |
|---|---|---|
| Parámetros | 600M | 120M |
| Encoder | FastConformer de 24 capas, 1024 hidden | FastConformer de 17 capas, 512 hidden |
| Decoder | 2-layer LSTM, RNN-T | 1-layer LSTM, RNN-T |
| Detección EOU | Externa (VAD o puntuación) | Token <EOU> integrado |
| Puntuación | Tokens BPE nativos | No (post-proceso) |
| Idiomas | 40 locales lingüísticos (en-US, en-GB, es-ES, fr-FR, de-DE, ja-JP, ko-KR, zh-CN, hi-IN, ar, …) | 25 europeos |
| Chunk por defecto | 320 ms | 320 ms |
| Tamaño del bundle | 612 MB (CoreML INT8); 473 MB (MLX 4-bit) | ~150 MB |
…necesites transcripción en streaming multilingüe (cualquiera de los 40 locales) con puntuación y mayúsculas listas, y te valga segmentar tú mismo los enunciados (VAD o señal de puntuación). Para dictado iOS con recursos limitados, solo en inglés y con señal EOU integrada, Parakeet-EOU sigue siendo la opción más pequeña.