CosyVoice3
Fun-CosyVoice3-0.5B نموذج لتركيب الكلام بالبثّ يدعم 9 لغات. يعتمد على مسار من ثلاث مراحل — توليد الوحدات بواسطة LLM، ومطابقة تدفّق DiT، وفكّ ترميز HiFi-GAN — لإنتاج كلام طبيعي بمعدّل 24 kHz من مدخل نصي. النموذج — الذي يُكتب أيضًا CosyVoice 3 — هو الإصدار الأحدث من عائلة CosyVoice التابعة لـ FunAudioLLM.
اللغات المدعومة
| اللغة | الرمز |
|---|---|
| الصينية | chinese |
| الإنجليزية | english |
| اليابانية | japanese |
| الكورية | korean |
| الألمانية | german |
| الإسبانية | spanish |
| الفرنسية | french |
| الإيطالية | italian |
| الروسية | russian |
المسار
يركّب CosyVoice3 الكلام في ثلاث مراحل:
- LLM — يولّد العمود الفقري Qwen2.5-0.5B وحدات كلام FSQ (Finite Scalar Quantization) من النص
- DiT Flow Matching — يحوّل Diffusion Transformer مكوَّن من 22 طبقة وحداتِ الكلام إلى أطياف mel عبر تكامل ODE بطريقة Euler
- HiFi-GAN — يحوّل فاكُّ ترميز Neural Source Filter أطيافَ mel إلى موجات صوتية بمعدّل 24 kHz
البنية المعمارية
LLM (Qwen2.5-0.5B)
يُولِّد النموذج اللغوي رموز الكلام المنفصلة بطريقة تنبؤية ذاتية. يأتي وقت التشغيل بأربع نسخ تكميم — 4-bit، 8-bit، 8-bit-full (int8 LLM + int8 DiT)، وbf16 (بدون تكميم) — يتم اختيارها لكل استدعاء عبر --cosyvoice-variant.
| المعامل | القيمة |
|---|---|
| الطبقات | 24 |
| البعد الخفي | 896 |
| رؤوس الاستعلام | 14 |
| رؤوس المفتاح/القيمة | 2 (GQA) |
| مفردات FSQ | 6561 |
| التكميم | 4-bit |
DiT Flow Matching
يصقل Diffusion Transformer وحدات الكلام إلى أطياف mel باستخدام مطابقة تدفّق شرطية مع classifier-free guidance.
| المعامل | القيمة |
|---|---|
| الطبقات | 22 |
| البعد | 1024 |
| رؤوس الانتباه | 16 |
| التشريط | AdaLN (Adaptive Layer Norm) |
| حلّال ODE | Euler، 10 خطوات |
| معدّل CFG | 0.7 |
فاكّ ترميز HiFi-GAN
فاكّ ترميز Neural Source Filter (NSF) يحوّل أطياف mel إلى موجات صوتية.
| المعامل | القيمة |
|---|---|
| التوافقيات | 8 |
| نسبة Upsample | 480x (8 x 5 x 3 x ISTFT 4) |
| ISTFT | n_fft=16, hop=4 |
| معدّل أخذ العيّنات للخرج | 24 kHz |
أوزان النموذج
| النسخة | LLM | DiT | الحجم | HuggingFace |
|---|---|---|---|---|
4bit (افتراضي) | int4, group=64 | bf16 | ~1.2 GB | aufklarer/CosyVoice3-0.5B-MLX-4bit |
8bit | int8, group=64 | bf16 | ~1.4 GB | aufklarer/CosyVoice3-0.5B-MLX-8bit |
8bit-full | int8, group=64 | int8, group=64 | ~1.6 GB | aufklarer/CosyVoice3-0.5B-MLX-8bit-full |
bf16 | bf16 | bf16 | ~2.1 GB | aufklarer/CosyVoice3-0.5B-MLX-bf16 |
كل حزمة تشمل LLM، ومُفكِّك DiT flow matching، وفاكّ ترميز HiFi-GAN، ومرمِّز مرجعي S3-Tokenizer اللازم لاستنساخ الصوت zero-shot. اختر الحزم الأصغر لتقليل التنزيل/الحيز التخزيني؛ اختر bf16 عندما يصبح ضجيج التكميم في LLM/DiT مشكلة (التوليد الطويل، وفاء استنساخ الصوت).
استخدام CLI
.build/release/speech speak "Hallo Welt" --engine cosyvoice --language german -o output.wav
أمثلة
# English
.build/release/speech speak "Hello, how are you?" --engine cosyvoice -o hello_en.wav
# Chinese
.build/release/speech speak "你好世界" --engine cosyvoice --language chinese -o hello_cn.wav
# Spanish
.build/release/speech speak "Hola, buenos días" --engine cosyvoice --language spanish -o hello_es.wav
# French
.build/release/speech speak "Bonjour le monde" --engine cosyvoice --language french -o hello_fr.wav
استنساخ الصوت
استنسخ أيّ صوت من عيّنة مرجعية قصيرة باستخدام راية --voice-sample. يستخدم CosyVoice3 مرمِّز المتحدّث CAM++ لاستخلاص تضمين بـ 192 بُعدًا يُشرّط نموذج DiT flow.
# Voice cloning
.build/release/speech speak "Hello in your voice" --engine cosyvoice --voice-sample reference.wav -o cloned.wav
# Cross-language: clone voice, speak in German
.build/release/speech speak "Guten Tag" --engine cosyvoice --voice-sample reference.wav --language german -o german.wav
كيف يعمل
- مرمِّز المتحدّث CAM++ يستخلص تضمينًا بـ 192 بُعدًا من الصوت المرجعي عبر CoreML (Neural Engine)
- إسقاط أفيني (192 → 80) يُشرّط مفكّك DiT flow matching على الصوت المستهدف
- فاكّ ترميز HiFi-GAN يحوّل طيف mel المُشرَّط بالمتحدّث إلى صوت بمعدّل 24kHz
مرمِّز المتحدّث
| الخاصية | القيمة |
|---|---|
| النموذج | CAM++ (Context-Aware Masking++) |
| التضمين | 192 بُعدًا |
| الواجهة الخلفية | CoreML (Neural Engine، FP16) |
| الحجم | ~14 MB |
| HuggingFace | aufklarer/CamPlusPlus-Speaker-CoreML |
يُنزَّل نموذج CAM++ تلقائيًا عند أوّل استخدام لـ --voice-sample. راجع دليل استنساخ الصوت للحصول على إرشادات بشأن الصوت المرجعي وواجهة Swift.
حوار متعدّد المتحدّثين
ركّب المحادثات بين عدّة متحدّثين باستخدام وسوم المتحدّث المضمّنة. يُسنَد لكلّ متحدّث صوتٌ من ملف صوتي مرجعي عبر راية --speakers.
# Two-speaker dialogue with voice cloning
.build/release/speech speak "[S1] Hello there! [S2] Hey, how are you?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o dialogue.wav
# Three speakers
.build/release/speech speak "[A] Welcome. [B] Thanks! [C] Glad to be here." \
--engine cosyvoice --speakers a=host.wav,b=guest1.wav,c=guest2.wav -o panel.wav
أسماء المتحدّثين في الوسوم لا تفرّق بين حالة الأحرف وتُطابَق مع مفاتيح الخريطة. تُدرَج فجوة صمت قابلة للتعديل (افتراضيًا 0.2s) بين كلّ دورَين.
| الخيار | الافتراضي | الوصف |
|---|---|---|
--speakers | خريطة المتحدّثين: s1=file.wav,s2=file.wav | |
--turn-gap | 0.2 | الصمت بين الأدوار (بالثواني) |
--crossfade | 0.0 | تداخل crossfade بين الأدوار (بالثواني) |
وسوم المشاعر والأسلوب
تحكّم بأسلوب الحديث لكلّ مقطع باستخدام وسوم مشاعر مضمّنة. يستخدم CosyVoice3 البادئة النصية قبل الوحدة <|endofprompt|> تعليمةً للأسلوب — وسوم المشاعر تُربط بتعليمات بلغة طبيعية تحلّ محلّ هذه البادئة.
# Emotion tags
.build/release/speech speak "(excited) Wow, amazing! (sad) But I have to go..." \
--engine cosyvoice -o emotion.wav
# Combined with speakers
.build/release/speech speak "[S1] (happy) Great news! [S2] (surprised) Really?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o combined.wav
# Freeform instruction as tag
.build/release/speech speak "(Speak like a pirate) Ahoy matey!" \
--engine cosyvoice -o pirate.wav
# Global instruction (applies to all segments without emotion tags)
.build/release/speech speak "Hello world" \
--engine cosyvoice --cosy-instruct "Speak cheerfully" -o cheerful.wav
وسوم المشاعر المدمجة
| الوسم | التعليمة |
|---|---|
happy / excited | تكلّم بسعادة وحماس. |
sad | تكلّم بحزن ونبرة كئيبة. |
angry | تكلّم بغضب وحدّة. |
whispers / whispering | تكلّم بهمس خفيف لطيف. |
laughs / laughing | تكلّم وأنت تضحك. |
calm | تكلّم بهدوء وسكينة. |
surprised | تكلّم بدهشة واستغراب. |
serious | تكلّم بنبرة جادّة ورسمية. |
الوسوم غير المعروفة تمرّ كتعليمات حرّة الصياغة، لذا فإنّ (Speak in a slow, dramatic voice) يعمل كما هو.
وحدات تحكّم النموذج (وحدات fl_)
داخليًا، يستخدم LLM في CosyVoice3 وحداتِ تحكّم خاصّة — بادئتها fl_ — للتبديل بين الأوضاع (الاستنساخ صفر-إطلاق، التركيب الموجَّه بالتعليمات، حفظ متحدّث، إلخ.). هذه الوحدات جزء من مفكِّك FunAudioLLM في المنبع؛ وزمن تشغيل Soniqo يُصدِر الصحيحة منها تلقائيًا بحسب راية CLI أو استدعاء واجهة Swift الذي تستخدمه، فلا تكتبها بيدك أبدًا.
| وحدة التحكّم | الوضع | كيفية الاستدعاء من Soniqo |
|---|---|---|
<|fl_speaker_clone|> | استنساخ صوت صفر-إطلاق من عيّنة صوتية مرجعية | مرّر --voice-sample reference.wav في CLI، أو عيّن voiceSample: في واجهة Swift. |
<|fl_speaker_instruct|> | تركيب مشروط بتعليمة أو أسلوب باستخدام صوت افتراضي | مرّر --cosy-instruct "Speak cheerfully" أو استخدم وسمًا مضمّنًا مثل (happy) دون --voice-sample. |
<|fl_speaker_instruct2|> | تركيب بتعليمات مدمج مع صوت مرجعي مستنسخ | اجمع --voice-sample reference.wav مع --cosy-instruct "..." (أو وسم مشاعر مضمّن) في الاستدعاء نفسه. |
<|fl_save_speaker|> | حفظ تضمين متحدّث لإعادة استخدامه دون إعادة ترميز الصوت المرجعي في كلّ استدعاء | غير مكشوف مباشرة في CLI الخاصّ بـ Soniqo — التضمينات تُحسب لكلّ استدعاء. للتخزين، استخرج بنفسك متّجه CAM++ ذا 192 بُعدًا عبر وحدة تضمينات المتحدّث ومرّره لاحقًا. |
<|fl_speaker_clone_zh|>, <|fl_speaker_clone_en|>, … | تلميحات استنساخ صفر-إطلاق خاصّة بكلّ لغة يستخدمها المفكِّك في المنبع | اجمع --voice-sample مع --language german|spanish|chinese|.... يختار Soniqo تلميح اللغة الصحيح من راية --language. |
الجدول أعلاه يربط كلّ وحدة تحكّم fl_ من المنبع بمكافئها في Soniqo. لست بحاجة أبدًا إلى دمج وحدات fl_ داخل المُحفِّز بنفسك — مرّر رايات CLI ذات المستوى الأعلى أو وسائط واجهة Swift، وسيُصدر زمن التشغيل التسلسل الصحيح: clone → instruct → instruct2 → save_speaker.
أخذ العيّنات
تستخدم مرحلة LLM إعدادات أخذ العيّنات التالية:
| المعامل | القيمة |
|---|---|
| Top-k | 25 |
| Top-p | 0.8 |
| Repetition Aware Sampling | مُفعَّل (window=10, tau_r=0.1) |
تعاقب Repetition Aware Sampling (RAS) المأخوذة عن VALL-E 2 الوحداتِ التي ظهرت ضمن آخر 10 وحدات مولَّدة. يمنع ذلك ظهور تشوّهات صوتية تكرارية ويُحسّن استقرار الخرج.
الأداء
على M2 Max، يحقّق CosyVoice3 معدّل RTF يبلغ نحو 0.5 — أسرع من الزمن الحقيقي.
| المرحلة | زمن الاستجابة |
|---|---|
| LLM (مُترجَم) | ~13 ms/وحدة |
| DiT Flow Matching | 370 - 520 ms |
| HiFi-GAN | 50 - 170 ms |
تستخدم مرحلة LLM compile(shapeless: true) للحلقة الانحدارية الذاتية، ممّا يلغي تكلفة إعادة الترجمة عند تغيّر أطوال التسلسلات. مضاعفة الدُّفعة في CFG تختصر عدد التمريرات الأمامية في DiT من 20 إلى 10.