Qwen3-TTS
Qwen3-TTS ist ein 12-Hz-Codec-Sprachmodell mit Mimi-Decoder für hochwertige Sprachsynthese. Das Modell ist 4-Bit-quantisiert und läuft schneller als Echtzeit auf Apple Silicon.
Pipeline
Die Sprachsynthese folgt einer dreistufigen Pipeline:
- Talker — 28-lagiger Transformer, der Eingabetext in First-Codebook-Tokens mit 12,5 Hz umwandelt
- Code Predictor — 5-lagiger Transformer, der die verbleibenden 15 Codebooks aus den Hidden States des ersten Codebooks vorhersagt
- Mimi-Codec-Decoder — Wandelt alle 16 Codebook-Tokens in eine 24-kHz-Audiowellenform um
Architektur
Talker
Der Talker ist das zentrale autoregressive Modell, das aus Texteingaben Codec-Tokens erzeugt.
| Parameter | Wert |
|---|---|
| Schichten | 28 |
| Hidden-Dimension | 1024 |
| Query-Heads | 16 |
| Key/Value-Heads | 8 (GQA) |
| MLP | SwiGLU |
| Positionskodierung | RoPE |
Code Predictor
Ein leichtgewichtiger 5-lagiger Transformer, der die Hidden States des ersten Codebooks nimmt und die verbleibenden 15 Codebooks parallel vorhersagt. Das vermeidet, den vollen Talker pro Schritt 16 Mal auszuführen.
Mimi-Codec-Decoder
Der Mimi-Decoder wandelt quantisierte Codec-Tokens zurück in Audio:
- RVQ-Decode (16 Codebooks)
- Pre-Convolution (512 auf 1024 Kanäle)
- Pre-Transformer (1024 auf 512 Bottleneck, 8 Schichten, SwiGLU + LayerScale)
- Upsampling (2x, 2x)
- SEANet-Decoder (Upsample-Stufen 8x, 5x, 4x, 3x)
- 24-kHz-Wellenform-Ausgabe
Modellvarianten
| Modell | Größe | HuggingFace |
|---|---|---|
| Qwen3-TTS-0.6B Base (4-bit) | 1,7 GB | aufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-4bit |
| Qwen3-TTS-0.6B Base (8-bit) | 2,4 GB | aufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-8bit |
| Qwen3-TTS-0.6B CustomVoice (4-bit) | 1,7 GB | aufklarer/Qwen3-TTS-12Hz-0.6B-CustomVoice-MLX-4bit |
| Qwen3-TTS-1.7B Base (4-bit) | 3,2 GB | aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-4bit |
| Qwen3-TTS-1.7B Base (8-bit) | 4,8 GB | aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-8bit |
| Qwen3-TTS CoreML (FP16) | 2,1 GB | aufklarer/Qwen3-TTS-CoreML |
CoreML-Backend
Das CoreML-Backend führt die vollständige Qwen3-TTS-Pipeline über Core ML auf der GPU aus und ermöglicht damit die Bereitstellung auf iOS und macOS ohne MLX-Abhängigkeiten. Das Modell ist in 6 spezialisierte Submodelle aufgeteilt, optimiert für Apples Compute-Stack:
- TextProjector — Projiziert Text-Token-Embeddings in den gemeinsamen Hidden-Raum
- CodeEmbedder — Bettet First-Codebook-Tokens und Kontroll-Tokens ein
- MultiCodeEmbedder — Bettet Tokens aus den Codebooks 1–15 ein
- CodeDecoder — 28-lagiger autoregressiver Transformer mit zustandslosem KV-Cache (max. 256 Positionen)
- MultiCodeDecoder — 5-lagiger Code-Predictor für Codebooks 1–15
- SpeechDecoder — Mimi-Codec-Decoder, wandelt 16 Codebook-Tokens in 24-kHz-Audio um
# CoreML-Synthese
.build/release/audio speak "Hello, world!" --engine coreml -o hello.wav
# CoreML verwendet standardmäßig Temperatur 0.8 (für qualitativ hochwertige Ausgabe erforderlich)
.build/release/audio speak "Long text here." --engine coreml --temperature 0.9 -o out.wav
Der CoreML-CodeDecoder verwendet einen festen KV-Cache mit 256 Positionen. Längere Passagen sollten in einzelne Sätze aufgeteilt werden. Decode-Tokens werden automatisch auf die nach dem Prefill verbleibenden Cache-Slots begrenzt.
CLI-Verwendung
Sprache aus Text erzeugen:
.build/release/audio speak "Hello, world!" --output hello.wav
Optionen
| Schalter | Beschreibung |
|---|---|
--engine | TTS-Engine: qwen3 (MLX, Standard), coreml (CoreML/GPU) oder cosyvoice |
--output, -o | Pfad der Ausgabe-WAV-Datei |
--language | Sprache (Standard: english). Weglassen, um den nativen Dialekt des Sprechers zu verwenden. |
--model | Modellvariante: base oder customVoice |
--speaker | Sprecherstimme (benötigt --model customVoice) |
--temperature | Sampling-Temperatur (Standard: 0.3) |
--top-k | Top-k-Sampling-Parameter |
--max-tokens | Maximale Anzahl zu erzeugender Tokens (Standard: 500) |
--stream | Streaming aktivieren — gibt Audio-Chunks während der Erzeugung aus |
--first-chunk-frames | Anzahl der Frames im ersten gestreamten Chunk |
--chunk-frames | Anzahl der Frames pro nachfolgendem gestreamtem Chunk |
--batch-file | Pfad zu einer Textdatei mit einer Äußerung pro Zeile für Stapelsynthese |
--batch-size | Anzahl paralleler Äußerungen im Stapelmodus |
Beispiele
# Grundlegende Synthese
.build/release/audio speak "The quick brown fox." -o fox.wav
# Streaming-Ausgabe
.build/release/audio speak "Long passage of text..." --stream -o stream.wav
# Stapelsynthese aus Datei
.build/release/audio speak --batch-file sentences.txt --batch-size 4 -o output_dir/
Streaming
Der Schalter --stream aktiviert die gestückelte Audio-Ausgabe während der Erzeugung. Statt auf den Abschluss der kompletten Äußerung zu warten, wird Audio als Chunks ausgegeben, während Tokens produziert werden. Verwende --first-chunk-frames und --chunk-frames, um die Chunk-Größe zu steuern.
Stapelmodus
Zum Synthetisieren mehrerer Äußerungen verwende --batch-file mit einer Textdatei, die eine Äußerung pro Zeile enthält. Der Schalter --batch-size steuert, wie viele Äußerungen parallel verarbeitet werden.
Leistung
Auf einem M2 Max erreicht Qwen3-TTS einen RTF (Echtzeitfaktor) von ungefähr 0,55, d. h. es erzeugt Sprache schneller als Echtzeit. Mit compile()-Aufwärmen dauert jeder Schritt etwa 37 ms.
Das Standardmaximum liegt bei 500 Tokens, was bei 12,5 Hz ungefähr 40 Sekunden Audio ergibt. Höhere Werte riskieren ein Überschreiten des Metal-GPU-Watchdog-Timeouts, was auf Apple Silicon einen Systemneustart auslösen kann, da sich die GPU den Compositor teilt.
Sprachen
Qwen3-TTS unterstützt mehrsprachige Sprachsynthese. Das Modell erkennt automatisch die Eingabesprache und erzeugt entsprechend Sprache.
Swift-API
import Qwen3TTS
let model = try await Qwen3TTSModel.loadFromHub()
let audio = try await model.speak("Hello, world!")
try audio.write(to: "hello.wav")