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

  1. Record of geef een referentieaudiomonster van de doelstem
  2. Speaker inbedding extractie andere speaker encoder verwerkt de referentie audio in een vaste-dimensionale inbedding vector
  3. Inbeddingsinjectie De speaker inbedding condities het TTS model tijdens synthese
  4. 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.

MotorSpeakercoderInbeddingBackend
Qwen3-TTSECAPA-TDNN1024-dim x-vectorMLX (GPU)
CosyVoice3CAM++192-dimCoreML (Neural Engine)
IndexTTS2w2v-BERT + MaskGCT + CAMPPlussemantische codes + prompt mel + 192-dim stijlMLX (GPU)
F5-TTS geen 100-band referentie-melMLX (GPU)
Higgs TTS 3Higgs codec encoder8-codeboekreferentiecodesMLX (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
FCMConvolutionele module aan de voorzijde (Conv2d + 2 ResBlocks, 32 kanalen)
TDNN Tijdvertraging Neural Network (320 tot 128 kanalen, kernelgrootte 5)
D-TDNN-blokken3 dicht verbonden blokken (12/24/16 lagen) met context-bewuste maskering
Stats Pool Gemiddelde + standaardafwijkingspooling (globale statistieken)
DichtLineaire 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 blokken3 blokken met Squeeze-and-Excitation (512 kanalen, verwijding 2/3/4)
MVOMulti-layer functie samenvoegen (1536 kanalen + ReLU)
ASPAttentive 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

Belangrijk

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