Maskinöversättning · Engelskt original

Nemotron Streaming

Två NVIDIA streaming ASR modeller delar NemotronStreamingASR Swift-målet. Båda är 600M-parameter cache-aware FastConformer-kodare parade med en RN-T-avkodare, både avger infödda skiljetecken och kapitalisering som vanliga BPE-tokens, båda körs på Apple Neural Engine via CoreML, och den flerspråkiga varianten har dessutom MLX buntar för GPU-bostadsinferens.

VariantTäckningDefault chunkUpstream
Nemotron 3.5 Multilingual40 språklokaler (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 (engelska)Engelska bara - mindre bunt, lägre standard latens160 msnvidia/nemotron-speech-streaming-en-0.6b

Delade egenskaper

Arkitektur

Tre CoreML modeller pipelined per audio chunk:

KomponentBeskrivning
Encoder24-lagers cache-aware FastConformer, 1024 dold. tar en 32-rams mel chunk (320 ms standard) plus sex statliga tensorer - uppmärksamhet KV cache [24, 1, 56, 1024], sidled konv cache [ 24, 1, 1024, 8], pre_cache mel loopback, och en language_mask 128-slot one-hot som driver prompel.
Prompt kernelLinjär (1152 →2048) → ReLU → Linjär (2048 → 1024) - viker språket en-het i varje kodade ram så att samma 600M vikter tjänar alla 40 språklokaler.
DecoderTvåskikts LSTM-prediktionsnätverk, 640 dolda. Konsumerar den tidigare icke-blank token, avger ett inbäddnings plus uppdaterat (h, c)-tillstånd.
JointFuses kodare och avkodare utgångar i logiter över 13 087 BPE tokens + blank. Punctuation, kapitalization och per-language taggar är bara fler tokens i BPE vocab - inga extra huvuden.

Inget EOU huvud

Till skillnad från Parakeet-EOU avger Nemotron inte ett dedikerat tokenstoken. Två sätt att segmentera kontinuerligt ljud till yttranden:

  1. External VAD -- par sessionen med Silero VAD; på långvarig tystnad, ring finalize() för att begå det aktuella yttrandet och createSession()
  2. Punctuation boundary - när den partiella transkript slutar i ., ?, eller !, behandla det som en naturlig begå cue. Ingen extra modell, men beror på att ljudet faktiskt inducerar terminal skiljetecken.

Bundles

Fem publicerade varianter av Nemotron-3.5-ASR-Streaming-0.6B, plus den äldre engelsk-bara modellen på samma Swift mål:

VariantOn-diskStreaming topp (M5 Pro)HuggingFace
CoreML INT8 (standard)612 MB1238 MBaufklarer/Nemotron-3.5-ASR-Streaming-0.6B-CoreML-INT8
MLX bf161217 MB1474 MBaufklarer/...MLX-bf16
MLX 5-bitars (infödd standard)538.6 MB800 MBaufklarer/...MLX-5bit
MLX 8-bitars732,6 MB992 MBaufklarer/...MLX-8bit
MLX 4-bitars473 MB747 MBaufklarer/...MLX-4bit
Engelsk-bara (CoreML INT8)~580 MB—aufklarer/Nemotron-Speech-Streaming-0.6B-CoreML-INT8

Upstream: nvidia/nemotron-3.5-asr-streaming-0.6b (multilingual) och nvidi/nemotron-speech-streaming-en-0.6b (endast engelska).

På den faktiska cache-aware 320 ms bana, MLX 5-bitars genomsnitt 11,53% WER över sex FLEURS språk kontra 11,01% för MLX 8-bit. 5-bits standard sparar ca 193 MB på disk och 192 MB topp RSS; MLX 4-bit förblir en export eftersom dess förlust kvalitet är större.

Snabbstart - infödd MLX streaming

Den Swift runtime stöder den publicerade MLX 5-bitars och 8-bitar paket. Det standarder till 5-bit, håller varje sessions caches oberoende och serialiserar slutsatsen när sessioner delar en laddad modell. MLX använder den validerade 320 ms geometri och för närvarande inte exponerar ordet boosting.

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

Snabbstart - CoreML batch transkription

Överensstämmer med SpeechRecognitionModel, så det faller i någon kodbana som tar en generisk STT-modell:

import NemotronStreamingASR

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

Snabbstart - Async streaming

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

Varje PartialTranscript bär text, isFinal (endast för den sista partiella efter finalize()), confidence och en monotonic segmentIndex.

Långlivad session API (mikinput)

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
Parametrar600M120M
Encoder24-skiktet FastConformer, 1024 dold17-skiktet FastConformer, 512 dolda
Decoder2-skikt LSTM, RNN-T1-skiktet LSTM, RNN-T
EOU-detekteringExtern (VAD eller punktering)Inbyggd <EOU> token
PunctuationNative Inline BPE TokensIngen (efter-processen)
Språk40 språklokaler (en-US, en-GB, es-ES, fr-FR, de-DE, ja-JP, ko-KR, zh-CN, hi-IN, ar, ...)25 Europeiska
Default chunk320 ms320 ms
Bundle storlek612 MB (CoreML INT8); 538,6 MB (infödd MLX 5-bit)~150 MB
Välj Nemotron när...

...du behöver flerspråkig streaming transkription (någon av 40 språklokaler) med skiljetecken och kapitalisering ur lådan, och du är OK segmenterar yttranden själv (VAD eller skiljedomskö). För nedsatt enhet iOS diktation som endast är engelsk med en inbyggd EOU-signal är Parakeet-EOU fortfarande det mindre valet.

Regressionstester

Den överlappande-tal regression använder en incheckad incheckning WAV med två Kokoro röster: den andra startar 320 ms senare och är försvagad av 3 dB. Varje avkodning måste producera ett icke-tomt transkript utan språk taggar. Det fasta ljudet tar bort levande syntesvariation, och det nattliga arbetsflödet körs. Nemotron I sin egen skägg. Kör Core ML regression med samma CPU-bara inställning som nattlig:

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