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

LangueCode
Chinoischinese
Anglaisenglish
Japonaisjapanese
Coréenkorean
Allemandgerman
Espagnolspanish
Françaisfrench
Italienitalian
Russerussian

Pipeline

CosyVoice3 synthétise la parole en trois étapes :

  1. LLM — le backbone Qwen2.5-0.5B génère des tokens de parole FSQ (Finite Scalar Quantization) à partir du texte
  2. Flow matching DiT — un Diffusion Transformer à 22 couches convertit les tokens de parole en spectrogrammes mel via intégration d'ODE par Euler
  3. 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ètreValeur
Couches24
Dimension cachée896
Têtes de requête14
Têtes clé/valeur2 (GQA)
Vocabulaire FSQ6561
Quantification4 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ètreValeur
Couches22
Dimension1024
Têtes d'attention16
ConditionnementAdaLN (Adaptive Layer Norm)
Solveur ODEEuler, 10 étapes
Taux CFG0,7

Vocodeur HiFi-GAN

Un vocodeur Neural Source Filter (NSF) qui convertit les spectrogrammes mel en formes d'onde.

ParamètreValeur
Harmoniques8
Ratio de sur-échantillonnage×480 (8 × 5 × 3 × ISTFT 4)
ISTFTn_fft=16, hop=4
Fréquence d'échantillonnage de sortie24 kHz

Poids du modèle

ModèleTailleHuggingFace
CosyVoice3-0.5B (LLM 4-bit)1,2 Goaufklarer/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

  1. L'encodeur de locuteur CAM++ extrait un embedding à 192 dimensions à partir de l'audio de référence via CoreML (Neural Engine)
  2. Une projection affine (192 → 80) conditionne le décodeur de flow matching DiT sur la voix cible
  3. Le vocodeur HiFi-GAN convertit le spectrogramme mel conditionné par le locuteur en audio à 24 kHz

Encodeur de locuteur

PropriétéValeur
ModèleCAM++ (Context-Aware Masking++)
Embedding192 dimensions
BackendCoreML (Neural Engine, FP16)
Taille~14 Mo
HuggingFaceaufklarer/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.

OptionPar défautDescription
--speakersMapping des locuteurs : s1=file.wav,s2=file.wav
--turn-gap0.2Silence entre les tours (secondes)
--crossfade0.0Chevauchement 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

BaliseInstruction
happy / excitedParler joyeusement et avec enthousiasme.
sadParler tristement avec un ton mélancolique.
angryParler avec colère et intensité.
whispers / whisperingParler dans un murmure doux et délicat.
laughs / laughingParler en riant.
calmParler calmement et paisiblement.
surprisedParler avec surprise et étonnement.
seriousParler 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ètreValeur
Top-k25
Top-p0,8
Repetition Aware SamplingActivé (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.

ÉtapeLatence
LLM (compilé)~13 ms/token
Flow matching DiT370 - 520 ms
HiFi-GAN50 - 170 ms
Compilation

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).