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. Das Modell — auch als CosyVoice 3 geschrieben — ist die neueste Version der FunAudioLLM-CosyVoice-Familie.
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 erzeugt diskrete Sprach-Tokens autoregressiv. Die Laufzeit liefert vier Quantisierungs-Varianten — 4-Bit, 8-Bit, 8-Bit-full (int8 LLM + int8 DiT) und bf16 (unquantisiert) — wählbar über --cosyvoice-variant.
| 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
| Variante | LLM | DiT | Größe | HuggingFace |
|---|---|---|---|---|
4bit (Standard) | 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 |
Jedes Bundle enthält das LLM, den DiT-Flow-Matching-Decoder, den HiFi-GAN-Vocoder und den S3-Tokenizer-Referenz-Encoder für Zero-Shot-Stimmklonen. Kleinere Bundles für kleineren Download/Festplattenbedarf; wähle bf16, wenn LLM-/DiT-Quantisierungsrauschen stört (Langform-Synthese, Stimmklon-Treue).
CLI-Verwendung
.build/release/speech speak "Hallo Welt" --engine cosyvoice --language german -o output.wav
Beispiele
# Englisch
.build/release/speech speak "Hello, how are you?" --engine cosyvoice -o hello_en.wav
# Chinesisch
.build/release/speech speak "你好世界" --engine cosyvoice --language chinese -o hello_cn.wav
# Spanisch
.build/release/speech speak "Hola, buenos días" --engine cosyvoice --language spanish -o hello_es.wav
# Französisch
.build/release/speech 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/speech speak "Hello in your voice" --engine cosyvoice --voice-sample reference.wav -o cloned.wav
# Sprachübergreifend: Stimme klonen, Deutsch sprechen
.build/release/speech 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/speech 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/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
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/speech speak "(excited) Wow, amazing! (sad) But I have to go..." \
--engine cosyvoice -o emotion.wav
# Kombiniert mit Sprechern
.build/release/speech 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/speech speak "(Speak like a pirate) Ahoy matey!" \
--engine cosyvoice -o pirate.wav
# Globale Anweisung (gilt für alle Segmente ohne Emotions-Tag)
.build/release/speech 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.
Modell-Steuertokens (fl_-Tokens)
Intern verwendet das CosyVoice3-LLM spezielle Steuertokens — mit dem Präfix fl_ — um zwischen Modi zu wechseln (Zero-Shot-Cloning, anweisungsgesteuerte Synthese, Speichern eines Sprechers usw.). Diese Tokens sind Teil des Upstream-FunAudioLLM-Tokenizers; die Soniqo-Laufzeit gibt den richtigen automatisch basierend auf dem von Ihnen verwendeten CLI-Flag oder Swift-API-Aufruf aus, sodass Sie sie nie von Hand schreiben.
| Steuertoken | Modus | Aufruf aus Soniqo |
|---|---|---|
<|fl_speaker_clone|> | Zero-Shot-Stimmenklonen aus einer Referenz-Audioprobe | Übergeben Sie --voice-sample reference.wav auf der CLI oder setzen Sie voiceSample: auf der Swift-API. |
<|fl_speaker_instruct|> | Anweisungs- oder stilkonditionierte Synthese mit Standardstimme | Übergeben Sie --cosy-instruct "Speak cheerfully" oder verwenden Sie ein Inline-Tag (happy) ohne --voice-sample. |
<|fl_speaker_instruct2|> | Anweisungssynthese kombiniert mit einer geklonten Referenzstimme | Kombinieren Sie --voice-sample reference.wav mit --cosy-instruct "..." (oder einem Inline-Emotionstag) im selben Aufruf. |
<|fl_save_speaker|> | Speichert die Sprecher-Embedding zur Wiederverwendung, ohne das Referenzaudio bei jedem Aufruf neu zu kodieren | In der Soniqo-CLI nicht direkt verfügbar — Embeddings werden pro Aufruf berechnet. Um zu cachen, extrahieren Sie den 192-dimensionalen CAM++-Vektor selbst über das Sprecher-Embeddings-Modul und reichen Sie ihn weiter. |
<|fl_speaker_clone_zh|>, <|fl_speaker_clone_en|>, … | Sprachspezifische Zero-Shot-Cloning-Hinweise, die der Upstream-Tokenizer verwendet | Kombinieren Sie --voice-sample mit --language german|spanish|chinese|.... Soniqo wählt den korrekten Sprachhinweis anhand des --language-Flags aus. |
Die Tabelle oben ordnet jedes Upstream-fl_-Steuertoken seinem Soniqo-Äquivalent zu. Sie müssen fl_-Tokens niemals selbst in Ihren Prompt einfügen — übergeben Sie die High-Level-CLI-Flags oder Swift-API-Argumente, und die Laufzeit gibt die korrekte Sequenz aus: clone → instruct → instruct2 → save_speaker.
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.