Ses klonlama
Kısa bir referans ses örneğinden herhangi bir sesi klonlayın. Hem Qwen3-TTS hem de CosyVoice3, farklı konuşmacı encoder'larıyla ses klonlamayı destekler — sırasıyla ECAPA-TDNN (1024-dim) ve CAM++ (192-dim).
Nasıl çalışır
- Kaydedin veya sağlayın — hedef sesin bir referans ses örneğini
- Konuşmacı embedding çıkarımı — bir konuşmacı encoder'ı referans sesi sabit boyutlu bir embedding vektörüne işler
- Embedding enjeksiyonu — konuşmacı embedding'i sentez sırasında TTS modelini koşullandırır
- Konuşma sentezi — TTS modeli, referans örneğin ses özelliklerine uyan konuşma üretir
Motorlar
Ses klonlama her iki TTS motoru ile de kullanılabilir. Her biri farklı bir konuşmacı encoder'ı kullanır:
| Motor | Konuşmacı encoder | Embedding | Backend |
|---|---|---|---|
| Qwen3-TTS | ECAPA-TDNN | 1024-dim x-vector | MLX (GPU) |
| CosyVoice3 | CAM++ | 192-dim | CoreML (Neural Engine) |
CosyVoice3 + CAM++
CosyVoice3, Alibaba'nın 3D-Speaker projesinden CAM++ (Context-Aware Masking++) konuşmacı encoder'ını kullanır. 192-dim embedding, CosyVoice3 ile birlikte eğitilmiş bir affine projection katmanı (192 → 80) aracılığıyla DiT flow modelini koşullandırır.
CAM++ mimarisi
| Aşama | Açıklama |
|---|---|
| FCM | Ön uç convolution modülü (Conv2d + 2 ResBlock, 32 kanal) |
| TDNN | Time Delay Neural Network (320'den 128 kanala, kernel size 5) |
| D-TDNN blokları | context-aware masking ile yoğun bağlantılı 3 blok (12/24/16 katman) |
| Stats Pool | Ortalama + standart sapma pooling (global istatistikler) |
| Dense | 192-dim embedding'e linear projection |
CoreML modeli (~14 MB, FP16) Neural Engine üzerinde çalışır. İlk kullanımda aufklarer/CamPlusPlus-Speaker-CoreML'den otomatik olarak indirilir.
Qwen3-TTS ses klonlama
Qwen3-TTS iki ses klonlama modunu destekler:
ICL modu (önerilen)
In-Context Learning modu, referans sesi Mimi speech tokenizer encoder'ı aracılığıyla codec token'larına kodlar ve onları referans transkriptiyle önekler. Bu, modele tam akustik bağlam sağlar — daha yüksek kalite ve güvenilir EOS (kısa metinlerle ve İngilizce dışı dillerle yaşanan sorunları giderir).
let (model, encoder) = try await Qwen3TTSModel.fromPretrainedWithEncoder()
let audio = model.synthesizeWithVoiceCloneICL(
text: "Target text to synthesize.",
referenceAudio: refSamples,
referenceSampleRate: 24000,
referenceText: "Exact transcript of reference audio.",
language: "english",
codecEncoder: encoder
)
X-Vector modu
1024-dim x-vector üreten bir ECAPA-TDNN encoder'ı kullanır. Transkript gerekmez ama kalite daha düşüktür. Kısa metinlerde veya bazı dillerde EOS yaymayabilir.
ECAPA-TDNN mimarisi
| Aşama | Açıklama |
|---|---|
| TDNN | Time Delay Neural Network (128'den 512 kanala, kernel size 5) |
| SE-Res2Net blokları | Squeeze-and-Excitation ile 3 blok (512 kanal, dilation 2/3/4) |
| MFA | Multi-layer Feature Aggregation (1536 kanal + ReLU) |
| ASP | Attentive Statistics Pooling (1536 kanal, zaman üzerinde softmax) |
| FC | Fully connected katman (3072'den 1024 boyuta) |
Ağırlıklar (76 parametre) Qwen3-TTS safetensors'ına dahildir — ayrı indirme gerekmez.
CLI kullanımı
# CosyVoice3 ses klonlama (CAM++, CoreML Neural Engine)
.build/release/speech speak "Text in the cloned voice" \
--engine cosyvoice --voice-sample reference.wav -o output.wav
# Qwen3-TTS ses klonlama (ECAPA-TDNN, MLX GPU)
.build/release/speech speak "Text in the cloned voice" \
--voice-sample reference.wav -o output.wav
Örnekler
# CosyVoice3: çok dilli ses klonlama (9 dil)
.build/release/speech speak "Hello, this is my cloned voice." \
--engine cosyvoice --voice-sample my_voice.wav -o cloned_hello.wav
# CosyVoice3: farklı bir dilde ses klonlama
.build/release/speech speak "Guten Tag, das ist meine geklonte Stimme." \
--engine cosyvoice --voice-sample my_voice.wav --language german -o german.wav
# Qwen3-TTS: İngilizce ses klonlama
.build/release/speech speak "The quick brown fox jumps over the lazy dog." \
--voice-sample recording_15s.wav -o cloned_fox.wav
Çok konuşmacılı diyalog
CosyVoice3, konuşmacı başına ses klonlama ile çok konuşmacılı diyaloğu destekler. Konuşmacı etiketlerini referans ses dosyalarına eşlemek için --speakers bayrağını kullanın:
# Ses klonlama ile iki konuşmacılı diyalog
.build/release/speech speak "[S1] Hello there! [S2] Hey, how are you?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o dialogue.wav
# Duygu etiketleri + ses klonlama ile diyalog
.build/release/speech speak "[S1] (happy) Great news! [S2] (surprised) Really? Tell me more." \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o emotional_dialogue.wav
# Sıralar arasındaki sessizliği ayarlayın
.build/release/speech speak "[S1] First line. [S2] Second line." \
--engine cosyvoice --speakers s1=a.wav,s2=b.wav --turn-gap 0.5 -o gapped.wav
Her konuşmacının referans sesi, 192-dim embedding çıkarmak için CAM++ encoder'ı üzerinden işlenir. Model bir kez yüklenir ve tüm konuşmacılar için yeniden kullanılır. Diyalog sözdizimi ve duygu etiketleri hakkında tam ayrıntılar için CosyVoice3 kılavuzuna bakın.
Referans ses ipuçları
- Süre: 5 ila 15 saniye konuşma en iyi sonucu verir. Daha kısa klipler yeterli ses özelliği yakalayamayabilir; daha uzun klipler azalan getirilere yol açar.
- Tek konuşmacı: Referans yalnızca bir konuşmacı içermelidir. Çok konuşmacılı ses öngörülemez sonuçlar üretir.
- Temiz ses: Arka plan gürültüsünü, müziği ve yankıyı en aza indirin. Klonlamadan önce gürültülü referansları temizlemek için konuşma iyileştirme modülünü kullanın.
- Doğal konuşma: Fısıltı, bağırma veya şarkı söyleme yerine konuşma havasında, doğal sesli konuşmayı kullanın.
Qwen3-TTS için ses klonlama yalnızca base modeliyle çalışır — customVoice ile çalışmaz. CosyVoice3 ses klonlama varsayılan modelle çalışır.
Swift API
import CosyVoiceTTS
// CosyVoice3 ses klonlama
let model = try await CosyVoiceTTSModel.fromPretrained()
let speaker = try await CamPlusPlusSpeaker.fromPretrained()
// Referans sesten 192-dim konuşmacı embedding'i çıkar
let embedding = try speaker.embed(audio: refSamples, sampleRate: 16000)
// Klonlanmış sesle sentez
let audio = model.synthesize(
text: "Hello in a cloned voice!",
speakerEmbedding: embedding
)
// Özel talimat + konuşmacı embedding ile
let styledAudio = model.synthesize(
text: "Hello!",
instruction: "Speak happily and with excitement.",
speakerEmbedding: embedding
)
// Çok konuşmacılı diyalog
let segments = DialogueParser.parse("[S1] (happy) Hi! [S2] Hey there.")
let embeddings = ["S1": aliceEmbedding, "S2": bobEmbedding]
let dialogueAudio = DialogueSynthesizer.synthesize(
segments: segments,
speakerEmbeddings: embeddings,
model: model,
language: "english"
)
import Qwen3TTS
// Qwen3-TTS ses klonlama
let model = try await Qwen3TTSModel.fromPretrained()
let audio = model.synthesizeWithVoiceClone(
text: "Hello in a cloned voice!",
referenceAudio: refSamples,
referenceSampleRate: 24000
)
Referans ses cache'i
Hem synthesizeWithVoiceClone (x-vector) hem de synthesizeWithVoiceCloneICL (ICL), aynı model örneğindeki çağrılar arasında referans başına ön işlemeyi cache'ler. X-vector yolu ECAPA-TDNN konuşmacı embedding'ini cache'ler; ICL yolu ek olarak Mimi codec encoder çıktısını da cache'ler. Cache içeriğe göre adreslenir (ham örneklerin + sample rate'in hash'i) ve küçük bir LRU ile sınırlandırılır (varsayılan 4 giriş); böylece aynı referans dalga formuna karşı tekrar eden üretimler mel + encoder geçişlerini sınırsız bellek büyümesi olmadan atlar.
let tts = try await Qwen3TTSModel.fromPretrained()
// İlk çağrı: ECAPA-TDNN'i çalıştırır, embedding'i cache'ler
_ = tts.synthesizeWithVoiceClone(text: "Hello", referenceAudio: ref, ...)
// Aynı referansla sonraki çağrılar: cache isabeti
_ = tts.synthesizeWithVoiceClone(text: "How are you?", referenceAudio: ref, ...)
// Açık tahliye (nadiren gerekir — kapasiteyi LRU yönetir)
tts.clearReferenceAudioCache()