CosyVoice3
Fun-CosyVoice3-0.5B, 9 dili destekleyen bir streaming metinden konuşma modelidir. LLM token üretimi, DiT flow matching ve HiFi-GAN vocoder'dan oluşan üç aşamalı bir pipeline ile metin girişinden doğal 24 kHz konuşma üretir. CosyVoice 3 olarak da yazılan bu model, FunAudioLLM'in CosyVoice ailesinin en yeni üyesidir.
Desteklenen diller
| Dil | Kod |
|---|---|
| Çince | chinese |
| İngilizce | english |
| Japonca | japanese |
| Korece | korean |
| Almanca | german |
| İspanyolca | spanish |
| Fransızca | french |
| İtalyanca | italian |
| Rusça | russian |
Pipeline
CosyVoice3 konuşmayı üç aşamada sentezler:
- LLM — Qwen2.5-0.5B omurgası metinden FSQ (Finite Scalar Quantization) konuşma token'ları üretir
- DiT Flow Matching — 22 katmanlı bir Diffusion Transformer, Euler ODE entegrasyonuyla konuşma token'larını mel spektrogramlarına dönüştürür
- HiFi-GAN — Neural Source Filter vocoder mel spektrogramlarını 24 kHz dalga formlarına dönüştürür
Mimari
LLM (Qwen2.5-0.5B)
Dil modeli ayrık konuşma token'larını otoregresif olarak üretir. Runtime dört kuantizasyon sürümünde gelir — 4-bit, 8-bit, 8-bit-full (int8 LLM + int8 DiT) ve bf16 (kuantize edilmemiş) — her çağrıda --cosyvoice-variant ile seçilir.
| Parametre | Değer |
|---|---|
| Katman sayısı | 24 |
| Gizli boyut | 896 |
| Query başlıkları | 14 |
| Key/Value başlıkları | 2 (GQA) |
| FSQ kelime dağarcığı | 6561 |
| Kuantizasyon | 4-bit |
DiT Flow Matching
Diffusion Transformer, sınıflandırıcısız yönlendirme ile koşullu flow matching kullanarak konuşma token'larını mel spektrogramlarına rafine eder.
| Parametre | Değer |
|---|---|
| Katman sayısı | 22 |
| Boyut | 1024 |
| Attention başlıkları | 16 |
| Koşullandırma | AdaLN (Adaptive Layer Norm) |
| ODE solver | Euler, 10 adım |
| CFG oranı | 0.7 |
HiFi-GAN Vocoder
Mel spektrogramlarını dalga formuna dönüştüren Neural Source Filter (NSF) vocoder.
| Parametre | Değer |
|---|---|
| Harmonikler | 8 |
| Upsample oranı | 480x (8 x 5 x 3 x ISTFT 4) |
| ISTFT | n_fft=16, hop=4 |
| Çıkış örnekleme frekansı | 24 kHz |
Model ağırlıkları
| Sürüm | LLM | DiT | Boyut | HuggingFace |
|---|---|---|---|---|
4bit (varsayılan) | 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 |
Her bundle LLM, DiT flow matching dekoder, HiFi-GAN vocoder ve zero-shot ses klonlama için gereken S3-Tokenizer referans kodlayıcıyı içerir. Daha küçük indirme/disk için küçük bundle'ları seçin; LLM/DiT kuantizasyon gürültüsü sorun olduğunda (uzun-form sentez, ses klonlama doğruluğu) bf16'yı seçin.
CLI kullanımı
.build/release/speech speak "Hallo Welt" --engine cosyvoice --language german -o output.wav
Örnekler
# English
.build/release/speech speak "Hello, how are you?" --engine cosyvoice -o hello_en.wav
# Chinese
.build/release/speech speak "你好世界" --engine cosyvoice --language chinese -o hello_cn.wav
# Spanish
.build/release/speech speak "Hola, buenos días" --engine cosyvoice --language spanish -o hello_es.wav
# French
.build/release/speech speak "Bonjour le monde" --engine cosyvoice --language french -o hello_fr.wav
Ses klonlama
--voice-sample flag'i ile kısa bir referans klipten herhangi bir sesi klonlayın. CosyVoice3, DiT flow modelini koşullandıran 192 boyutlu bir embedding çıkarmak için CAM++ konuşmacı kodlayıcısını kullanır.
# Voice cloning
.build/release/speech speak "Hello in your voice" --engine cosyvoice --voice-sample reference.wav -o cloned.wav
# Cross-language: clone voice, speak in German
.build/release/speech speak "Guten Tag" --engine cosyvoice --voice-sample reference.wav --language german -o german.wav
Nasıl çalışır
- CAM++ konuşmacı kodlayıcısı CoreML (Neural Engine) üzerinden referans sesten 192 boyutlu bir embedding çıkarır
- Affine projeksiyon (192 → 80) DiT flow matching kod çözücüsünü hedef ses üzerinde koşullandırır
- HiFi-GAN vocoder konuşmacıya koşullandırılmış mel spektrogramını 24 kHz sese dönüştürür
Konuşmacı kodlayıcısı
| Özellik | Değer |
|---|---|
| Model | CAM++ (Context-Aware Masking++) |
| Embedding | 192 boyut |
| Arka uç | CoreML (Neural Engine, FP16) |
| Boyut | ~14 MB |
| HuggingFace | aufklarer/CamPlusPlus-Speaker-CoreML |
CAM++ modeli, --voice-sample ilk kullanıldığında otomatik olarak indirilir. Referans ses ipuçları ve Swift API için Ses klonlama kılavuzuna bakın.
Çok konuşmacılı diyalog
Satır içi konuşmacı etiketleri kullanarak birden fazla konuşmacı arasındaki diyalogları sentezleyin. Her konuşmacıya --speakers flag'i aracılığıyla bir referans ses dosyasından bir ses atanır.
# Two-speaker dialogue with voice cloning
.build/release/speech speak "[S1] Hello there! [S2] Hey, how are you?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o dialogue.wav
# Three speakers
.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
Etiketlerdeki konuşmacı adları büyük/küçük harfe duyarsızdır ve eşleme anahtarlarıyla eşleştirilir. Sıralar arasına yapılandırılabilir bir sessizlik aralığı (varsayılan 0,2s) eklenir.
| Seçenek | Varsayılan | Açıklama |
|---|---|---|
--speakers | Konuşmacı eşlemesi: s1=file.wav,s2=file.wav | |
--turn-gap | 0.2 | Sıralar arasındaki sessizlik (saniye) |
--crossfade | 0.0 | Sıralar arasındaki crossfade çakışması (saniye) |
Duygu ve stil etiketleri
Satır içi duygu etiketleriyle konuşma stilini segment bazında kontrol edin. CosyVoice3, <|endofprompt|> token'ından önceki metin önekini stil talimatı olarak kullanır — duygu etiketleri, bu öneki değiştiren doğal dil talimatlarına eşlenir.
# Emotion tags
.build/release/speech speak "(excited) Wow, amazing! (sad) But I have to go..." \
--engine cosyvoice -o emotion.wav
# Combined with speakers
.build/release/speech speak "[S1] (happy) Great news! [S2] (surprised) Really?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o combined.wav
# Freeform instruction as tag
.build/release/speech speak "(Speak like a pirate) Ahoy matey!" \
--engine cosyvoice -o pirate.wav
# Global instruction (applies to all segments without emotion tags)
.build/release/speech speak "Hello world" \
--engine cosyvoice --cosy-instruct "Speak cheerfully" -o cheerful.wav
Hazır duygu etiketleri
| Etiket | Talimat |
|---|---|
happy / excited | Mutlu ve heyecanlı bir şekilde konuşun. |
sad | Hüzünlü, melankolik bir tonla konuşun. |
angry | Öfke ve yoğunlukla konuşun. |
whispers / whispering | Yumuşak, nazik bir fısıltıyla konuşun. |
laughs / laughing | Gülerek konuşun. |
calm | Sakin ve huzurlu konuşun. |
surprised | Şaşkınlık ve hayretle konuşun. |
serious | Ciddi, resmi bir tonla konuşun. |
Bilinmeyen etiketler serbest biçim talimatlar olarak geçer, böylece (Speak in a slow, dramatic voice) olduğu gibi çalışır.
Model kontrol token'ları (fl_ token'ları)
Dahili olarak CosyVoice3 LLM, modlar arasında (zero-shot klonlama, talimatla sentez, konuşmacı kaydetme vb.) geçiş yapmak için fl_ önekli özel kontrol token'ları kullanır. Bu token'lar upstream FunAudioLLM tokenizer'ının bir parçasıdır; Soniqo çalışma zamanı, kullandığınız CLI flag'ine veya Swift API çağrısına göre doğru token'ı otomatik olarak yayar; bu yüzden onları asla elle yazmazsınız.
| Kontrol token'ı | Mod | Soniqo'dan nasıl çağrılır |
|---|---|---|
<|fl_speaker_clone|> | Referans bir ses klipinden zero-shot ses klonlama | CLI'de --voice-sample reference.wav geçirin veya Swift API'de voiceSample: ayarlayın. |
<|fl_speaker_instruct|> | Varsayılan bir sesle talimat veya stil koşullu sentez | --cosy-instruct "Speak cheerfully" geçirin veya --voice-sample olmadan satır içi (happy) etiketi kullanın. |
<|fl_speaker_instruct2|> | Klonlanmış referans sesle birlikte talimat sentezi | Aynı çağrıda --voice-sample reference.wav ile --cosy-instruct "..." (veya satır içi duygu etiketi) birleştirin. |
<|fl_save_speaker|> | Her çağrıda referans sesi yeniden kodlamadan tekrar kullanmak için bir konuşmacının embedding'ini kalıcı hale getirme | Soniqo CLI'de doğrudan açığa çıkarılmamıştır — embedding'ler çağrı başına hesaplanır. Önbelleğe almak için 192 boyutlu CAM++ vektörünü Konuşmacı embedding modülü aracılığıyla kendiniz çıkarıp ileriye geçirin. |
<|fl_speaker_clone_zh|>, <|fl_speaker_clone_en|>, … | Upstream tokenizer tarafından kullanılan dile özgü zero-shot klonlama ipuçları | --voice-sample ile --language german|spanish|chinese|... birleştirin. Soniqo, --language flag'inden doğru dil ipucunu seçer. |
Yukarıdaki tablo, her upstream fl_ kontrol token'ını Soniqo eşdeğerine eşler. Prompt'unuza asla fl_ token'ı eklemenize gerek yoktur — üst düzey CLI flag'leri veya Swift API argümanlarını geçirin; çalışma zamanı doğru diziyi yayacaktır: clone → instruct → instruct2 → save_speaker.
Sampling
LLM aşaması aşağıdaki sampling yapılandırmasını kullanır:
| Parametre | Değer |
|---|---|
| Top-k | 25 |
| Top-p | 0.8 |
| Repetition Aware Sampling | Etkin (window=10, tau_r=0.1) |
VALL-E 2'den gelen Repetition Aware Sampling (RAS), son üretilen 10 token'da görünen token'ları cezalandırır. Bu, tekrarlayan ses artefaktlarını önler ve çıkış kararlılığını artırır.
Performans
M2 Max üzerinde CosyVoice3 yaklaşık 0,5 RTF elde eder — gerçek zamandan daha hızlı.
| Aşama | Gecikme |
|---|---|
| LLM (derlenmiş) | ~13 ms/token |
| DiT Flow Matching | 370 - 520 ms |
| HiFi-GAN | 50 - 170 ms |
LLM aşaması otoregresif döngü için compile(shapeless: true) kullanır; bu da değişen dizi uzunluklarında yeniden derleme yükünü ortadan kaldırır. Toplu-iki-katına-çıkarılmış CFG, DiT ileri geçişlerinin sayısını 20'den 10'a yarıya indirir.