Automatische vertaling · Engels origineel
Stemklonen
Kloon elke stem van een kort referentie audiomonster. IndexTTS2 voegt native MLX zero-shot klonen toe met emotie, tempo en pauzeregeling, naast Qwen3-TTS en CosyVoice3 speaker-encoderklonen.
Hoe het werkt
- Record of geef een referentieaudiomonster van de doelstem
- Speaker inbedding extractie andere speaker encoder verwerkt de referentie audio in een vaste-dimensionale inbedding vector
- Inbeddingsinjectie De speaker inbedding condities het TTS model tijdens synthese
- Spraaksynthese Het TTS-model genereert spraak die overeenkomt met de vocale kenmerken van het referentiemonster
Motoren
Voice klonen is beschikbaar met meerdere TTS motoren. IndexTTS2 maakt gebruik van prompte audio- en stijlconditionering; Qwen3-TTS en CosyVoice3 gebruik van speakercoders:
F5-TTS en Higgs TTS 3 sla de speakercoder volledig over: F5 voorwaarden op de ruwe referentiemel plus het transcript, Higgs gaat door met codec gecodeerde referentieframes.
| Motor | Speakercoder | Inbedding | Backend |
|---|---|---|---|
| Qwen3-TTS | ECAPA-TDNN | 1024-dim x-vector | MLX (GPU) |
| CosyVoice3 | CAM++ | 192-dim | CoreML (Neural Engine) |
| IndexTTS2 | w2v-BERT + MaskGCT + CAMPPlus | semantische codes + prompt mel + 192-dim stijl | MLX (GPU) |
| F5-TTS | geen | 100-band referentie-mel | MLX (GPU) |
| Higgs TTS 3 | Higgs codec encoder | 8-codeboekreferentiecodes | MLX (GPU) |
IndexTTS2 Voice Cloning
IndexTTS2 is een native MLX zero-shot voice-cloning engine. --voice-sample, downloads aufklarer/IndexTTS2-MLX-fp16 standaard, en ondersteunt optionele emotie / stijl referenties, preset of vector emotie controle, spreken-snelheid aanpassing, en interne-pauze-capping. Het draait momenteel alleen batch synthese. Emotie kan afkomstig zijn van een preset of een 8-waarde vector (--indextts2-emotion, gewogen met --indextts2-emotion-weight) of van een aparte stijlreferentie (--indextts2-emotion-audio); --indextts2-s2mel-steps trades flow stappen voor snelheid (standaard 15, oor gevalideerd). Na de float32-attention decode herwerken het synthetiseert op RTF ≈ 1.0 op een M5 Pro. Mandarijn en gemengde Chinees/Engelse tekst worden behandeld natively "upstream's punctuation rewriting en per-personal pre-tokenization nummers worden uitgelezen in woorden, en lange tekst wordt gesynthetiseerd in punctuatie-out-segmenten.
F5-TTS Voice Cloning
F5-TTS kloont van een ~10-seconde referentie plus zijn transcript (--f5-reference-text) door middel van DiT-stroommatching, geen speakercoder. Het is het snelste kloonpad in het pakket (RTF 0,57 bij de standaard 16 stroomstappen, lager is sneller) en het kleinste (~0,8 GB piek RSS), dat Engels en Mandarijn bestrijkt. Zie de F5-TTS.
Higgs TTS 3 Voice Cloning
Higgs TTS 3 (4B) codeert de referentieclip in codec-frames en vervolgt deze: expressieve conversatie met inline-emotie, stijl en SFX-tags, 100+ talen, RTF 0,78. Een referentie-transcript (--higgs-ref-text) verbetert het klonen. Zie de Higgs TTS 3 gids.
CosyVoice3 + CAM++
CosyVoice3 gebruikt het CAM++ (Context-Aware Masking++) speaker encoder van Alibaba's 3D-speaker project. De 192-dim inbeddingsomstandigheden van het DiT-stroommodel via een affine projectielaag (192 → 80) die gezamenlijk werd getraind met CosyVoice3.
CAM++ Architectuur
| Fase | Omschrijving |
|---|---|
| FCM | Convolutionele module aan de voorzijde (Conv2d + 2 ResBlocks, 32 kanalen) |
| TDNN | Tijdvertraging Neural Network (320 tot 128 kanalen, kernelgrootte 5) |
| D-TDNN-blokken | 3 dicht verbonden blokken (12/24/16 lagen) met context-bewuste maskering |
| Stats Pool | Gemiddelde + standaardafwijkingspooling (globale statistieken) |
| Dicht | Lineaire projectie tot 192-dim inbedding |
Het CoreML model (~14 MB, FP16) draait op de Neural Engine. Het wordt automatisch gedownload vanaf aufklarer/CamPlusPlus-Speaker-CoreML bij eerste gebruik.
Qwen3-TTS Voice Cloning
Qwen3-TTS ondersteunt twee stemkloonmodi:
ICL-modus (aanbevolen)
In-Context Learning mode codeert de referentie audio in codec tokens via de Mimi spraak tokenizer encoder en prependeert ze met het referentie transcript. Dit geeft het model volledige akoestische context .. hogere kwaliteit en betrouwbare EOS (fixeert problemen met korte teksten en niet-Engelse talen).
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 behoudt 1920 samples per codec frame op 24 kHz, inclusief over overlappende decode brokken. Beide pre-upsampling lagen gebruiken kernelbreedte 2 en zetten 2
X-vectormodus
Gebruikt een ECAPA-TDNN encoder die een 1024-dim x-vector produceert. Geen transcript nodig maar lagere kwaliteit. Kan niet uitstoten EOS op korte teksten of bepaalde talen.
Architectuur van ECAPA-TDNN
| Fase | Omschrijving |
|---|---|
| TDNN | Tijdvertraging Neural Network (128 tot 512 kanalen, kernelgrootte 5) |
| SE-Res2Net blokken | 3 blokken met Squeeze-and-Excitation (512 kanalen, verwijding 2/3/4) |
| MVO | Multi-layer functie samenvoegen (1536 kanalen + ReLU) |
| ASP | Attentive Statistics Pooling (1536 kanalen, softmax in de tijd) |
| FC | Volledig verbonden laag (3072 tot 1024 afmetingen) |
De gewichten (76 parameters) zijn opgenomen in de Qwen3-TTS safetensors, geen aparte download vereist.
CLI-gebruik
# 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
Voorbeelden
# 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
Multi-sprekerdialoog
CosyVoice3 ondersteunt de multi-luidsprekerdialoog met per-luidstemklonen. Gebruik de --speakers om luidsprekertags in kaart te brengen om audiobestanden te verwijzen:
# 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
Het referentieaudio van elke luidspreker wordt verwerkt via de CAM++-encoder om een 192-dim-inbedding te extraheren. Het model wordt eenmaal geladen en hergebruikt voor alle luidsprekers. Zie de CosyVoice3 guide voor volledige details over dialoogsyntaxis en emotie-tags.
Referentie-audiotips
- Duur: 5 tot 15 seconden spraak werkt het best. Kortere clips kunnen onvoldoende vocale kenmerken bevatten; langere clips geven een afnemend rendement.
- Single speaker: De referentie dient slechts één speaker te bevatten. Multi-speaker audio zal onvoorspelbare resultaten opleveren.
- Audio schoonmaken: Minimaliseer achtergrondgeluid, muziek en nagalm. Gebruik de -module voor het verbeteren van spraak om lawaaierige referenties te reinigen voor het klonen.
- Natural speech: Gebruik conversationele, natuurlijke spraak in plaats van fluisteren, schreeuwen of zingen.
Voor Qwen3-TTS werkt voice klonen met de base model alleen customVoice. CosyVoice3 voice klonen werkt met het standaard model. IndexTTS2 vereist --voice-sample, draait momenteel batch synthese alleen, en accepteert optionele emotie / stijl controles.
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)
)
Referentie-audio-caching
Zowel synthesizeWithVoiceClone (x-vector) als synthesizeWithVoiceCloneICL (ICL) cache hun per-reference preprocessing op dezelfde modelinstance. Het x-vectorpad caches de ECAPA-TDNN luidspreker embedden; het ICL pad extra caches de Mimi codec encoder uitvoer. De cache is inhoud-geadresseerd (hash van ruwe monsters + sample rate) en begrensd tot een kleine LRU (standaard 4 ingangen), dus herhaalde generaties tegen dezelfde referentie golfvorm sla de mel + encoder over zonder ongebonden geheugengroei.
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()