المحاذاة الإجبارية
يوفّر Qwen3-ForcedAligner محاذاة طوابع زمنية على مستوى الكلمة للصوت. يُجري تمريرة أمامية واحدة غير ذاتيّة الانحدار لمحاذاة كل كلمة في نصّ تفريغ مع موضعها الدقيق في الموجة الصوتية.
كيف يعمل
يستخدم المحاذي محاذاة CTC (Connectionist Temporal Classification) مع خطوة تصحيح رتابة LIS (Longest Increasing Subsequence). يضمن ذلك أن تبقى الطوابع الزمنية مرتّبة دائماً، حتى عندما يحتوي خرج CTC الخام على تباينات طفيفة.
| الخاصية | القيمة |
|---|---|
| طريقة المحاذاة | CTC مع تصحيح رتابة LIS |
| دقّة الطوابع الزمنية | 80 مللي ثانية |
| فئات الخرج | 5000 |
| وضع الاستدلال | غير ذاتيّ الانحدار (تمريرة أمامية واحدة) |
استخدام CLI
محاذاة ملف صوتي. إن لم يُقدَّم نص تفريغ، فإنّ الصوت يُفرَّغ تلقائياً أوّلاً باستخدام Qwen3-ASR:
.build/release/speech align recording.wav
قدّم نص تفريغ معروفاً لتخطّي التفريغ التلقائي:
.build/release/speech align recording.wav --text "The quick brown fox jumps over the lazy dog"
الخيارات
# حدّد نص التفريغ مباشرةً
.build/release/speech align recording.wav --text "known transcript"
# اختر نموذج ASR لخطوة التفريغ التلقائي
.build/release/speech align recording.wav --model 1.7b
# حدّد متغيّر نموذج المحاذي
.build/release/speech align recording.wav --aligner-model default
# عيّن اللغة
.build/release/speech align recording.wav --language en
دعم اللغات
مرّر --language بما يطابق لغة الصوت. النموذج مدرَّب رسمياً على 11 لغة (en, zh, ja, ko, es, fr, de, ru, it, pt, ar)؛ ويقطّع المعالج الأوّلي أيضاً المورفيمات اليابانية، والكلمات الكورية، والصينية حرفاً بحرف، والتايلانديّة واللاويّة والخميريّة والبورمية والتبتيّة بشكل أصيل عبر NLTokenizer من Apple. تُحفَظ علامات الدمج (matras الديفاناغارية وحروف العلّة التايلاندية وغيرها)، فتبقى كلمات مثل नमस्ते وสวัสดี سليمة.
متغيّرات النموذج
تتوفّر متغيّرات متعدّدة للنموذج، تُوازن بين الحجم والدقّة:
| المتغيّر | معرّف النموذج | الحجم |
|---|---|---|
| MLX 4-bit (افتراضي) | aufklarer/Qwen3-ForcedAligner-0.6B-4bit | ~979 MB |
| MLX 8-bit | aufklarer/Qwen3-ForcedAligner-0.6B-8bit | ~1.3 GB |
| MLX bf16 | aufklarer/Qwen3-ForcedAligner-0.6B-bf16 | ~1.8 GB |
| CoreML INT4 | aufklarer/Qwen3-ForcedAligner-0.6B-CoreML-INT4 | ~662 MB |
| CoreML INT8 | aufklarer/Qwen3-ForcedAligner-0.6B-CoreML-INT8 | ~1.1 GB |
اختر متغيّراً عبر --aligner-model:
.build/release/speech align recording.wav --aligner-model aufklarer/Qwen3-ForcedAligner-0.6B-8bit
صيغة الخرج
يُخرج المحاذي سطراً واحداً لكل كلمة مع طابعَي زمن البداية والنهاية بالثواني:
[0.24 - 0.48] The
[0.48 - 0.72] quick
[0.72 - 1.04] brown
[1.04 - 1.36] fox
[1.36 - 1.68] jumps
[1.68 - 1.92] over
[1.92 - 2.08] the
[2.08 - 2.40] lazy
[2.40 - 2.80] dog
يشير كل زوج من الطوابع الزمنية إلى وقت بداية الكلمة ونهايتها في الصوت، بدقّة 80 مللي ثانية.
التعامل مع الصوت الطويل
تستطيع رأس التصنيف من حيث المبدأ معالجة ما يصل إلى 400 ثانية (5000 فئة × 80 مللي ثانية)، لكن في النموذج المنشور Qwen3-ForcedAligner-0.6B يكون النموذج مدرَّباً بشكل موثوق حتى نحو 270 ثانية. بعد تلك النقطة، يُصدر النموذج فهارس طوابع زمنية مشوّشة، وتقوم خطوة LIS بانهيار كل الكلمات المتأخّرة على الطابع الزمني نفسه.
تتولّى CLI ذلك تلقائياً: يُقسَّم الصوت الطويل عند نقطة الإشباع ويُعاد محاذاته. سترى رسالة من سطر واحد عند تفعيل التقسيم:
Audio 306.2s saturated after word 690 (272.6s); chunking remaining 33.6s (pass 2)
عيّن ALIGN_DEBUG=1 لتفريغ فهارس الطوابع الزمنية الخام مقابل المصحَّحة عند التحقيق في مخرجات مختلّة المحاذاة.
قيود معروفة: محتوى غير كلامي في البداية
عندما يبدأ الصوت بمحتوى غير كلامي (مقدّمة موسيقية أو صمت طويل)، يميل النموذج إلى وضع طابع الكلمة الأولى قرب الثانية صفر لأنّ المصنّف ليس لديه مفهوم "الكلام لم يبدأ بعد". الحلّ البديل: اقتطع المحتوى غير الكلامي في البداية قبل المحاذاة، أو شغّل تمريرة VAD مسبقة باستخدام Silero للعثور على بداية الكلام الفعلية.
عند عدم تمرير --text، يُجري المحاذي أوّلاً تمريرة تفريغ كاملة بـ Qwen3-ASR ثم يحاذي النص الناتج. هذا يعني أنّ التشغيل الأوّل يحمّل كلاً من نموذج ASR ونموذج المحاذي. تمرير --text يتخطّى خطوة ASR ولا يحمّل سوى المحاذي.