Maskinöversättning · Engelskt original

Röstkloning

Klon alla röster från en kort referens ljudprov. IndexTTS2 lägger till infödd MLX noll-shot kloning med känslor, tempo och paus kontroller, tillsammans med Qwen3-TTS och CosyVoice3 högtalar-encoder kloning.

Hur det fungerar

  1. Record eller ge ett referensljudprov av målrösten
  2. Speaker inbäddning extraktion - en högtalare kodare behandlar referensljudet i en fast-dimensionell inbäddningsvektor
  3. Inbäddning av injektion — högtalarens inbäddningsförhållanden TTS modell under syntesen
  4. Speech synthesis -- TTS-modellen genererar tal som matchar referensprovets vokalkaraktärer

Motorer

Voice kloning är tillgänglig med flera TTS motorer. IndexTTS2 använder snabb ljud- och stilkonditionering; Qwen3-TTS och CosyVoice3 använda högtalarkodare:

F5-TTS och Higgs TTS 3 hoppa över högtalarkodaren helt: F5 villkor på rå referensmelen plus dess transkript, Higgs fortsätter codec-kodade referensramar.

EngineHögtalare EncoderInbäddningBackend
Qwen3-TTSECAPA-TDNN1024-dim x-vektorMLX (GPU)
CosyVoice3CAM+++192-dimCoreML (Neural Engine)
IndexTTS2w2v-BERT + MaskGCT + CAMPPlussemantiska koder + snabb mel + 192-dim stilMLX (GPU)
F5-TTSIngen - rå referens mel + transkript100-bands referensmelMLX (GPU)
Higgs TTS 3Higgs codec encoder8-kodbok referenskoderMLX (GPU)

IndexTTS2 Voice Cloning

IndexTTS2 är en infödd MLX noll-shot röstkloningsmotor. Det kräver --voice-sample, nedladdningar aufklarer/IndexTTS2-MLX-fp16 Som standard, och stöder valfria känslor / stil referenser, förinställda eller vektor känslor kontroll, tala räntejustering och internt paus kapning. Det driver för närvarande batch syntes endast. Emotion kan komma från en förinställd eller en 8-värde vektor (ZXQ0)--indextts2-emotion, viktad av --indextts2-emotion-weight() eller från en separat stilreferens ()--indextts2-emotion-audio); --indextts2-s2mel-steps trades flow steps for speed (default 15, ear-validated). Efter float32-attention decode omarbeta det syntetiseras vid RTF ≈ 1.0 på en M5 Pro. Mandarin och blandad kinesisk / engelska text hanteras inhemskt - uppströms skiljetecken rewriting och per-karaktär pre-tokenization - siffrorna läses ut i ord, och lång text synteras i punktering.

F5-TTS Voice Cloning

F5-TTS kloner från en ~ 10-sekund referens plus dess transkript (--f5-reference-text) genom DiT-flödesmatchning - ingen högtalare kodare alls. Det är den snabbaste kloningen i paketet (RTF 0.57 vid standard 16 flödesstegen, lägre är snabbare) och den minsta (~ 0.8 GB-topp RSS), som täcker engelska och mandarin. Se F5-TTS guide.

Higgs TTS 3 Voice Cloning

Higgs TTS 3 (4B) kodar referensklippet i codec-ramar och fortsätter det: expressiv konversationsleverans med inline-känslor, stil och SFX-taggar, 100+ språk, RTF 0.78En referensavskrift (referensavskrift)--higgs-ref-text) förbättrar kloningen. se Higgs TTS 3 guide.

CosyVoice3 + CAM+++

CosyVoice3 använder CAM+++ (Context-Aware Masking++) högtalare från Alibabas 3D-Speaker-projekt. 192-dim inbäddningsförhållanden DiT-flödesmodellen via ett affinprojektionsskikt (192 → 80) som var gemensamt utbildat med CosyVoice3.

CAM++ Arkitektur

StegBeskrivning
FCMFront-end konvolutionell modul (Conv2d + 2 ResBlocks, 32 kanaler)
TDNNTime Delay Neural Network (320 till 128 kanaler, kärnstorlek 5)
D-TDNN block3 tätanslutna block (12/24/16 lager) med kontextmedveten maskering
StatspoolMedel + standardavvikelse poolning (global statistik)
DenseLinjär projektion till 192-dim inbäddning

CoreML modell (~14 MB, FP16) körs på Neural Engine. Den laddas automatiskt från aufklarer/CamPlusPlus-Speaker-CoreML vid första användning.

Qwen3-TTS Voice Cloning

Qwen3-TTS stöder två röstkloneringslägen:

ICL-läge (rekommenderas)

In-Context Learning-läge kodar referensljudet i codec-tokens via Mimi taltokenizer-kodaren och prepends dem med referensavskriften. Detta ger modellen full akustisk kontext - högre kvalitet och tillförlitliga EOS (fixar problem med korta texter och icke-engelska språk).

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 bevarar 1920 prover per codec-ram vid 24 kHz, inklusive överlappande avkodningsknappar. Både pre-upsamplingskikt använder kärnbredd 2 och steg 2

X-Vector Mode

Använder en ECAPA-TDNN-kodare som producerar en 1024-dim x-vektor. Inget transkript som behövs men lägre kvalitet. Kan misslyckas med att avge EOS på korta texter eller vissa språk.

ECAPA-TDNN arkitektur

StegBeskrivning
TDNNTime Delay Neural Network (128 till 512 kanaler, kärnstorlek 5)
SE-Res2Net block3 block med Squeeze-and-Excitation (512 kanaler, dilatation 2/3/4)
MFAMulti-layer Feature Aggregation (1536 kanaler + ReLU)
ASPAttentive Statistics Pooling (1536 kanaler, softmax över tiden)
FCFullt anslutna lager (3072 till 1024 dimensioner)

Vikterna (76 parametrar) ingår i Qwen3-TTS skyddsmedel - ingen separat nedladdning krävs.

CLI Användning

# 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

Exempel

# 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

Multihögtalardialog

CosyVoice3 stöder dialog med flertal talare med per-talare röstkloning. Använd --speakers flaggan för att kartlägga högtalartaggar till referensljudfiler:

# 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

Varje högtalares referensljud bearbetas genom CAM++-kodaren för att extrahera en 192-dim-inbäddning. Modellen laddas en gång och återanvänds för alla högtalare. Se CosyVoice3 guide för fullständiga detaljer om dialogsyntax och känslor taggar.

Referens Audio Tips

Viktigt

För Qwen3-TTS fungerar röstkloning med base-modellen endast - inte customVoice. CosyVoice3 röstklonning med standardmodellen. IndexTTS2 kräver --voice-sample, kör för närvarande batchsyntes endast och accepterar valfria känslor/stilkontroller.

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

Referens Audio Caching

Båda båda två synthesizeWithVoiceClone (x-vektor) och synthesizeWithVoiceCloneICL (ICL) cache deras per-referens preprocessing över samtal på samma modellinstans. x-vektorvägen cachar ECAPA-TDNN högtalare inbäddning; ICL-vägen ytterligare cachar Mimi codec kodare utgång. Cache är innehålls-adresserad (hash av råvaror + provhastighet) och bunden till en liten LRU (standard 4-poster), så upprepade generationer mot samma referensvågforma mel + kodaren passerar utan

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