بث Nemotron
نموذجان للتعرف على الكلام بالبث من NVIDIA يتقاسمان هدف Swift نفسه NemotronStreamingASR. كلاهما يضم مرمِّز FastConformer واعٍ بالذاكرة المؤقتة بـ 600 مليون معامل مقترن بفاكّ ترميز RNN-T، وكلاهما يُخرج علامات الترقيم والحالة الأصلية كرموز BPE اعتيادية، وكلاهما يعمل على محرك Apple Neural Engine عبر CoreML؛ كما يتوفر للنسخة متعددة اللغات حزم MLX إضافية للاستدلال المقيم على وحدة معالجة الرسوميات. اختر ما يناسب تطبيقك:
| النسخة | التغطية | Chunk الافتراضي | المصدر |
|---|---|---|---|
| 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 |
خصائص مشتركة
- علامات ترقيم وحالة أحرف أصلية — لا حاجة إلى معالج لاحق؛ النقاط والفواصل والحالة جزء من المفردات
- 600 مليون معامل — مرمِّز FastConformer واعٍ بالذاكرة المؤقتة من 24 طبقة + فاكّ ترميز LSTM RNN-T من طبقتين + شبكة joint
- بث واعٍ بالذاكرة المؤقتة — تتدفق ذاكرات الانتباه والالتفاف بين الـ chunks للحفاظ على السياق المستمر عبر حدودها
- أحجام chunk متعددة — متعدد اللغات: 80، 320، 560، 1120 مللي ثانية (الافتراضي 320)؛ الإنجليزية: 80، 160، 560، 1120 مللي ثانية (الافتراضي 160)
- للنسخة متعددة اللغات فقط: ينسج prompt kernel (Linear 1152→2048→1024) فتحة لغة من نوع one-hot في كل إطار مرمَّز، فتخدم الأوزان ذاتها جميع المواضع اللغوية الأربعين. لا يوجد prompt kernel في النسخة الإنجليزية فقط.
البنية المعمارية
ثلاثة نماذج CoreML في خط أنابيب لكل chunk صوتي:
| المكوّن | الوصف |
|---|---|
| المرمِّز | FastConformer واعٍ بالذاكرة المؤقتة من 24 طبقة، 1024 hidden. يأخذ chunk مل من 32 إطارًا (افتراضيًا 320 مللي ثانية) إضافة إلى ستة موتّرات حالة — ذاكرة attention KV [24, 1, 56, 1024]، ذاكرة depthwise conv [24, 1, 1024, 8]، استرداد mel عبر pre_cache، وقناع لغوي language_mask من نوع one-hot بـ 128 خانة يُحرّك prompt kernel. |
| Prompt kernel | Linear(1152→2048) → ReLU → Linear(2048→1024) — ينسج one-hot اللغة في كل إطار مرمَّز، فتخدم نفس الـ 600 مليون وزن جميع المواضع اللغوية الأربعين. |
| فاكّ الترميز | شبكة تنبؤ LSTM من طبقتين، 640 hidden. يستهلك الرمز السابق غير الفارغ ويُخرج embedding وحالة (h, c) محدّثة. |
| Joint | يدمج مخرجات المرمِّز وفاكّ الترميز في logits على 13 087 رمز BPE + الرمز الفارغ. علامات الترقيم والحالة وعلامات اللغة كلها مجرد رموز إضافية في مفردات BPE — لا توجد رؤوس مخصّصة. |
لا توجد رأس EOU
بخلاف Parakeet-EOU، لا يُصدر Nemotron رمزًا مخصّصًا لنهاية النطق. هناك طريقتان لتجزئة الصوت المستمر إلى نطقات:
- VAD خارجي — اقترن الجلسة بـ Silero VAD؛ عند الصمت المستمر، استدعِ
finalize()لتأكيد النطق الحالي وcreateSession()للنطق التالي. - حدود الترقيم — عندما ينتهي التفريغ الجزئي بـ
.أو?أو!، عامل ذلك كإشارة تأكيد طبيعية. لا حاجة إلى نموذج إضافي، لكن يعتمد على أن الصوت يحفّز فعلاً ترقيمًا ختاميًا.
الحزم
أربع نسخ منشورة من Nemotron-3.5-ASR-Streaming-0.6B، إضافة إلى النموذج الإنجليزي فقط الأقدم على نفس هدف Swift:
| النسخة | الحجم على القرص | ذروة البث (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 |
المصدر: nvidia/nemotron-3.5-asr-streaming-0.6b (متعدد اللغات) وnvidia/nemotron-speech-streaming-en-0.6b (الإنجليزية فقط).
التكميم فعليًا بلا فقد: CoreML INT8 و MLX bf16 و MLX 8-bit جميعها ضمن ±0.3 نقطة WER من مصدر fp32 NeMo. تكلّف MLX 4-bit نحو 6 نقاط WER في المتوسط مقابل أصغر حجم على القرص وأقل ذروة RSS أثناء البث.
بدء سريع — تفريغ دفعي
يحقق 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) {
if partial.isFinal { print("FINAL: \(partial.text)") }
else { print("... \(partial.text)") }
}
يحمل كل PartialTranscript: text، isFinal (true فقط للنتيجة الجزئية الأخيرة بعد finalize())، confidence، وsegmentIndex رتيب تصاعديًا.
واجهة جلسة طويلة الأمد (دخل الميكروفون)
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 |
| المرمِّز | FastConformer من 24 طبقة، 1024 hidden | FastConformer من 17 طبقة، 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 م.بايت (CoreML INT8)؛ 473 م.بايت (MLX 4-bit) | ~150 م.بايت |
…تحتاج إلى تفريغ بث متعدد اللغات (أيٌّ من 40 مَوضِعًا لغويًا) مع ترقيم وحالة أحرف جاهزة من الصندوق، وتقبل أن تجزّئ النطقات بنفسك (عبر VAD أو إشارة ترقيم). أما للإملاء على iOS بإمكانيات محدودة بالإنجليزية فقط مع إشارة EOU مدمجة، فإن Parakeet-EOU يبقى الخيار الأصغر.