Nemotron Streaming
โมเดล ASR แบบสตรีมจาก NVIDIA สองตัวใช้ Swift target NemotronStreamingASR ร่วมกัน ทั้งคู่เป็น FastConformer encoder แบบ cache-aware ขนาด 600M พารามิเตอร์จับคู่กับ RNN-T decoder ทั้งคู่ส่งเครื่องหมายวรรคตอนและตัวพิมพ์ใหญ่-เล็กออกมาแบบ native เป็น BPE token ปกติ ทั้งคู่ทำงานบน Apple Neural Engine ผ่าน CoreML และเวอร์ชันหลายภาษามี MLX bundle เพิ่มเติมสำหรับการอินเฟอเรนซ์ที่ประจำอยู่บน GPU เลือกตัวที่ตรงกับแอปของคุณ:
| เวอร์ชัน | ขอบเขต | chunk เริ่มต้น | Upstream |
|---|---|---|---|
| Nemotron 3.5 หลายภาษา | 40 locale ภาษา (en-US, en-GB, es-ES, fr-FR, de-DE, ja-JP, ko-KR, zh-CN, hi-IN, ar, …) | 320 ms | nvidia/nemotron-3.5-asr-streaming-0.6b |
| Nemotron Speech Streaming (อังกฤษ) | เฉพาะภาษาอังกฤษ — bundle เล็กกว่า ความหน่วงเริ่มต้นต่ำกว่า | 160 ms | nvidia/nemotron-speech-streaming-en-0.6b |
คุณสมบัติร่วม
- วรรคตอนและตัวพิมพ์ใหญ่-เล็กแบบ native — ไม่ต้อง post-processor; จุด เครื่องหมายจุลภาค และตัวพิมพ์เป็นส่วนหนึ่งของ vocabulary
- 600M พารามิเตอร์ — FastConformer encoder แบบ cache-aware 24 ชั้น + LSTM RNN-T decoder 2 ชั้น + joint network
- สตรีมแบบ cache-aware — attention และ conv cache ไหลข้าม chunk เพื่อรักษาบริบทต่อเนื่องข้ามขอบ chunk
- ขนาด chunk หลากหลาย — หลายภาษา: 80, 320, 560, 1120 ms (เริ่มต้น 320 ms); อังกฤษ: 80, 160, 560, 1120 ms (เริ่มต้น 160 ms)
- เฉพาะหลายภาษา: prompt kernel (Linear 1152→2048→1024) แทรก one-hot ของช่องภาษาเข้าไปในทุกเฟรมที่ encode เสร็จ น้ำหนักชุดเดียวกันจึงรองรับครบ 40 locale ภาษา เวอร์ชันเฉพาะอังกฤษไม่มี prompt kernel
สถาปัตยกรรม
สาม CoreML model ทำงานแบบ pipeline ต่อหนึ่ง audio chunk:
| องค์ประกอบ | คำอธิบาย |
|---|---|
| Encoder | FastConformer แบบ cache-aware 24 ชั้น 1024 hidden รับ mel chunk 32 เฟรม (เริ่มต้น 320 ms) พร้อมเทนเซอร์สถานะ 6 ตัว — attention KV cache [24, 1, 56, 1024], depthwise conv cache [24, 1, 1024, 8], pre_cache mel loopback และ one-hot language_mask 128 ช่อง ที่ขับเคลื่อน prompt kernel |
| Prompt kernel | Linear(1152→2048) → ReLU → Linear(2048→1024) — แทรก one-hot ของภาษาเข้าไปในทุกเฟรมที่ encode น้ำหนัก 600M ชุดเดียวกันจึงรองรับครบ 40 locale ภาษา |
| Decoder | LSTM prediction network สองชั้น 640 hidden รับ token non-blank ก่อนหน้า แล้วส่ง embedding และสถานะ (h, c) ที่อัปเดตออกมา |
| Joint | รวมเอาต์พุตของ encoder และ decoder เป็น logits บน 13 087 BPE token + blank วรรคตอน ตัวพิมพ์ใหญ่-เล็ก และ tag ต่อภาษา ล้วนเป็น token เพิ่มเติมใน BPE vocabulary — ไม่มี head แยก |
ไม่มี head EOU
ต่างจาก Parakeet-EOU, Nemotron ไม่ส่ง token เฉพาะสำหรับจบ utterance สองวิธีในการแบ่งเสียงต่อเนื่องเป็น utterance:
- VAD ภายนอก — จับคู่ session กับ Silero VAD; เมื่อเงียบต่อเนื่อง เรียก
finalize()เพื่อ commit utterance ปัจจุบัน และcreateSession()สำหรับครั้งถัดไป - ขอบเขตวรรคตอน — เมื่อ partial transcript ลงท้ายด้วย
.,?หรือ!ให้ถือเป็นสัญญาณ commit ตามธรรมชาติ ไม่ต้องมีโมเดลเพิ่ม แต่ขึ้นอยู่กับว่าเสียงจริง ๆ จะกระตุ้นให้เกิดวรรคตอนสุดท้ายหรือไม่
Bundle
สี่ตัวแปรที่เผยแพร่ของ Nemotron-3.5-ASR-Streaming-0.6B พร้อมโมเดลเฉพาะอังกฤษรุ่นเก่ากว่าบน Swift target เดียวกัน:
| เวอร์ชัน | บนดิสก์ | พีคสตรีม (M5 Pro) | HuggingFace |
|---|---|---|---|
| CoreML INT8 (เริ่มต้น) | 612 MB | 1238 MB | aufklarer/Nemotron-3.5-ASR-Streaming-0.6B-CoreML-INT8 |
| MLX bf16 | 1217 MB | 1474 MB | aufklarer/…MLX-bf16 |
| MLX 8-bit | 732 MB | 997 MB | aufklarer/…MLX-8bit |
| MLX 4-bit | 473 MB | 747 MB | aufklarer/…MLX-4bit |
| เฉพาะอังกฤษ (CoreML INT8) | ~580 MB | — | aufklarer/Nemotron-Speech-Streaming-0.6B-CoreML-INT8 |
Upstream: nvidia/nemotron-3.5-asr-streaming-0.6b (หลายภาษา) และ nvidia/nemotron-speech-streaming-en-0.6b (เฉพาะอังกฤษ).
การทำ quantization แทบไม่สูญเสียคุณภาพ: CoreML INT8, MLX bf16 และ MLX 8-bit อยู่ภายใน ±0.3 pp WER เทียบกับต้นทาง fp32 NeMo. MLX 4-bit เสีย WER เฉลี่ยประมาณ 6 pp แลกกับขนาดดิสก์และ RSS สตรีมที่เล็กที่สุด
เริ่มต้นอย่างรวดเร็ว — ถอดเสียงแบบ batch
เป็นไปตาม SpeechRecognitionModel ดังนั้นจึงใส่ได้ทุกเส้นทางโค้ดที่รับโมเดล STT ทั่วไป:
import NemotronStreamingASR
let model = try await NemotronStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000, language: "en-US")
เริ่มต้นอย่างรวดเร็ว — สตรีมแบบ async
for await partial in model.transcribeStream(audio: samples, sampleRate: 16000) {
if partial.isFinal { print("FINAL: \(partial.text)") }
else { print("... \(partial.text)") }
}
PartialTranscript แต่ละตัวมี text, isFinal (เป็น true เฉพาะ partial สุดท้ายหลัง finalize()), confidence และ segmentIndex ที่เพิ่มขึ้นแบบเอกฐาน
API session อายุยาว (รับข้อมูลจากไมโครโฟน)
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) }
บรรทัดคำสั่ง
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 เทียบกับ Parakeet-EOU
| Nemotron Streaming 0.6B | Parakeet-EOU 120M | |
|---|---|---|
| พารามิเตอร์ | 600M | 120M |
| Encoder | FastConformer 24 ชั้น 1024 hidden | FastConformer 17 ชั้น 512 hidden |
| Decoder | 2-layer LSTM, RNN-T | 1-layer LSTM, RNN-T |
| การตรวจจับ EOU | ภายนอก (VAD หรือวรรคตอน) | token <EOU> ในตัว |
| วรรคตอน | BPE token แบบ inline ใน native | ไม่ (post-process) |
| ภาษา | 40 locale ภาษา (en-US, en-GB, es-ES, fr-FR, de-DE, ja-JP, ko-KR, zh-CN, hi-IN, ar, …) | 25 ภาษายุโรป |
| chunk เริ่มต้น | 320 ms | 320 ms |
| ขนาด bundle | 612 MB (CoreML INT8); 473 MB (MLX 4-bit) | ~150 MB |
…คุณต้องการถอดเสียงแบบสตรีม หลายภาษา (locale ใด ๆ ใน 40 locale) พร้อมวรรคตอนและตัวพิมพ์ใหญ่-เล็กแบบพร้อมใช้งาน และยอมรับการแบ่ง utterance เอง (VAD หรือสัญญาณวรรคตอน) สำหรับ dictation บน iOS ที่ทรัพยากรจำกัด เฉพาะภาษาอังกฤษ และมีสัญญาณ EOU ในตัว Parakeet-EOU ยังคงเป็นทางเลือกที่เล็กกว่า