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 الكلام في ثلاث مراحل:

  1. LLM — يولّد العمود الفقري Qwen2.5-0.5B وحدات كلام FSQ (Finite Scalar Quantization) من النص
  2. DiT Flow Matching — يحوّل Diffusion Transformer مكوَّن من 22 طبقة وحداتِ الكلام إلى أطياف mel عبر تكامل ODE بطريقة Euler
  3. 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)
مفردات FSQ6561
التكميم4-bit

DiT Flow Matching

يصقل Diffusion Transformer وحدات الكلام إلى أطياف mel باستخدام مطابقة تدفّق شرطية مع classifier-free guidance.

المعاملالقيمة
الطبقات22
البعد1024
رؤوس الانتباه16
التشريطAdaLN (Adaptive Layer Norm)
حلّال ODEEuler، 10 خطوات
معدّل CFG0.7

فاكّ ترميز HiFi-GAN

فاكّ ترميز Neural Source Filter (NSF) يحوّل أطياف mel إلى موجات صوتية.

المعاملالقيمة
التوافقيات8
نسبة Upsample480x (8 x 5 x 3 x ISTFT 4)
ISTFTn_fft=16, hop=4
معدّل أخذ العيّنات للخرج24 kHz

أوزان النموذج

النسخةLLMDiTالحجمHuggingFace
4bit (افتراضي)int4, group=64bf16~1.2 GBaufklarer/CosyVoice3-0.5B-MLX-4bit
8bitint8, group=64bf16~1.4 GBaufklarer/CosyVoice3-0.5B-MLX-8bit
8bit-fullint8, group=64int8, group=64~1.6 GBaufklarer/CosyVoice3-0.5B-MLX-8bit-full
bf16bf16bf16~2.1 GBaufklarer/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

كيف يعمل

  1. مرمِّز المتحدّث CAM++ يستخلص تضمينًا بـ 192 بُعدًا من الصوت المرجعي عبر CoreML (Neural Engine)
  2. إسقاط أفيني (192 → 80) يُشرّط مفكّك DiT flow matching على الصوت المستهدف
  3. فاكّ ترميز HiFi-GAN يحوّل طيف mel المُشرَّط بالمتحدّث إلى صوت بمعدّل 24kHz

مرمِّز المتحدّث

الخاصيةالقيمة
النموذجCAM++ (Context-Aware Masking++)
التضمين192 بُعدًا
الواجهة الخلفيةCoreML (Neural Engine، FP16)
الحجم~14 MB
HuggingFaceaufklarer/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-gap0.2الصمت بين الأدوار (بالثواني)
--crossfade0.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.
إن كنت تنقل من FunAudioLLM/CosyVoice

الجدول أعلاه يربط كلّ وحدة تحكّم fl_ من المنبع بمكافئها في Soniqo. لست بحاجة أبدًا إلى دمج وحدات fl_ داخل المُحفِّز بنفسك — مرّر رايات CLI ذات المستوى الأعلى أو وسائط واجهة Swift، وسيُصدر زمن التشغيل التسلسل الصحيح: clone → instruct → instruct2 → save_speaker.

أخذ العيّنات

تستخدم مرحلة LLM إعدادات أخذ العيّنات التالية:

المعاملالقيمة
Top-k25
Top-p0.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 Matching370 - 520 ms
HiFi-GAN50 - 170 ms
الترجمة

تستخدم مرحلة LLM compile(shapeless: true) للحلقة الانحدارية الذاتية، ممّا يلغي تكلفة إعادة الترجمة عند تغيّر أطوال التسلسلات. مضاعفة الدُّفعة في CFG تختصر عدد التمريرات الأمامية في DiT من 20 إلى 10.