Traduzione automatica · Originale inglese

Nemotron Streaming

Due modelli NVIDIA in streaming ASR condividono NemotronStreamingASR Swift Entrambi sono bersaglio. 600Gli encoder FastConformer con cache a parametri M abbinati ad un decoder RNN-T, emettono sia la punteggiatura nativa che la capitalizzazione come token BPE regolari, entrambi eseguiti sull'Apple Neural Engine via via via via CoreML, e la variante multilingue ha anche MLX fasci per l'inferenza di GPU-resident. Scegli quello che corrisponde alla tua applicazione:

VarianteCoperturaBlocco predefinitoA monte
Nemotron 3.5 multilingue40 lingua-locali320 msNvidia/nemotron-3.5-asr-streaming-0.6b
Nemotron Speech Streaming (inglese)Solo inglese — bundle più piccolo, latenza di default inferiore160 msNvidia/nemotron-speech-streaming-en-0.6b

Proprietà condivise

Architettura

Tre modelli CoreML conduttivi per gruppo audio:

ComponentiDesignazione
Encoder24-layer cache-aware FastConformer, 1024 nascosto, prende un 32- fotogramma mel chunk (320 ms default) più sei tensori di stato — attenzione cache KV [24, 1, 56, 1024], cache del conv profondo [24, 1, 1024, 8], pre_cache mel loopback, e un language_mask 128-slot one-hot che guida il kernel del prompt.
kernel PromptLineare(1152→2048) → ReLU → Lineare(2048→1024) — piega la lingua a un punto in ogni cornice codificata in modo che gli stessi pesi 600M servano tutti i 40 lingua-locali.
DecoderRete di previsione LSTM a due strati, nascosta 640. Consuma il precedente token non-blank, emette un incorporamento più aggiornato (h, c) Stato.
Joint Joint JointFusibili encoder e decoder uscite in logits oltre 13 087 BPE tokens + blank. Puntuazione, capitalizzazione e tag per lingua sono solo più gettoni nel vocab BPE — nessuna testa in più.

No, no, no.

A differenza di Parakeet-EOU, Nemotron non emette un token end-of-utterance dedicato. Due modi per segmentare l'audio continuo in espressioni:

  1. VAD esterno — abbinare la sessione con Silero VAD; su silenzio sostenuto, chiamata finalize() per commettere l'enunciazione attuale e createSession() per il prossimo.
  2. Limiti di valutazione — quando la trascrizione parziale termina in ., ? o !

Bundles

Cinque varianti pubblicate di Nemotron-3.5-ASR-Streaming-0.6B, più il modello di sola inglese più vecchio sullo stesso obiettivo Swift:

VarianteSu richiestaPicco di trasmissione ( M5 Pro)HuggingFace
CoreML INT8 (default)612 MB1238 MBaufklarer/Nemotron-3.5-ASR-Streaming-0.6B-CoreML-INT8
MLX bf161217 MB1474 MBaufklarer/...MLX-bf16
MLX 5-bit (predefinito nativo)MB 538.6MB 800aufklarer/...MLX-5bit
MLX 8 bit732.6 MB992 MBaufklarer/...MLX-8bit
MLX 4-bitMB 473MB 747aufklarer/...MLX-4bit
Solo in inglese ( CoreML INT8)~ 580 MB—aufklarer/Nemotron-Speech-Streaming-0.6B-CoreML-INT8

A monte: Nvidia/nemotron-3.5-asr-streaming-0.6b (multilingue) e Nvidia/nemotron-speech-streaming-en-0.6b (solo in inglese).

Sulla cache-aware reale 320 sentiero ms, MLX 5-bit medie 11.53% WER attraverso sei FLEURS lingue contro 11.01% per MLX 8- Il mio amico. 5-bit default salva circa 193 MB su disco e 192 MB di picco RSS; MLX 4-bit rimane un'esportazione di ricerca perché la sua perdita di qualità è più grande.

Avvio rapido — nativo MLX

Il Swift runtime supporta il pubblicato MLX 5-bit e 8-bit bundle. 5-bit, mantiene le cache di ogni sessione indipendenti e serializza l'inferenza quando le sessioni condividono un modello caricato. MLX utilizza il validato 320 ms geometria e attualmente non espongono la parola che aumenta.

import NemotronStreamingASR

let model = try await NemotronStreamingASRMLXModel.fromPretrained(
    variant: .int5
)
let session = try model.createSession(language: "en-US")

for chunk in microphoneChunks16kHz {
    for partial in try session.pushAudio(chunk) {
        print(partial.text)
    }
}
let final = try session.finalize().last?.text

Avvio rapido — CoreML

Conformi a SpeechRecognitionModel, così si scende in qualsiasi percorso di codice che prende un modello STT generico:

import NemotronStreamingASR

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

Avvio rapido — lo streaming asinc

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

Ciascuno PartialTranscript trasporta text, isFinal (vero solo per l'ultimo parziale dopo finalize()), confidence, e un monotonico segmentIndex.

Sessione di lunga durata API (input dinamico)

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

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, Japanese
speech transcribe meeting.wav   --engine nemotron --language de-DE                    # any of the 40 locales

Nemotron vs Parakeet-EOU

Nemotron Streaming 0.6BParakeet-EOU 120M
Parametri600M120M
Encoder24 strati FastConformer, 1024 nascosto17 strati FastConformer, 512 nascosto
Decoder2 strati LSTM, RNN-T1 strato LSTM, RNN-T
Rilevamento EOUEsterno (VAD o punteggiatura)Incorporato <EOU> token
PuntuazioneToken BPE in linea nativoNo (post-processo)
Lingue40 lingua-locali25 euro
Blocco predefinito320 ms320 ms
Dimensione del Bundle612 MB ( CoreML INT8); 538.6 MB (nativo MLX 5-bit)~ 150 MB
Scegliere Nemotron quando...

...è necessario multilingue multilingue trascrizione di streaming (qualsiasi lingua-locale 40) con punteggiatura e capitalizzazione fuori dalla scatola, e sei OK segmentando pronuncia te stesso (VAD o punctuation cue). Per il distacco iOS deviazione che è inglese-solo con un segnale EOU incorporato, Parakeet-EOU scelta è ancora più piccola.

Test di regressione

La regressione a sovrapposizione utilizza un check-in WAV con due Kokoro voci: il secondo inizia 320 ms più tardi ed è attenuato da 3 dB. Ogni decodificatore deve produrre una trascrizione non vuota senza tag di lingua. L'audio fisso rimuove la variabilità della sintesi dal vivo, e il flusso di lavoro notturno corre Nemotron nel proprio shard. Core ML regressione con la stessa impostazione della CPU solo di notte:

SPEECH_COREML_COMPUTE_UNITS=cpuOnly \
  swift test --disable-sandbox --no-parallel \
    --filter '^NemotronStreamingASRTests[.]E2ENemotronHarshAudioTests/'