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

SpracheCode
Chinesischchinese
Englischenglish
Japanischjapanese
Koreanischkorean
Deutschgerman
Spanischspanish
Französischfrench
Italienischitalian
Russischrussian

Pipeline

CosyVoice3 synthetisiert Sprache in drei Stufen:

  1. LLM — Qwen2.5-0.5B-Backbone erzeugt aus Text FSQ-Sprach-Tokens (Finite Scalar Quantization)
  2. DiT-Flow-Matching — Ein 22-lagiger Diffusion Transformer wandelt Sprach-Tokens über Euler-ODE-Integration in Mel-Spektrogramme um
  3. 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.

ParameterWert
Schichten24
Hidden-Dimension896
Query-Heads14
Key/Value-Heads2 (GQA)
FSQ-Vokabular6561
Quantisierung4-bit

DiT-Flow-Matching

Der Diffusion Transformer verfeinert Sprach-Tokens zu Mel-Spektrogrammen mittels konditionalem Flow-Matching mit Classifier-Free Guidance.

ParameterWert
Schichten22
Dimension1024
Attention-Heads16
KonditionierungAdaLN (Adaptive Layer Norm)
ODE-SolverEuler, 10 Schritte
CFG-Rate0,7

HiFi-GAN-Vocoder

Ein Neural-Source-Filter-Vocoder (NSF), der Mel-Spektrogramme in Wellenformen umwandelt.

ParameterWert
Harmonische8
Upsample-Verhältnis480x (8 x 5 x 3 x ISTFT 4)
ISTFTn_fft=16, hop=4
Ausgabe-Abtastrate24 kHz

Modellgewichte

VarianteLLMDiTGrößeHuggingFace
4bit (Standard)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

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

  1. CAM++-Sprecher-Encoder extrahiert per CoreML (Neural Engine) ein 192-dimensionales Embedding aus dem Referenzaudio
  2. Affine Projektion (192 → 80) konditioniert den DiT-Flow-Matching-Decoder auf die Zielstimme
  3. HiFi-GAN-Vocoder wandelt das sprecherkonditionierte Mel-Spektrogramm in 24-kHz-Audio um

Sprecher-Encoder

EigenschaftWert
ModellCAM++ (Context-Aware Masking++)
Embedding192 Dimensionen
BackendCoreML (Neural Engine, FP16)
Größe~14 MB
HuggingFaceaufklarer/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.

OptionStandardBeschreibung
--speakersSprecher-Zuordnung: s1=file.wav,s2=file.wav
--turn-gap0.2Stille zwischen den Zügen (Sekunden)
--crossfade0.0Crossfade-Ü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

TagAnweisung
happy / excitedFröhlich und begeistert sprechen.
sadTraurig mit melancholischem Ton sprechen.
angryWütend und mit Intensität sprechen.
whispers / whisperingLeise, sanft flüsternd sprechen.
laughs / laughingLachend sprechen.
calmRuhig und friedlich sprechen.
surprisedÜberrascht und erstaunt sprechen.
seriousIn 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.

SteuertokenModusAufruf 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 ReferenzstimmeKombinieren 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 kodierenIn 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 verwendetKombinieren Sie --voice-sample mit --language german|spanish|chinese|.... Soniqo wählt den korrekten Sprachhinweis anhand des --language-Flags aus.
Wenn Sie von FunAudioLLM/CosyVoice portieren

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:

ParameterWert
Top-k25
Top-p0,8
Repetition Aware SamplingAktiviert (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.

StufeLatenz
LLM (kompiliert)~13 ms/Token
DiT-Flow-Matching370 - 520 ms
HiFi-GAN50 - 170 ms
Kompilierung

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.