Stimmklonen
Klone jede Stimme aus einer kurzen Referenz-Audioaufnahme. Sowohl Qwen3-TTS als auch CosyVoice3 unterstützen Stimmklonen mit unterschiedlichen Speaker-Encodern — ECAPA-TDNN (1024-dim) bzw. CAM++ (192-dim).
Funktionsweise
- Nimm auf oder stelle eine Referenz-Audioaufnahme der Zielstimme bereit
- Sprecher-Embedding-Extraktion — ein Sprecher-Encoder verarbeitet das Referenz-Audio zu einem Embedding-Vektor fester Dimension
- Embedding-Einspeisung — das Sprecher-Embedding konditioniert das TTS-Modell während der Synthese
- Sprachsynthese — das TTS-Modell erzeugt Sprache, die den vokalen Eigenschaften der Referenzaufnahme entspricht
Engines
Stimmklonen ist mit beiden TTS-Engines verfügbar. Jede verwendet einen anderen Sprecher-Encoder:
| Engine | Sprecher-Encoder | Embedding | Backend |
|---|---|---|---|
| Qwen3-TTS | ECAPA-TDNN | 1024-dim x-Vektor | MLX (GPU) |
| CosyVoice3 | CAM++ | 192-dim | CoreML (Neural Engine) |
CosyVoice3 + CAM++
CosyVoice3 verwendet den CAM++-Sprecher-Encoder (Context-Aware Masking++) aus Alibabas 3D-Speaker-Projekt. Das 192-dim-Embedding konditioniert das DiT-Flow-Modell über eine affine Projektionsschicht (192 → 80), die gemeinsam mit CosyVoice3 trainiert wurde.
CAM++-Architektur
| Stufe | Beschreibung |
|---|---|
| FCM | Front-End-Convolutional-Modul (Conv2d + 2 ResBlöcke, 32 Kanäle) |
| TDNN | Time Delay Neural Network (320 auf 128 Kanäle, Kernel-Größe 5) |
| D-TDNN-Blöcke | 3 dicht verbundene Blöcke (12/24/16 Schichten) mit kontextbewusstem Masking |
| Stats Pool | Mittelwert- + Standardabweichungs-Pooling (globale Statistiken) |
| Dense | Lineare Projektion auf ein 192-dim-Embedding |
Das CoreML-Modell (~14 MB, FP16) läuft auf der Neural Engine. Es wird beim ersten Gebrauch automatisch von aufklarer/CamPlusPlus-Speaker-CoreML heruntergeladen.
Qwen3-TTS-Stimmklonen
Qwen3-TTS unterstützt zwei Modi für Stimmklonen:
ICL-Modus (empfohlen)
Der In-Context-Learning-Modus kodiert das Referenz-Audio über den Mimi-Speech-Tokenizer-Encoder in Codec-Tokens und stellt sie dem Referenztranskript voran. Das liefert dem Modell den vollständigen akustischen Kontext — höhere Qualität und zuverlässige EOS (behebt Probleme mit kurzen Texten und nicht-englischen Sprachen).
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-Vektor-Modus
Verwendet einen ECAPA-TDNN-Encoder, der einen 1024-dim x-Vektor erzeugt. Kein Transkript nötig, aber geringere Qualität. Kann bei kurzen Texten oder bestimmten Sprachen EOS verfehlen.
ECAPA-TDNN-Architektur
| Stufe | Beschreibung |
|---|---|
| TDNN | Time Delay Neural Network (128 auf 512 Kanäle, Kernel-Größe 5) |
| SE-Res2Net-Blöcke | 3 Blöcke mit Squeeze-and-Excitation (512 Kanäle, Dilation 2/3/4) |
| MFA | Multi-Layer-Feature-Aggregation (1536 Kanäle + ReLU) |
| ASP | Attentive Statistics Pooling (1536 Kanäle, Softmax über die Zeit) |
| FC | Vollverbundene Schicht (3072 auf 1024 Dimensionen) |
Die Gewichte (76 Parameter) sind in den Qwen3-TTS-safetensors enthalten — kein separater Download nötig.
CLI-Verwendung
# CosyVoice3-Stimmklonen (CAM++, CoreML Neural Engine)
.build/release/audio speak "Text in the cloned voice" \
--engine cosyvoice --voice-sample reference.wav -o output.wav
# Qwen3-TTS-Stimmklonen (ECAPA-TDNN, MLX GPU)
.build/release/audio speak "Text in the cloned voice" \
--voice-sample reference.wav -o output.wav
Beispiele
# CosyVoice3: mehrsprachiges Stimmklonen (9 Sprachen)
.build/release/audio speak "Hello, this is my cloned voice." \
--engine cosyvoice --voice-sample my_voice.wav -o cloned_hello.wav
# CosyVoice3: Stimme in einer anderen Sprache klonen
.build/release/audio speak "Guten Tag, das ist meine geklonte Stimme." \
--engine cosyvoice --voice-sample my_voice.wav --language german -o german.wav
# Qwen3-TTS: englisches Stimmklonen
.build/release/audio speak "The quick brown fox jumps over the lazy dog." \
--voice-sample recording_15s.wav -o cloned_fox.wav
Mehrsprecher-Dialog
CosyVoice3 unterstützt Mehrsprecher-Dialoge mit Stimmklonen pro Sprecher. Verwende das Flag --speakers, um Sprecher-Tags auf Referenz-Audiodateien abzubilden:
# Zweisprecher-Dialog mit Stimmklonen
.build/release/audio speak "[S1] Hello there! [S2] Hey, how are you?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o dialogue.wav
# Dialog mit Emotions-Tags + Stimmklonen
.build/release/audio speak "[S1] (happy) Great news! [S2] (surprised) Really? Tell me more." \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o emotional_dialogue.wav
# Stille zwischen den Turns anpassen
.build/release/audio speak "[S1] First line. [S2] Second line." \
--engine cosyvoice --speakers s1=a.wav,s2=b.wav --turn-gap 0.5 -o gapped.wav
Das Referenz-Audio jedes Sprechers wird durch den CAM++-Encoder verarbeitet, um ein 192-dim-Embedding zu extrahieren. Das Modell wird einmal geladen und für alle Sprecher wiederverwendet. Siehe die CosyVoice3-Anleitung für alle Details zur Dialogsyntax und zu Emotions-Tags.
Tipps für Referenzaudio
- Dauer: 5 bis 15 Sekunden Sprache funktionieren am besten. Kürzere Clips erfassen möglicherweise nicht genug vokale Merkmale; längere Clips bringen nur geringen Mehrwert.
- Einzelner Sprecher: Die Referenz sollte nur einen Sprecher enthalten. Mehrsprecher-Audio führt zu unvorhersehbaren Ergebnissen.
- Sauberes Audio: Minimiere Hintergrundgeräusche, Musik und Hall. Nutze das Sprachverbesserungs-Modul, um verrauschte Referenzen vor dem Klonen zu säubern.
- Natürliche Sprache: Verwende konversationelle, natürlich klingende Sprache statt Flüstern, Schreien oder Singen.
Bei Qwen3-TTS funktioniert Stimmklonen nur mit dem Modell base — nicht mit customVoice. CosyVoice3-Stimmklonen funktioniert mit dem Standardmodell.
Swift-API
import CosyVoiceTTS
// CosyVoice3-Stimmklonen
let model = try await CosyVoiceTTSModel.fromPretrained()
let speaker = try await CamPlusPlusSpeaker.fromPretrained()
// 192-dim-Sprecher-Embedding aus Referenz-Audio extrahieren
let embedding = try speaker.embed(audio: refSamples, sampleRate: 16000)
// Mit geklonter Stimme synthetisieren
let audio = model.synthesize(
text: "Hello in a cloned voice!",
speakerEmbedding: embedding
)
// Mit benutzerdefinierter Instruktion + Sprecher-Embedding
let styledAudio = model.synthesize(
text: "Hello!",
instruction: "Speak happily and with excitement.",
speakerEmbedding: embedding
)
// Mehrsprecher-Dialog
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-Stimmklonen
let model = try await Qwen3TTSModel.fromPretrained()
let audio = model.synthesizeWithVoiceClone(
text: "Hello in a cloned voice!",
referenceAudio: refSamples,
referenceSampleRate: 24000
)