CosyVoice3
Fun-CosyVoice3-0.5B ist ein Streaming-TTS-Modell für 9 Sprachen. Es nutzt eine dreistufige Pipeline — LLM-Token-Generierung, DiT-Flow-Matching und HiFi-GAN-Vocoding — um aus Texteingaben natürliche 24-kHz-Sprache zu erzeugen.
Unterstützte Sprachen
| Sprache | Code |
|---|---|
| Chinesisch | chinese |
| Englisch | english |
| Japanisch | japanese |
| Koreanisch | korean |
| Deutsch | german |
| Spanisch | spanish |
| Französisch | french |
| Italienisch | italian |
| Russisch | russian |
Pipeline
CosyVoice3 synthetisiert Sprache in drei Stufen:
- LLM — Qwen2.5-0.5B-Backbone erzeugt aus Text FSQ-Sprach-Tokens (Finite Scalar Quantization)
- DiT-Flow-Matching — Ein 22-lagiger Diffusion Transformer wandelt Sprach-Tokens über Euler-ODE-Integration in Mel-Spektrogramme um
- HiFi-GAN — Neural-Source-Filter-Vocoder wandelt Mel-Spektrogramme in 24-kHz-Wellenformen um
Architektur
LLM (Qwen2.5-0.5B)
Das Sprachmodell ist 4-Bit-quantisiert und erzeugt diskrete Sprach-Tokens autoregressiv.
| Parameter | Wert |
|---|---|
| Schichten | 24 |
| Hidden-Dimension | 896 |
| Query-Heads | 14 |
| Key/Value-Heads | 2 (GQA) |
| FSQ-Vokabular | 6561 |
| Quantisierung | 4-bit |
DiT-Flow-Matching
Der Diffusion Transformer verfeinert Sprach-Tokens zu Mel-Spektrogrammen mittels konditionalem Flow-Matching mit Classifier-Free Guidance.
| Parameter | Wert |
|---|---|
| Schichten | 22 |
| Dimension | 1024 |
| Attention-Heads | 16 |
| Konditionierung | AdaLN (Adaptive Layer Norm) |
| ODE-Solver | Euler, 10 Schritte |
| CFG-Rate | 0,7 |
HiFi-GAN-Vocoder
Ein Neural-Source-Filter-Vocoder (NSF), der Mel-Spektrogramme in Wellenformen umwandelt.
| Parameter | Wert |
|---|---|
| Harmonische | 8 |
| Upsample-Verhältnis | 480x (8 x 5 x 3 x ISTFT 4) |
| ISTFT | n_fft=16, hop=4 |
| Ausgabe-Abtastrate | 24 kHz |
Modellgewichte
| Modell | Größe | HuggingFace |
|---|---|---|
| CosyVoice3-0.5B (4-bit LLM) | 1,2 GB | aufklarer/CosyVoice3-0.5B-MLX-4bit |
Enthält LLM (4-Bit-quantisiert), DiT-Flow-Matching und HiFi-GAN-Vocoder-Gewichte.
CLI-Verwendung
.build/release/audio speak "Hallo Welt" --engine cosyvoice --language german -o output.wav
Beispiele
# Englisch
.build/release/audio speak "Hello, how are you?" --engine cosyvoice -o hello_en.wav
# Chinesisch
.build/release/audio speak "你好世界" --engine cosyvoice --language chinese -o hello_cn.wav
# Spanisch
.build/release/audio speak "Hola, buenos días" --engine cosyvoice --language spanish -o hello_es.wav
# Französisch
.build/release/audio speak "Bonjour le monde" --engine cosyvoice --language french -o hello_fr.wav
Stimmklonen
Klone eine beliebige Stimme aus einer kurzen Referenzaudio-Probe mit dem Schalter --voice-sample. CosyVoice3 nutzt den CAM++-Sprecher-Encoder, um ein 192-dimensionales Embedding zu extrahieren, das das DiT-Flow-Modell konditioniert.
# Stimmklonen
.build/release/audio speak "Hello in your voice" --engine cosyvoice --voice-sample reference.wav -o cloned.wav
# Sprachübergreifend: Stimme klonen, Deutsch sprechen
.build/release/audio speak "Guten Tag" --engine cosyvoice --voice-sample reference.wav --language german -o german.wav
So funktioniert es
- CAM++-Sprecher-Encoder extrahiert per CoreML (Neural Engine) ein 192-dimensionales Embedding aus dem Referenzaudio
- Affine Projektion (192 → 80) konditioniert den DiT-Flow-Matching-Decoder auf die Zielstimme
- HiFi-GAN-Vocoder wandelt das sprecherkonditionierte Mel-Spektrogramm in 24-kHz-Audio um
Sprecher-Encoder
| Eigenschaft | Wert |
|---|---|
| Modell | CAM++ (Context-Aware Masking++) |
| Embedding | 192 Dimensionen |
| Backend | CoreML (Neural Engine, FP16) |
| Größe | ~14 MB |
| HuggingFace | aufklarer/CamPlusPlus-Speaker-CoreML |
Das CAM++-Modell wird beim ersten Gebrauch von --voice-sample automatisch heruntergeladen. Siehe die Anleitung Stimmklonen für Hinweise zum Referenzaudio und die Swift-API.
Mehrsprecherdialog
Synthetisiere Gespräche zwischen mehreren Sprechern mit Inline-Sprecher-Tags. Jedem Sprecher wird über den Schalter --speakers eine Stimme aus einer Referenzaudiodatei zugeordnet.
# Dialog zweier Sprecher mit Stimmklonen
.build/release/audio speak "[S1] Hello there! [S2] Hey, how are you?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o dialogue.wav
# Drei Sprecher
.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
Sprechernamen in den Tags sind Groß-/Kleinschreibungs-unabhängig und werden den Mapping-Schlüsseln zugeordnet. Zwischen den Zügen wird eine konfigurierbare Stillepause (Standard 0,2 s) eingefügt.
| Option | Standard | Beschreibung |
|---|---|---|
--speakers | Sprecher-Zuordnung: s1=file.wav,s2=file.wav | |
--turn-gap | 0.2 | Stille zwischen den Zügen (Sekunden) |
--crossfade | 0.0 | Crossfade-Überlappung zwischen den Zügen (Sekunden) |
Emotions- & Stil-Tags
Steuere den Sprechstil pro Segment mit Inline-Emotions-Tags. CosyVoice3 nutzt das Textpräfix vor dem <|endofprompt|>-Token als Stilanweisung — Emotions-Tags ersetzen dieses Präfix durch natürlichsprachige Anweisungen.
# Emotions-Tags
.build/release/audio speak "(excited) Wow, amazing! (sad) But I have to go..." \
--engine cosyvoice -o emotion.wav
# Kombiniert mit Sprechern
.build/release/audio speak "[S1] (happy) Great news! [S2] (surprised) Really?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o combined.wav
# Freiform-Anweisung als Tag
.build/release/audio speak "(Speak like a pirate) Ahoy matey!" \
--engine cosyvoice -o pirate.wav
# Globale Anweisung (gilt für alle Segmente ohne Emotions-Tag)
.build/release/audio speak "Hello world" \
--engine cosyvoice --cosy-instruct "Speak cheerfully" -o cheerful.wav
Integrierte Emotions-Tags
| Tag | Anweisung |
|---|---|
happy / excited | Fröhlich und begeistert sprechen. |
sad | Traurig mit melancholischem Ton sprechen. |
angry | Wütend und mit Intensität sprechen. |
whispers / whispering | Leise, sanft flüsternd sprechen. |
laughs / laughing | Lachend sprechen. |
calm | Ruhig und friedlich sprechen. |
surprised | Überrascht und erstaunt sprechen. |
serious | In einem ernsten, förmlichen Ton sprechen. |
Unbekannte Tags werden als Freiform-Anweisungen durchgereicht, sodass (Speak in a slow, dramatic voice) direkt funktioniert.
Sampling
Die LLM-Stufe verwendet die folgende Sampling-Konfiguration:
| Parameter | Wert |
|---|---|
| Top-k | 25 |
| Top-p | 0,8 |
| Repetition Aware Sampling | Aktiviert (window=10, tau_r=0,1) |
Repetition Aware Sampling (RAS) aus VALL-E 2 bestraft Tokens, die in den letzten 10 erzeugten Tokens vorkamen. Das verhindert repetitive Audio-Artefakte und verbessert die Stabilität der Ausgabe.
Leistung
Auf einem M2 Max erreicht CosyVoice3 einen RTF von etwa 0,5 — schneller als Echtzeit.
| Stufe | Latenz |
|---|---|
| LLM (kompiliert) | ~13 ms/Token |
| DiT-Flow-Matching | 370 - 520 ms |
| HiFi-GAN | 50 - 170 ms |
Die LLM-Stufe verwendet compile(shapeless: true) für die autoregressive Schleife, was den Rekompilierungs-Overhead über unterschiedliche Sequenzlängen eliminiert. Batch-verdoppeltes CFG halbiert die Anzahl der DiT-Forward-Passes von 20 auf 10.