Nemotron Streaming

NVIDIA'nın iki streaming ASR modeli, aynı Swift target'ı NemotronStreamingASR'ı paylaşır. İkisi de 600M parametreli cache-aware FastConformer encoder + RNN-T decoder kombinasyonudur, ikisi de noktalama ve büyük-küçük harf dönüşümünü normal BPE token'ları olarak native şekilde üretir, ikisi de CoreML üzerinden Apple Neural Engine'de çalışır; çok dilli sürüm ayrıca GPU-rezident çıkarım için MLX bundle'lara sahiptir. Uygulamanıza uygun olanı seçin:

SürümKapsamVarsayılan chunkUpstream
Nemotron 3.5 Çok Dilli40 dil-locale (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 (İngilizce)Yalnızca İngilizce — daha küçük bundle, daha düşük varsayılan gecikme160 msnvidia/nemotron-speech-streaming-en-0.6b

Ortak özellikler

Mimari

Her ses chunk'ı için boru hattı (pipeline) içinde üç CoreML modeli:

BileşenAçıklama
Encoder24 katmanlı cache-aware FastConformer, 1024 hidden. 32-frame'lik bir mel chunk (varsayılan 320 ms) ve altı state tensoru — attention KV cache [24, 1, 56, 1024], depthwise conv cache [24, 1, 1024, 8], pre_cache mel loopback ve prompt kernel'i süren 128-slotluk one-hot language_mask — alır.
Prompt kernelLinear(1152→2048) → ReLU → Linear(2048→1024) — dil one-hot'unu her encode edilmiş frame'e işler, böylece aynı 600M ağırlık 40 dil-locale'in tümüne hizmet eder.
Decoderİki katmanlı LSTM prediction network, 640 hidden. Önceki non-blank token'ı alır, bir embedding ve güncellenmiş (h, c) state'i üretir.
JointEncoder ve decoder çıktılarını 13 087 BPE token + blank üzerinde logits'e birleştirir. Noktalama, büyük harf ve dile özgü tag'ler BPE vocabulary'sinde sadece ek token'lardır — ayrı head yoktur.

EOU head yok

Parakeet-EOU'nun aksine Nemotron, ifade sonu için ayrı bir token üretmez. Sürekli sesi ifadelere bölmenin iki yolu:

  1. Harici VAD — session'ı Silero VAD ile eşleştirin; sürekli sessizlikte finalize() ile mevcut ifadeyi commit edin ve bir sonraki için createSession() çağırın.
  2. Noktalama sınırı — kısmi transcript ., ? veya ! ile bittiğinde bunu doğal bir commit işareti olarak alın. Ek model gerekmez, ancak sesin gerçekten sonlandırıcı noktalama üretmesine bağlıdır.

Bundle'lar

Nemotron-3.5-ASR-Streaming-0.6B'nin yayımlanmış dört sürümü, artı aynı Swift target üzerinde eski yalnızca-İngilizce modeli:

SürümDiskteStreaming tepe noktası (M5 Pro)HuggingFace
CoreML INT8 (varsayılan)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
Yalnızca İngilizce (CoreML INT8)~580 MBaufklarer/Nemotron-Speech-Streaming-0.6B-CoreML-INT8

Upstream: nvidia/nemotron-3.5-asr-streaming-0.6b (çok dilli) ve nvidia/nemotron-speech-streaming-en-0.6b (yalnızca İngilizce).

Kuantizasyon pratik olarak kayıpsızdır: CoreML INT8, MLX bf16 ve MLX 8-bit fp32 NeMo kaynağına göre ±0,3 pp WER içinde kalır. MLX 4-bit, en küçük disk boyutu ve streaming RSS'i karşılığında ortalama ~6 pp WER kaybına neden olur.

Hızlı başlangıç — toplu transkripsiyon

SpeechRecognitionModel'a uyduğu için, genel bir STT modeli alan herhangi bir kod yoluna doğrudan oturur:

import NemotronStreamingASR

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

Hızlı başlangıç — async streaming

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

Her PartialTranscript şunları taşır: text, isFinal (yalnızca finalize() sonrasındaki son partial için true), confidence ve monoton artan segmentIndex.

Uzun ömürlü session API'si (mikrofon girişi)

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) }

Komut satırı

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
Parametre600M120M
Encoder24 katmanlı FastConformer, 1024 hidden17 katmanlı FastConformer, 512 hidden
Decoder2-layer LSTM, RNN-T1-layer LSTM, RNN-T
EOU tespitiHarici (VAD veya noktalama)Yerleşik <EOU> token'ı
NoktalamaNative inline BPE token'larıHayır (post-process)
Diller40 dil-locale (en-US, en-GB, es-ES, fr-FR, de-DE, ja-JP, ko-KR, zh-CN, hi-IN, ar, …)25 Avrupa dili
Varsayılan chunk320 ms320 ms
Bundle boyutu612 MB (CoreML INT8); 473 MB (MLX 4-bit)~150 MB
Şu durumlarda Nemotron'u seçin…

çok dilli streaming transkripsiyona (40 dil-locale'den herhangi biri) noktalama ve büyük harf ile kutudan çıkar çıkmaz ihtiyaç duyuyorsanız ve ifadeleri kendi başınıza segmentlemekte sakınca görmüyorsanız (VAD veya noktalama ipucu). Yerleşik EOU sinyali olan yalnızca İngilizce, kısıtlı iOS dictation için Parakeet-EOU hâlâ daha küçük seçenektir.