Qwen3-TTS
Qwen3-TTS نموذج لغوي يعتمد على كوديك 12Hz مع مفكّك Mimi لتركيب كلام عالي الجودة من النص. النموذج مكمَّم بـ 4-bit ويعمل أسرع من الزمن الحقيقي على Apple Silicon.
خط المعالجة
يتبع تركيب الكلام خط معالجة من ثلاث مراحل:
- Talker — محوّل بـ 28 طبقة يحوّل نص الإدخال إلى رموز codebook الأول بمعدّل 12.5 Hz
- Code Predictor — محوّل بـ 5 طبقات يتنبّأ بالـ 15 codebook المتبقية انطلاقًا من الحالات المخفية للـ codebook الأول
- مفكّك كوديك Mimi — يحوّل رموز الـ 16 codebook إلى موجة صوتية بمعدّل 24 kHz
البنية
Talker
Talker هو النموذج الانحداري الذاتي الأساسي الذي يولّد رموز الكوديك من نص الإدخال.
| المعامل | القيمة |
|---|---|
| الطبقات | 28 |
| البعد المخفي | 1024 |
| رؤوس الاستعلام | 16 |
| رؤوس المفتاح/القيمة | 8 (GQA) |
| MLP | SwiGLU |
| الترميز الموضعي | RoPE |
Code Predictor
محوّل خفيف بـ 5 طبقات يأخذ الحالات المخفية من الـ codebook الأول ويتنبّأ بالـ 15 codebook المتبقية بالتوازي. هذا يتجنّب تشغيل Talker الكامل 16 مرة لكل خطوة.
مفكّك كوديك Mimi
يحوّل مفكّك Mimi رموز الكوديك المكمَّمة مجدّدًا إلى صوت:
- فكّ ترميز RVQ (16 codebook)
- التفاف مسبق (512 إلى 1024 قناة)
- محوّل مسبق (عنق زجاجة من 1024 إلى 512، 8 طبقات، SwiGLU + LayerScale)
- Upsample (2x، 2x)
- مفكّك SEANet (مراحل upsample بمعدّل 8x، 5x، 4x، 3x)
- إخراج موجة صوتية بمعدّل 24 kHz
إصدارات النموذج
| النموذج | الحجم | HuggingFace |
|---|---|---|
| Qwen3-TTS-0.6B Base (4-bit) | 1.7 GB | aufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-4bit |
| Qwen3-TTS-0.6B Base (8-bit) | 2.4 GB | aufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-8bit |
| Qwen3-TTS-0.6B CustomVoice (4-bit) | 1.7 GB | aufklarer/Qwen3-TTS-12Hz-0.6B-CustomVoice-MLX-4bit |
| Qwen3-TTS-1.7B Base (4-bit) | 3.2 GB | aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-4bit |
| Qwen3-TTS-1.7B Base (8-bit) | 4.8 GB | aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-8bit |
| Qwen3-TTS CoreML (FP16) | 2.1 GB | aufklarer/Qwen3-TTS-CoreML |
الواجهة الخلفية CoreML
تشغّل الواجهة الخلفية CoreML خط معالجة Qwen3-TTS بأكمله على وحدة GPU عبر Core ML، ما يتيح النشر على iOS وmacOS دون اعتماديات MLX. يُقسَّم النموذج إلى 6 نماذج فرعية متخصّصة محسَّنة لمكدّس حوسبة Apple:
- TextProjector — يُسقط تضمينات رموز النص إلى الفضاء المخفي المشترك
- CodeEmbedder — يُضمّن رموز الـ codebook الأول ورموز التحكّم
- MultiCodeEmbedder — يُضمّن رموز الـ codebooks من 1 إلى 15
- CodeDecoder — محوّل انحداري ذاتي بـ 28 طبقة بذاكرة KV مؤقّتة عديمة الحالة (بحدّ أقصى 256 موقعًا)
- MultiCodeDecoder — مُتنبّئ كود بـ 5 طبقات للـ codebooks من 1 إلى 15
- SpeechDecoder — مفكّك كوديك Mimi، يحوّل رموز الـ 16 codebook إلى صوت بمعدّل 24 kHz
# تركيب CoreML
.build/release/speech speak "Hello, world!" --engine coreml -o hello.wav
# CoreML يستخدم درجة حرارة 0.8 افتراضيًا (مطلوبة للحصول على جودة عالية)
.build/release/speech speak "Long text here." --engine coreml --temperature 0.9 -o out.wav
يستخدم CodeDecoder في CoreML ذاكرة KV ثابتة بحجم 256 موقعًا. يجب تقسيم الفقرات الأطول إلى جمل منفردة. تُحدّ رموز فكّ الترميز تلقائيًا لتتسع داخل خانات الذاكرة المتبقّية بعد prefill.
استخدام CLI
توليد كلام من النص:
.build/release/speech speak "Hello, world!" --output hello.wav
الخيارات
| الراية | الوصف |
|---|---|
--engine | محرّك TTS: qwen3 (MLX، افتراضي)، coreml (CoreML/GPU) أو cosyvoice |
--output, -o | مسار ملف WAV الناتج |
--language | اللغة (افتراضي: english). اتركها فارغة لاستخدام لهجة المتحدّث الأصلية. |
--model | إصدار النموذج: base أو customVoice |
--speaker | صوت المتحدّث (يتطلّب --model customVoice) |
--temperature | درجة حرارة العيّنة (افتراضي: 0.3) |
--top-k | معامل عيّنة top-k |
--max-tokens | الحدّ الأقصى لعدد الرموز المولَّدة (افتراضي: 500) |
--stream | تفعيل البثّ — يُصدر مقاطع صوتية أثناء التوليد |
--first-chunk-frames | عدد الإطارات في أوّل مقطع مُبثّ |
--chunk-frames | عدد الإطارات في كل مقطع لاحق مُبثّ |
--batch-file | مسار ملف نصّي يحتوي على ملفوظ واحد لكل سطر للتركيب بالدفعات |
--batch-size | عدد الملفوظات المعالَجة بالتوازي في وضع batch |
أمثلة
# تركيب أساسي
.build/release/speech speak "The quick brown fox." -o fox.wav
# إخراج بالبثّ
.build/release/speech speak "Long passage of text..." --stream -o stream.wav
# تركيب بالدفعات من ملف
.build/release/speech speak --batch-file sentences.txt --batch-size 4 -o output_dir/
البثّ
تتيح الراية --stream إخراج الصوت في مقاطع أثناء التوليد. بدلًا من انتظار اكتمال الملفوظ بأكمله، يُصدَر الصوت في مقاطع مع توليد الرموز. استخدم --first-chunk-frames و--chunk-frames للتحكّم بحجم كل مقطع.
وضع batch
لتركيب عدّة ملفوظات، استخدم --batch-file مع ملف نصّي يحتوي على سطر واحد لكل ملفوظ. تتحكّم الراية --batch-size بعدد الملفوظات المعالَجة بالتوازي.
الأداء
على M2 Max، يحقّق Qwen3-TTS RTF (عامل الزمن الحقيقي) يقارب 0.55، أي أنه يولّد الكلام أسرع من الزمن الحقيقي. مع warmup الخاصّ بـ compile()، تستغرق كل خطوة نحو 37 ms.
الحدّ الأقصى الافتراضي هو 500 رمز، ما يُنتج نحو 40 ثانية من الصوت بمعدّل 12.5 Hz. وضع قيم أعلى يُخاطر بتجاوز مهلة watchdog لوحدة Metal GPU، ما قد يتسبّب بإعادة تشغيل النظام على Apple Silicon لأن GPU يتشاركها مع compositor.
اللغات
يدعم Qwen3-TTS تركيب كلام متعدّد اللغات من النص. يكتشف النموذج لغة الإدخال تلقائيًا ويولّد الكلام تبعًا لذلك.
واجهة Swift
import Qwen3TTS
let model = try await Qwen3TTSModel.loadFromHub()
let audio = try await model.speak("Hello, world!")
try audio.write(to: "hello.wav")