Traducere automată · Originalul în engleză

Clonare vocală

Clone any voice from a short referince audio move. IndexTTS2 adams native MLX zero-shot with emotion, tempo, and pay controls, alaturi de Qwen3-TTS and CosyVoice3 speaker-encoder clling.

Cum funcţionează

  1. Record sau furnizarea unui eșantion audio de referință al vocii țintă
  2. Vorbitor care înglobează extracţia ا un codor difuzor procesează audio de referinţă într-un vector de înglobare fix-dimensional
  3. Injecție de masă ا difuzorul înglobează condițiile TTS model în timpul sintezei
  4. Sinteza vorbirii Modelul TTS generează vorbire care corespunde caracteristicilor vocale ale eșantionului de referință

Motoare

Clonarea vocală este disponibilă cu mai multe motoare TTS. IndexTTS2 folosește prompt audio și stil de condiționare; Qwen3-TTS și CosyVoice3 utilizează codoare difuzor:

F5-TTS și Higgs TTS 3 săriți peste encodorul vorbitorului în întregime: F5 condiții privind mel-ul de referință brut plus transcrierea acestuia, Higgs continuă cadrele de referință codificate codec.

Motor Codor difuzorName ÎnglobareaPlatformă
Qwen3-TTS ECAPA- TDNN1024-dim x-vectorMLX (GPU)
CosyVoice3CAM++192-dimCoreML (Neural Engine)
IndexTTS2w2v-BERT + MaskGCT + CAMPPlus coduri semantice + prompt mel + 192-dim stilMLX (GPU)
F5-TTS nici unul Mel de referință cu 100 de benziMLX (GPU)
Higgs TTS 3Higgs codec encoder Coduri de referință 8-codebookMLX (GPU)

IndexTTS2 Clonarea vocală

IndexTTS2 este un motor nativ MLX cu clonare vocală zero. --voice-sample, descărcări aufklarer/IndexTTS2-MLX-fp16 în mod implicit, și susține referințe emoție/stil opțional, preset sau vector de control al emoției, de ajustare a ratei de vorbire, și interne-pauză plafonare. În prezent se execută numai sinteza lotului. Emoție poate veni de la un preset sau un vector 8 (--indextts2-emotion, ponderată de --indextts2-emotion-weight) sau de la o referință în stil separat (--indextts2-emotion-audio); --indextts2-s2mel-steps tranzacții cu trepte de debit pentru viteză (default) 15, auriculară - validată). float32-attention decodează relucrează la RTF ≈ 1.0 pe M5 Pro. Mandarina și textul mixt chinez/englez sunt manipulate nativ

F5-TTS Clonarea vocală

Clonele F5-TTS dintr-o referință ~10-secundă plus transcrierea sa (--f5-reference-text) prin potrivirea fluxului DiT RTF 0.57 în mod implicit 16 pașii de curgere, mai jos este mai rapid) și cel mai mic (~0.8 GB vârf RSS), care acoperă limba engleză și mandarina. Ghid F5-TTS.

Higgs TTS 3 Clonarea vocală

Higgs TTS 3 (4B) codifică clipul de referință în cadre codec și continuă: livrare conversațională expresivă cu emoție, stil, și tag-uri SFX, 100+ limbi RTF 0,78. O transcriere de referință (--higgs-ref-text) îmbunătățește clonarea. A se vedea Higgs TTS 3 ghid.

CosyVoice3 + CAM++

CosyVoice3 folosește codul de difuzor CAM++ (Context-Aware Masking++) din proiectul 3D-Speaker al Alibaba. Condițiile de încorporare de 192 dim modelul de flux DiT prin intermediul unui strat de proiecție afină (192 → 80) care a fost instruit în comun cu CosyVoice3.

Arhitectură CAM++

Etape Descriere
FCM Modul de convoluție frontală (Conv2d + 2 ResBlocks, 32 canale)
TDNN Timp Întârziere Rețea Neural (320 până la 128 canale, dimensiunea nucleului 5)
Blocuri D-TDNN3 blocuri dens conectate (12/24/16 straturi) cu mascare conţinută în context
Stats PoolMedia + punerea în comun a abaterilor standard (statistici globale)
DensitateProiecție liniară la 192-dim înglobare

Modelul CoreML (~14 MB, FP16) rulează pe Neural Engine. Este descărcat automat de la aufklarer/CamPlusPlus-Speaker-CoreML la prima utilizare.

Qwen3-TTS Clonarea vocală

Qwen3-TTS suportă două moduri de clonare vocală:

Modul ICL (recomandat)

Modul Invatare In-Context codifică audio de referinţă în tokenuri codec prin intermediul Mimi tokenizer speech encoder şi le prepends cu transcrierea de referinţă. Aceasta oferă modelul context acustic complet

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
)

Qwen3-TTS conservă 1920 probe per cadru codec la 24 kHz, inclusiv între bucățile decodate suprapuse. Ambele straturi de pre-upsampling utilizează lățimea nucleului 2 și stride 2 fără tundere corectă, păstrând forma de undă țintă la limitele bucăților și în timpul eliminării de referință a ICL.

Modul Vector X

Folosește un codor ECAPA-TDNN care produce un vector x 1024-dim. Nu este necesară o transcriere, dar o calitate mai mică. Poate să nu emită EOS pe texte scurte sau anumite limbi.

Arhitectura ECAPA-TDNN

Etape Descriere
TDNNReţeaua Neurală de timp (128 până la 512 canale, dimensiunea nucleului 5)
SE-Res2Net blocuri3 blocuri cu strunguri si excitatie (512 canale, dilatare 2/3/4)
MAEAgregarea caracteristicilor multiple (1536 canale + ReLU)
ASP Statistici atente Pooling (1536 canale, softmax în timp)
FC Strat complet conectat (de la 3072 la 1024 dimensiuni)

Greutatea (76 de parametri) este inclusă în Qwen3-TTS seiftensors

Utilizarea CLI

# CosyVoice3 voice cloning (CAM++, CoreML Neural Engine)
.build/release/speech speak "Text in the cloned voice" \
    --engine cosyvoice --voice-sample reference.wav -o output.wav

# IndexTTS2 voice cloning (expanded MLX bundle)
.build/release/speech speak "Text in the cloned voice" \
    --engine indextts2 --voice-sample reference.wav \
    --indextts2-speaking-rate 1.35 \
    --indextts2-max-pause 0.05 \
    -o output.wav

# F5-TTS voice cloning (reference + transcript, MLX GPU)
.build/release/speech speak "Text in the cloned voice" \
    --engine f5 --voice-sample reference.wav \
    --f5-reference-text "Transcript of the reference clip." -o output.wav

# Higgs TTS 3 voice cloning (4B, expressive, MLX GPU)
.build/release/speech speak "Text in the cloned voice" \
    --engine higgs --voice-sample reference.wav \
    --higgs-ref-text "Transcript of the reference clip." -o output.wav

# Qwen3-TTS voice cloning (ECAPA-TDNN, MLX GPU)
.build/release/speech speak "Text in the cloned voice" \
    --voice-sample reference.wav -o output.wav

Exemple

# CosyVoice3: multilingual voice cloning (9 languages)
.build/release/speech speak "Hello, this is my cloned voice." \
    --engine cosyvoice --voice-sample my_voice.wav -o cloned_hello.wav

# CosyVoice3: clone voice in a different language
.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: English voice cloning
.build/release/speech speak "The quick brown fox jumps over the lazy dog." \
    --voice-sample recording_15s.wav -o cloned_fox.wav

# IndexTTS2: local exported bundle
.build/release/speech speak "This voice was cloned locally." \
    --engine indextts2 --voice-sample my_voice.wav \
    --indextts2-speaking-rate 1.35 \
    --indextts2-max-pause 0.05 \
    --indextts2-bundle-dir /path/to/IndexTTS2-MLX-fp16 \
    -o indextts2.wav

Dialog multi-speaker

CosyVoice3 suportă dialogul multi-speaker cu clonarea vocală per-speacher. Utilizați steagul --speakers pentru a cartografia etichetele difuzorului pentru a face trimitere la fișierele audio:

# 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

# Dialogue with emotion tags + voice cloning
.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

# Adjust silence between turns
.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

Fiecare audio de referință al speakerului este procesat prin intermediul codorului CAM++ pentru a extrage o înglobare de 192 dim. Modelul este încărcat o dată și reutilizat pentru toți vorbitorii. A se vedea ghidul CosyVoice3 pentru detalii complete privind sintaxa dialogurilor și etichetele emoționale.

Sfaturi audio de referință

Important

Pentru Qwen3-TTS, clonarea vocii funcționează cu base numai modelul customVoice. Clonarea vocală CosyVoice3 funcționează cu modelul implicit. IndexTTS2 necesită --voice-sample, rulează în prezent sinteza lotului numai, și acceptă controale emoționale / stil opțional.

Swift API

import CosyVoiceTTS

// CosyVoice3 voice cloning
let model = try await CosyVoiceTTSModel.fromPretrained()
let speaker = try await CamPlusPlusSpeaker.fromPretrained()

// Extract 192-dim speaker embedding from reference audio
let embedding = try speaker.embed(audio: refSamples, sampleRate: 16000)

// Synthesize with cloned voice
let audio = model.synthesize(
    text: "Hello in a cloned voice!",
    speakerEmbedding: embedding
)

// With custom instruction + speaker embedding
let styledAudio = model.synthesize(
    text: "Hello!",
    instruction: "Speak happily and with excitement.",
    speakerEmbedding: embedding
)

// Multi-speaker dialogue
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 voice cloning
let model = try await Qwen3TTSModel.fromPretrained()
let audio = model.synthesizeWithVoiceClone(
    text: "Hello in a cloned voice!",
    referenceAudio: refSamples,
    referenceSampleRate: 24000
)
import IndexTTS2TTS

// IndexTTS2 zero-shot voice cloning
let model = try await IndexTTS2TTSModel.fromPretrained()
let audio = try await model.generate(
    text: "Hello in a cloned voice!",
    referenceAudio: URL(fileURLWithPath: "reference.wav"),
    synthesisOptions: try IndexTTS2SynthesisOptions(
        speakingRate: 1.35,
        maxInternalPauseDuration: 0.05)
)

Caching audio de referință

Atât synthesizeWithVoiceClone (x-vector) cât și synthesizeWithVoiceCloneICL (ICL) cache their per-reference preprocesing through cans on the same model instance. The x-vector path caches the ECAPA-TDNN speaker intogeding; the ICL path additional caches the Mimi codec encoder outlined. Cache is content-adrested (hash of crude esantioane + probation rate) and limit to a small LRU (default 4 entrys), so repetited generations against the same reference waveform skip the mel + encoder pass without unbounded memory growth.

let tts = try await Qwen3TTSModel.fromPretrained()

// First call: runs ECAPA-TDNN, caches the embedding
_ = tts.synthesizeWithVoiceClone(text: "Hello", referenceAudio: ref, ...)

// Subsequent calls with the same reference: cache hit
_ = tts.synthesizeWithVoiceClone(text: "How are you?", referenceAudio: ref, ...)

// Explicit eviction (rarely needed — LRU handles capacity)
tts.clearReferenceAudioCache()