Qwen3-TTS
Qwen3-TTS est un modèle de langage codec à 12 Hz avec un décodeur Mimi pour une synthèse texte-vers-parole de haute qualité. Le modèle est quantifié sur 4 bits et s'exécute plus vite que le temps réel sur Apple Silicon.
Pipeline
La synthèse vocale suit un pipeline en trois étapes :
- Talker — transformeur à 28 couches qui convertit le texte en tokens du premier codebook à 12,5 Hz
- Code Predictor — transformeur à 5 couches qui prédit les 15 codebooks restants à partir des états cachés du premier codebook
- Décodeur codec Mimi — convertit l'ensemble des 16 tokens de codebook en une forme d'onde audio à 24 kHz
Architecture
Talker
Le Talker est le modèle autorégressif principal qui génère les tokens codec à partir du texte d'entrée.
| Paramètre | Valeur |
|---|---|
| Couches | 28 |
| Dimension cachée | 1024 |
| Têtes de requête | 16 |
| Têtes clé/valeur | 8 (GQA) |
| MLP | SwiGLU |
| Encodage de position | RoPE |
Code Predictor
Un transformeur léger à 5 couches qui prend les états cachés du premier codebook et prédit les 15 codebooks restants en parallèle. Cela évite de faire tourner le Talker complet 16 fois par étape.
Décodeur codec Mimi
Le décodeur Mimi convertit les tokens codec quantifiés en audio :
- Décodage RVQ (16 codebooks)
- Pré-convolution (512 vers 1024 canaux)
- Pré-transformeur (goulot 1024 vers 512, 8 couches, SwiGLU + LayerScale)
- Sur-échantillonnage (×2, ×2)
- Décodeur SEANet (étapes de sur-échantillonnage ×8, ×5, ×4, ×3)
- Sortie de forme d'onde à 24 kHz
Variantes du modèle
| Modèle | Taille | HuggingFace |
|---|---|---|
| Qwen3-TTS-0.6B Base (4-bit) | 1,7 Go | aufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-4bit |
| Qwen3-TTS-0.6B Base (8-bit) | 2,4 Go | aufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-8bit |
| Qwen3-TTS-0.6B CustomVoice (4-bit) | 1,7 Go | aufklarer/Qwen3-TTS-12Hz-0.6B-CustomVoice-MLX-4bit |
| Qwen3-TTS-1.7B Base (4-bit) | 3,2 Go | aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-4bit |
| Qwen3-TTS-1.7B Base (8-bit) | 4,8 Go | aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-8bit |
| Qwen3-TTS CoreML (FP16) | 2,1 Go | aufklarer/Qwen3-TTS-CoreML |
Backend CoreML
Le backend CoreML exécute l'intégralité du pipeline Qwen3-TTS sur GPU via Core ML, ce qui permet un déploiement sur iOS et macOS sans dépendance à MLX. Le modèle est découpé en 6 sous-modèles spécialisés optimisés pour la pile de calcul d'Apple :
- TextProjector — projette les embeddings de tokens de texte dans l'espace caché partagé
- CodeEmbedder — embarque les tokens du premier codebook et les tokens de contrôle
- MultiCodeEmbedder — embarque les tokens des codebooks 1 à 15
- CodeDecoder — transformeur autorégressif à 28 couches avec cache KV sans état (256 positions maximum)
- MultiCodeDecoder — code predictor à 5 couches pour les codebooks 1 à 15
- SpeechDecoder — décodeur codec Mimi, convertit 16 tokens de codebook en audio à 24 kHz
# Synthèse CoreML
.build/release/audio speak "Hello, world!" --engine coreml -o hello.wav
# CoreML utilise temperature 0.8 par défaut (requis pour une sortie de qualité)
.build/release/audio speak "Long text here." --engine coreml --temperature 0.9 -o out.wav
Le CodeDecoder CoreML utilise un cache KV fixe de 256 positions. Les passages plus longs doivent être découpés en phrases individuelles. Les tokens de décodage sont automatiquement plafonnés pour tenir dans les emplacements de cache restants après le prefill.
Utilisation en CLI
Générez de la parole à partir de texte :
.build/release/audio speak "Hello, world!" --output hello.wav
Options
| Option | Description |
|---|---|
--engine | Moteur TTS : qwen3 (MLX, par défaut), coreml (CoreML/GPU) ou cosyvoice |
--output, -o | Chemin du fichier WAV de sortie |
--language | Langue (par défaut : english). Omettre pour utiliser le dialecte natif du locuteur. |
--model | Variante de modèle : base ou customVoice |
--speaker | Voix du locuteur (nécessite --model customVoice) |
--temperature | Température d'échantillonnage (par défaut : 0,3) |
--top-k | Paramètre d'échantillonnage top-k |
--max-tokens | Nombre maximal de tokens à générer (par défaut : 500) |
--stream | Active le streaming — émet des fragments audio pendant la génération |
--first-chunk-frames | Nombre de trames dans le premier fragment diffusé |
--chunk-frames | Nombre de trames par fragment diffusé suivant |
--batch-file | Chemin vers un fichier texte avec une phrase par ligne pour la synthèse en lot |
--batch-size | Nombre de phrases en parallèle en mode lot |
Exemples
# Synthèse basique
.build/release/audio speak "The quick brown fox." -o fox.wav
# Sortie en streaming
.build/release/audio speak "Long passage of text..." --stream -o stream.wav
# Synthèse en lot depuis un fichier
.build/release/audio speak --batch-file sentences.txt --batch-size 4 -o output_dir/
Streaming
L'option --stream active la sortie audio fragmentée pendant la génération. Au lieu d'attendre la fin complète de la phrase, l'audio est émis par fragments à mesure que les tokens sont produits. Utilisez --first-chunk-frames et --chunk-frames pour contrôler la taille de chaque fragment.
Mode lot
Pour synthétiser plusieurs énoncés, utilisez --batch-file avec un fichier texte contenant une ligne par énoncé. L'option --batch-size contrôle combien d'énoncés sont traités en parallèle.
Performance
Sur un M2 Max, Qwen3-TTS atteint un RTF (facteur temps réel) d'environ 0,55, ce qui signifie qu'il génère de la parole plus vite que le temps réel. Avec un préchauffage compile(), chaque étape prend environ 37 ms.
Le maximum par défaut est de 500 tokens, ce qui produit environ 40 secondes d'audio à 12,5 Hz. Des valeurs plus élevées risquent de dépasser le watchdog GPU Metal, ce qui peut provoquer un redémarrage système sur Apple Silicon puisque le GPU est partagé avec le compositeur.
Langues
Qwen3-TTS prend en charge la synthèse texte-vers-parole multilingue. Le modèle détecte automatiquement la langue d'entrée et génère la parole en conséquence.
API Swift
import Qwen3TTS
let model = try await Qwen3TTSModel.loadFromHub()
let audio = try await model.speak("Hello, world!")
try audio.write(to: "hello.wav")