Nemotron Streaming

Nemotron-Speech-Streaming-0.6B คือ ASR สตรีมมิ่งภาษาอังกฤษความหน่วงต่ำของ NVIDIA: encoder FastConformer แบบ cache-aware จับคู่กับ decoder RNN-T พร้อมเครื่องหมายวรรคตอนและตัวพิมพ์ใหญ่เนทีฟที่ส่งออกในรูปของโทเค็น BPE ปกติ บันเดิล CoreML บนเว็บไซต์นี้มาพร้อม encoder ที่ palettize เป็น INT8 และทำงานบน Apple Neural Engine

คืออะไร

สถาปัตยกรรม

โมเดล CoreML สามตัวที่ pipeline ต่อ chunk เสียง:

ส่วนประกอบคำอธิบาย
EncoderFastConformer แบบ cache-aware 24 ชั้น hidden 1024 รับ chunk mel 17 เฟรม (ดีฟอลต์ 160 ms) บวกห้าเทนเซอร์สถานะ — KV cache attention [24, 1, 70, 1024] แคช conv แบบ depthwise [24, 1, 1024, 8] และ pre_cache mel loopback ที่นำเสียงในอดีตล่าสุดมาต่อหน้าเพื่อให้ขอบเขต chunk ต่อเนื่อง
Decoderเครือข่ายทำนาย LSTM สองชั้น hidden 640 บริโภคโทเค็น non-blank ก่อนหน้า ส่งออกเอ็มเบดดิงพร้อมสถานะ (h, c) ที่อัปเดต
Jointหลอมรวมเอาต์พุตของ encoder และ decoder ให้เป็น logits บนโทเค็น BPE 1024 ตัว + blank เครื่องหมายวรรคตอนและตัวพิมพ์ใหญ่เป็นเพียงโทเค็นเพิ่มเติมในคำศัพท์ BPE — ไม่มี head เพิ่มเติม

ไม่มี head EOU

ต่างจาก Parakeet-EOU, Nemotron ไม่ส่งออกโทเค็น end-of-utterance ที่กำหนดเฉพาะ มีสองวิธีในการแบ่งเสียงต่อเนื่องเป็นประโยค:

  1. VAD ภายนอก — จับคู่เซสชันกับ Silero VAD; เมื่อเงียบยาว ให้เรียก finalize() เพื่อ commit ประโยคปัจจุบัน และ createSession() สำหรับประโยคถัดไป
  2. ขอบเขตเครื่องหมายวรรคตอน — เมื่อข้อความบางส่วนจบด้วย . ? หรือ ! ให้ถือว่าเป็นสัญญาณ commit ตามธรรมชาติ ไม่ต้องใช้โมเดลเพิ่ม แต่ต้องอาศัยให้เสียงจริง ๆ ทำให้เกิดเครื่องหมายวรรคตอนปิดท้าย

โมเดล

ส่วนประกอบขนาดHuggingFace
Encoder (INT8)562 MBaufklarer/Nemotron-Speech-Streaming-0.6B-CoreML-INT8
Decoder14 MB
Joint3.3 MB

Upstream: nvidia/nemotron-speech-streaming-en-0.6b (checkpoint .nemo ของ NeMo)

เริ่มต้นด่วน — การถอดเสียงแบบ batch

เป็นไปตาม SpeechRecognitionModel จึงเสียบเข้าไปในเส้นทางโค้ดใด ๆ ที่รับโมเดล STT ทั่วไปได้:

import NemotronStreamingASR

let model = try await NemotronStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000)

เริ่มต้นด่วน — สตรีมมิ่งแบบ 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 (จริงเฉพาะกับ partial ตัวสุดท้ายหลัง finalize()), confidence และ segmentIndex ที่เป็นโมโนโทนิก

API เซสชันอายุยาว (อินพุตจากไมโครโฟน)

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                    # batch
speech transcribe recording.wav --engine nemotron --stream           # streaming final
speech transcribe recording.wav --engine nemotron --stream --partial # with partials

Nemotron เทียบกับ Parakeet-EOU

Nemotron Streaming 0.6BParakeet-EOU 120M
พารามิเตอร์600M120M
EncoderFastConformer 24 ชั้น hidden 1024FastConformer 17 ชั้น hidden 512
DecoderLSTM 2 ชั้น, RNN-TLSTM 1 ชั้น, RNN-T
การตรวจจับ EOUภายนอก (VAD หรือเครื่องหมายวรรคตอน)โทเค็น <EOU> ในตัว
เครื่องหมายวรรคตอนโทเค็น BPE เนทีฟแบบอินไลน์ไม่มี (ประมวลผลภายหลัง)
ภาษาเฉพาะภาษาอังกฤษ25 ภาษายุโรป
Chunk ดีฟอลต์160 ms320 ms
ขนาดบันเดิล~580 MB~150 MB
เลือก Nemotron เมื่อ…

…คุณต้องการข้อความถอดเสียงภาษาอังกฤษคุณภาพสูงขึ้นพร้อมเครื่องหมายวรรคตอนและตัวพิมพ์ใหญ่พร้อมใช้งาน และคุณยอมรับการแบ่งประโยคด้วยตนเองได้ (VAD หรือสัญญาณเครื่องหมายวรรคตอน) สำหรับการเขียนตามคำบอกบน iOS ที่จำกัดทรัพยากรพร้อมสัญญาณ EOU ในตัว Parakeet-EOU ยังคงเป็นตัวเลือกที่เล็กและเรียบง่ายกว่า