Nemotron Streaming

Nemotron-Speech-Streaming-0.6B es el ASR de streaming en inglés de baja latencia de NVIDIA: un codificador FastConformer con caché junto a un decodificador RNN-T, con puntuación y mayúsculas emitidas como tokens BPE regulares. El paquete CoreML disponible aquí incluye un codificador con paletización INT8 y se ejecuta en el Apple Neural Engine.

Qué es

Arquitectura

Tres modelos CoreML encadenados por cada bloque de audio:

ComponentDescription
Codificador24-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.
DecodificadorTwo-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.

Sin cabeza 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 — combina la sesión con Silero VAD; ante silencio sostenido, llama a finalize() para confirmar el enunciado actual y createSession() para el siguiente.
  2. Frontera de puntuación — cuando la transcripción parcial termina en ., ? o !, trátalo como una señal natural de confirmación. Sin modelo adicional, pero depende de que el audio induzca realmente puntuación terminal.

Modelo

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 (punto de control .nemo de NeMo).

Inicio rápido — transcripción por lotes

Cumple con SpeechRecognitionModel, así que encaja en cualquier 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)

Inicio rápido — streaming asíncrono

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

Cada PartialTranscript lleva text, isFinal (true solo en el último parcial tras finalize()), confidence y un segmentIndex monótono.

API de sesión persistente (entrada de micrófono)

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 frente a Parakeet-EOU

Nemotron Streaming 0.6BParakeet-EOU 120M
Parámetros600M120M
Encoder24-layer FastConformer, 1024 hidden17-layer FastConformer, 512 hidden
Decoder2-layer LSTM, RNN-T1-layer LSTM, RNN-T
Detección EOUExterna (VAD o puntuación)Token <EOU> integrado
PuntuaciónTokens BPE nativos en líneaNo (postprocesado)
IdiomasSolo inglés25 europeos
Bloque predeterminado160 ms320 ms
Tamaño del paquete~580 MB~150 MB
Elige Nemotron cuando…

…quieras una transcripción en inglés de mayor calidad con puntuación y mayúsculas listas de serie, y te sientas cómodo segmentando enunciados tú mismo (VAD o punto de puntuación). Para dictado iOS restringido con una señal EOU integrada, Parakeet-EOU sigue siendo la opción más pequeña y simple.