CosyVoice3
Fun-CosyVoice3-0.5B est un modèle de synthèse texte-vers-parole en streaming pour 9 langues. Il utilise un pipeline en trois étapes — génération de tokens par LLM, flow matching DiT et vocodage HiFi-GAN — pour produire une parole naturelle à 24 kHz à partir de texte.
Langues prises en charge
| Langue | Code |
|---|---|
| Chinois | chinese |
| Anglais | english |
| Japonais | japanese |
| Coréen | korean |
| Allemand | german |
| Espagnol | spanish |
| Français | french |
| Italien | italian |
| Russe | russian |
Pipeline
CosyVoice3 synthétise la parole en trois étapes :
- LLM — le backbone Qwen2.5-0.5B génère des tokens de parole FSQ (Finite Scalar Quantization) à partir du texte
- Flow matching DiT — un Diffusion Transformer à 22 couches convertit les tokens de parole en spectrogrammes mel via intégration d'ODE par Euler
- HiFi-GAN — vocodeur Neural Source Filter qui convertit les spectrogrammes mel en formes d'onde à 24 kHz
Architecture
LLM (Qwen2.5-0.5B)
Le modèle de langage est quantifié sur 4 bits et génère des tokens de parole discrets de façon autorégressive.
| Paramètre | Valeur |
|---|---|
| Couches | 24 |
| Dimension cachée | 896 |
| Têtes de requête | 14 |
| Têtes clé/valeur | 2 (GQA) |
| Vocabulaire FSQ | 6561 |
| Quantification | 4 bits |
Flow matching DiT
Le Diffusion Transformer raffine les tokens de parole en spectrogrammes mel à l'aide du conditional flow matching avec guidage sans classifieur.
| Paramètre | Valeur |
|---|---|
| Couches | 22 |
| Dimension | 1024 |
| Têtes d'attention | 16 |
| Conditionnement | AdaLN (Adaptive Layer Norm) |
| Solveur ODE | Euler, 10 étapes |
| Taux CFG | 0,7 |
Vocodeur HiFi-GAN
Un vocodeur Neural Source Filter (NSF) qui convertit les spectrogrammes mel en formes d'onde.
| Paramètre | Valeur |
|---|---|
| Harmoniques | 8 |
| Ratio de sur-échantillonnage | ×480 (8 × 5 × 3 × ISTFT 4) |
| ISTFT | n_fft=16, hop=4 |
| Fréquence d'échantillonnage de sortie | 24 kHz |
Poids du modèle
| Modèle | Taille | HuggingFace |
|---|---|---|
| CosyVoice3-0.5B (LLM 4-bit) | 1,2 Go | aufklarer/CosyVoice3-0.5B-MLX-4bit |
Inclut les poids du LLM (quantifié 4 bits), du flow matching DiT et du vocodeur HiFi-GAN.
Utilisation en CLI
.build/release/audio speak "Hallo Welt" --engine cosyvoice --language german -o output.wav
Exemples
# Anglais
.build/release/audio speak "Hello, how are you?" --engine cosyvoice -o hello_en.wav
# Chinois
.build/release/audio speak "你好世界" --engine cosyvoice --language chinese -o hello_cn.wav
# Espagnol
.build/release/audio speak "Hola, buenos días" --engine cosyvoice --language spanish -o hello_es.wav
# Français
.build/release/audio speak "Bonjour le monde" --engine cosyvoice --language french -o hello_fr.wav
Clonage vocal
Clonez n'importe quelle voix à partir d'un court échantillon audio de référence avec l'option --voice-sample. CosyVoice3 utilise l'encodeur de locuteur CAM++ pour extraire un embedding à 192 dimensions qui conditionne le modèle de flow DiT.
# Clonage vocal
.build/release/audio speak "Hello in your voice" --engine cosyvoice --voice-sample reference.wav -o cloned.wav
# Inter-langue : cloner la voix, parler en allemand
.build/release/audio speak "Guten Tag" --engine cosyvoice --voice-sample reference.wav --language german -o german.wav
Fonctionnement
- L'encodeur de locuteur CAM++ extrait un embedding à 192 dimensions à partir de l'audio de référence via CoreML (Neural Engine)
- Une projection affine (192 → 80) conditionne le décodeur de flow matching DiT sur la voix cible
- Le vocodeur HiFi-GAN convertit le spectrogramme mel conditionné par le locuteur en audio à 24 kHz
Encodeur de locuteur
| Propriété | Valeur |
|---|---|
| Modèle | CAM++ (Context-Aware Masking++) |
| Embedding | 192 dimensions |
| Backend | CoreML (Neural Engine, FP16) |
| Taille | ~14 Mo |
| HuggingFace | aufklarer/CamPlusPlus-Speaker-CoreML |
Le modèle CAM++ est téléchargé automatiquement à la première utilisation de --voice-sample. Consultez le guide Clonage vocal pour des conseils sur l'audio de référence et l'API Swift.
Dialogue multi-locuteurs
Synthétisez des conversations entre plusieurs locuteurs à l'aide de balises de locuteur en ligne. Chaque locuteur se voit attribuer une voix à partir d'un fichier audio de référence via l'option --speakers.
# Dialogue à deux locuteurs avec clonage vocal
.build/release/audio speak "[S1] Hello there! [S2] Hey, how are you?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o dialogue.wav
# Trois locuteurs
.build/release/audio 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
Les noms de locuteurs dans les balises ne sont pas sensibles à la casse et sont mis en correspondance avec les clés du mapping. Un silence configurable (0,2 s par défaut) est inséré entre les tours.
| Option | Par défaut | Description |
|---|---|---|
--speakers | Mapping des locuteurs : s1=file.wav,s2=file.wav | |
--turn-gap | 0.2 | Silence entre les tours (secondes) |
--crossfade | 0.0 | Chevauchement en fondu enchaîné entre les tours (secondes) |
Balises d'émotion et de style
Contrôlez le style de parole par segment à l'aide de balises d'émotion en ligne. CosyVoice3 utilise le préfixe de texte avant le token <|endofprompt|> comme instruction de style — les balises d'émotion correspondent à des instructions en langage naturel qui remplacent ce préfixe.
# Balises d'émotion
.build/release/audio speak "(excited) Wow, amazing! (sad) But I have to go..." \
--engine cosyvoice -o emotion.wav
# Combinées aux locuteurs
.build/release/audio speak "[S1] (happy) Great news! [S2] (surprised) Really?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o combined.wav
# Instruction libre en tant que balise
.build/release/audio speak "(Speak like a pirate) Ahoy matey!" \
--engine cosyvoice -o pirate.wav
# Instruction globale (s'applique à tous les segments sans balise d'émotion)
.build/release/audio speak "Hello world" \
--engine cosyvoice --cosy-instruct "Speak cheerfully" -o cheerful.wav
Balises d'émotion intégrées
| Balise | Instruction |
|---|---|
happy / excited | Parler joyeusement et avec enthousiasme. |
sad | Parler tristement avec un ton mélancolique. |
angry | Parler avec colère et intensité. |
whispers / whispering | Parler dans un murmure doux et délicat. |
laughs / laughing | Parler en riant. |
calm | Parler calmement et paisiblement. |
surprised | Parler avec surprise et étonnement. |
serious | Parler d'un ton sérieux et formel. |
Les balises inconnues sont transmises telles quelles comme instructions libres : (Speak in a slow, dramatic voice) fonctionne directement.
Échantillonnage
L'étape LLM utilise la configuration d'échantillonnage suivante :
| Paramètre | Valeur |
|---|---|
| Top-k | 25 |
| Top-p | 0,8 |
| Repetition Aware Sampling | Activé (fenêtre=10, tau_r=0,1) |
Repetition Aware Sampling (RAS), venu de VALL-E 2, pénalise les tokens apparus dans les 10 derniers tokens générés. Cela évite les artefacts audio répétitifs et améliore la stabilité de la sortie.
Performance
Sur un M2 Max, CosyVoice3 atteint un RTF d'environ 0,5 — plus rapide que le temps réel.
| Étape | Latence |
|---|---|
| LLM (compilé) | ~13 ms/token |
| Flow matching DiT | 370 - 520 ms |
| HiFi-GAN | 50 - 170 ms |
L'étape LLM utilise compile(shapeless: true) pour la boucle autorégressive, ce qui élimine le coût de recompilation pour des longueurs de séquence variables. Le CFG à batch doublé divise par deux le nombre de passes DiT (de 20 à 10).