Nemotron स्ट्रीमिंग
NVIDIA के दो स्ट्रीमिंग ASR मॉडल एक ही Swift target NemotronStreamingASR साझा करते हैं। दोनों 600M पैरामीटर वाले cache-aware FastConformer एनकोडर हैं और RNN-T डिकोडर के साथ जोड़े गए हैं, दोनों विराम चिह्न और कैपिटलाइज़ेशन को सामान्य BPE टोकन के रूप में नेटिव रूप से देते हैं, दोनों CoreML के माध्यम से Apple Neural Engine पर चलते हैं, और बहुभाषी संस्करण के पास GPU-रेज़िडेंट इन्फेरेंस के लिए MLX बंडल भी हैं। अपने अनुप्रयोग के अनुसार चुनें:
| वेरिएंट | कवरेज | डिफ़ॉल्ट chunk | Upstream |
|---|---|---|---|
| Nemotron 3.5 बहुभाषी | 40 भाषा-लोकेल (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 (अंग्रेज़ी) | केवल अंग्रेज़ी — छोटा बंडल, कम डिफ़ॉल्ट विलंबता | 160 ms | nvidia/nemotron-speech-streaming-en-0.6b |
साझा गुण
- नेटिव विराम चिह्न और कैपिटलाइज़ेशन — पोस्ट-प्रोसेसर की आवश्यकता नहीं; पूर्ण विराम, अल्पविराम और केस शब्दावली का हिस्सा हैं
- 600M पैरामीटर — cache-aware 24-परत FastConformer एनकोडर + 2-परत LSTM RNN-T डिकोडर + joint नेटवर्क
- Cache-aware स्ट्रीमिंग — attention और conv कैश chunk से 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 भाषा स्लॉट जोड़ता है, इसलिए वही वज़न सभी 40 भाषा-लोकेल को सेवा देते हैं। केवल-अंग्रेज़ी संस्करण में prompt kernel नहीं है।
आर्किटेक्चर
प्रत्येक ऑडियो chunk पर तीन CoreML मॉडल pipeline में:
| घटक | विवरण |
|---|---|
| एनकोडर | 24-परत cache-aware FastConformer, 1024 hidden। 32-फ्रेम mel chunk (डिफ़ॉल्ट 320 ms) के साथ छह स्टेट टेंसर लेता है — attention KV कैश [24, 1, 56, 1024], depthwise conv कैश [24, 1, 1024, 8], pre_cache mel लूपबैक और prompt kernel को चलाने वाला 128-स्लॉट one-hot language_mask। |
| Prompt kernel | Linear(1152→2048) → ReLU → Linear(2048→1024) — हर एनकोडेड फ्रेम में भाषा one-hot जोड़ता है, इसलिए वही 600M वज़न सभी 40 भाषा-लोकेल को सेवा देते हैं। |
| डिकोडर | दो-परत LSTM प्रेडिक्शन नेटवर्क, 640 hidden। पिछला non-blank टोकन लेता है, एक embedding और अद्यतित (h, c) स्टेट उत्सर्जित करता है। |
| Joint | एनकोडर और डिकोडर आउटपुट को 13 087 BPE टोकन + blank पर logits में मिलाता है। विराम चिह्न, कैपिटलाइज़ेशन और प्रति-भाषा टैग — सब BPE शब्दावली में अतिरिक्त टोकन हैं — अलग heads नहीं। |
कोई EOU head नहीं
Parakeet-EOU के विपरीत, Nemotron कथन-अंत के लिए समर्पित टोकन उत्सर्जित नहीं करता। निरंतर ऑडियो को कथनों में विभाजित करने के दो तरीके:
- बाहरी VAD — सत्र को Silero VAD से जोड़ें; निरंतर मौन पर
finalize()कॉल करें ताकि वर्तमान कथन कमिट हो औरcreateSession()अगले के लिए। - विराम चिह्न सीमा — जब आंशिक ट्रांसक्रिप्ट
.,?या!पर समाप्त होती है, उसे प्राकृतिक कमिट संकेत मानें। कोई अतिरिक्त मॉडल नहीं, पर इस पर निर्भर है कि ऑडियो वास्तव में अंतिम विराम चिह्न प्रेरित करे।
बंडल
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 (केवल अंग्रेज़ी)।
क्वांटाइज़ेशन वस्तुतः निर्बाध है: CoreML INT8, MLX bf16 और MLX 8-bit fp32 NeMo स्रोत के ±0.3 pp WER के भीतर हैं। MLX 4-bit सबसे छोटे डिस्क आकार और स्ट्रीमिंग RSS के बदले लगभग 6 pp औसत WER खर्च करता है।
त्वरित आरंभ — बैच ट्रांसक्रिप्शन
SpeechRecognitionModel के अनुरूप, इसलिए किसी भी कोड पाथ में फिट हो जाता है जो जेनेरिक STT मॉडल लेता है:
import NemotronStreamingASR
let model = try await NemotronStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000, language: "en-US")
त्वरित आरंभ — एसिंक स्ट्रीमिंग
for await partial in model.transcribeStream(audio: samples, sampleRate: 16000, language: "ja-JP") {
if partial.isFinal { print("FINAL: \(partial.text)") }
else { print("... \(partial.text)") }
}
हर PartialTranscript में text, isFinal (केवल finalize() के बाद अंतिम आंशिक के लिए true), confidence, और मोनोटोनिक रूप से बढ़ता segmentIndex होता है।
दीर्घ-जीवी सत्र API (माइक इनपुट)
let session = try model.createSession(language: "en-US")
// 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
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 |
| एनकोडर | 24-परत FastConformer, 1024 hidden | 17-परत FastConformer, 512 hidden |
| डिकोडर | 2-layer LSTM, RNN-T | 1-layer LSTM, RNN-T |
| EOU डिटेक्शन | बाहरी (VAD या विराम चिह्न) | अंतर्निर्मित <EOU> टोकन |
| विराम चिह्न | नेटिव इनलाइन BPE टोकन | नहीं (पोस्ट-प्रोसेस) |
| भाषाएं | 40 भाषा-लोकेल (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 |
| बंडल आकार | 612 MB (CoreML INT8); 473 MB (MLX 4-bit) | ~150 MB |
…आपको बॉक्स-से-बाहर विराम चिह्न और कैपिटलाइज़ेशन के साथ बहुभाषी स्ट्रीमिंग ट्रांसक्रिप्शन चाहिए (40 भाषा-लोकेल में से कोई भी) और कथनों को स्वयं विभाजित करना (VAD या विराम चिह्न संकेत) ठीक है। संसाधन-सीमित iOS dictation के लिए जो केवल अंग्रेज़ी हो और जिसमें अंतर्निर्मित EOU संकेत हो, Parakeet-EOU अभी भी छोटा विकल्प है।