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

  1. Kaydedin veya sağlayın — hedef sesin bir referans ses örneğini
  2. Konuşmacı embedding çıkarımı — bir konuşmacı encoder'ı referans sesi sabit boyutlu bir embedding vektörüne işler
  3. Embedding enjeksiyonu — konuşmacı embedding'i sentez sırasında TTS modelini koşullandırır
  4. 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:

MotorKonuşmacı encoderEmbeddingBackend
Qwen3-TTSECAPA-TDNN1024-dim x-vectorMLX (GPU)
CosyVoice3CAM++192-dimCoreML (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şamaAçıklama
FCMÖn uç convolution modülü (Conv2d + 2 ResBlock, 32 kanal)
TDNNTime 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 PoolOrtalama + standart sapma pooling (global istatistikler)
Dense192-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şamaAçıklama
TDNNTime 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)
MFAMulti-layer Feature Aggregation (1536 kanal + ReLU)
ASPAttentive Statistics Pooling (1536 kanal, zaman üzerinde softmax)
FCFully 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ı

Önemli

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()