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:

VarianteCoberturaChunk por defectoUpstream
Nemotron 3.5 Multilingüe40 locales lingüísticos (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 (Inglés)Solo inglés — bundle más pequeño, menor latencia por defecto160 msnvidia/nemotron-speech-streaming-en-0.6b

Propiedades compartidas

Arquitectura

Tres modelos CoreML en pipeline por cada chunk de audio:

ComponenteDescripción
EncoderFastConformer 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 kernelLinear(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.
DecoderRed 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.
JointFusiona 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:

  1. VAD externo — empareja la sesión con Silero VAD; ante silencio sostenido, llama finalize() para confirmar el enunciado actual y createSession() para el siguiente.
  2. 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:

VarianteEn discoPico streaming (M5 Pro)HuggingFace
CoreML INT8 (por defecto)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
Solo inglés (CoreML INT8)~580 MBaufklarer/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.6BParakeet-EOU 120M
Parámetros600M120M
EncoderFastConformer de 24 capas, 1024 hiddenFastConformer de 17 capas, 512 hidden
Decoder2-layer LSTM, RNN-T1-layer LSTM, RNN-T
Detección EOUExterna (VAD o puntuación)Token <EOU> integrado
PuntuaciónTokens BPE nativosNo (post-proceso)
Idiomas40 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 defecto320 ms320 ms
Tamaño del bundle612 MB (CoreML INT8); 473 MB (MLX 4-bit)~150 MB
Elige Nemotron cuando…

…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.