Qwen3-TTS
Qwen3-TTS es un modelo de lenguaje de códec de 12Hz con un decodificador Mimi para síntesis de texto a voz de alta calidad. El modelo está cuantizado a 4 bits y se ejecuta más rápido que tiempo real en Apple Silicon.
Pipeline
La síntesis de voz sigue un pipeline de tres etapas:
- Talker — transformer de 28 capas que convierte el texto de entrada en tokens del primer codebook a 12,5 Hz
- Code Predictor — transformer de 5 capas que predice los 15 codebooks restantes a partir de los estados ocultos del primer codebook
- Decodificador del códec Mimi — convierte los 16 tokens de codebook en una forma de onda de audio a 24 kHz
Arquitectura
Talker
El Talker es el modelo autorregresivo principal que genera tokens de códec a partir del texto de entrada.
| Parámetro | Valor |
|---|---|
| Capas | 28 |
| Dimensión oculta | 1024 |
| Cabezas de query | 16 |
| Cabezas de key/value | 8 (GQA) |
| MLP | SwiGLU |
| Codificación posicional | RoPE |
Code Predictor
Un transformer ligero de 5 capas que toma los estados ocultos del primer codebook y predice los 15 codebooks restantes en paralelo. Esto evita ejecutar el Talker completo 16 veces por paso.
Decodificador del códec Mimi
El decodificador Mimi convierte los tokens de códec cuantizados de nuevo en audio:
- Decodificación RVQ (16 codebooks)
- Pre-convolución (512 a 1024 canales)
- Pre-transformer (cuello de botella 1024 a 512, 8 capas, SwiGLU + LayerScale)
- Upsample (2x, 2x)
- Decodificador SEANet (etapas de upsample 8x, 5x, 4x, 3x)
- Salida de forma de onda a 24 kHz
Variantes del modelo
| Modelo | Tamaño | 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 |
Backend CoreML
El backend CoreML ejecuta todo el pipeline Qwen3-TTS en GPU mediante Core ML, permitiendo despliegue en iOS y macOS sin dependencias de MLX. El modelo se divide en 6 submodelos especializados optimizados para el stack de cómputo de Apple:
- TextProjector — Proyecta los embeddings de tokens de texto al espacio oculto compartido
- CodeEmbedder — Embebe los tokens del primer codebook y los tokens de control
- MultiCodeEmbedder — Embebe los tokens de los codebooks 1–15
- CodeDecoder — Transformer autorregresivo de 28 capas con caché KV sin estado (máximo 256 posiciones)
- MultiCodeDecoder — Code predictor de 5 capas para los codebooks 1–15
- SpeechDecoder — Decodificador del códec Mimi, convierte los 16 tokens de codebook a audio a 24 kHz
# Síntesis CoreML
.build/release/audio speak "Hello, world!" --engine coreml -o hello.wav
# CoreML usa temperatura 0.8 por defecto (necesaria para obtener calidad)
.build/release/audio speak "Long text here." --engine coreml --temperature 0.9 -o out.wav
El CodeDecoder de CoreML usa una caché KV fija de 256 posiciones. Los pasajes más largos deben dividirse en oraciones individuales. Los tokens de decodificación se limitan automáticamente para caber en los slots de caché restantes tras el prefill.
Uso de CLI
Genera voz a partir de texto:
.build/release/audio speak "Hello, world!" --output hello.wav
Opciones
| Flag | Descripción |
|---|---|
--engine | Motor TTS: qwen3 (MLX, por defecto), coreml (CoreML/GPU) o cosyvoice |
--output, -o | Ruta del archivo WAV de salida |
--language | Idioma (por defecto: english). Omítelo para usar el dialecto nativo del hablante. |
--model | Variante de modelo: base o customVoice |
--speaker | Voz del hablante (requiere --model customVoice) |
--temperature | Temperatura de muestreo (por defecto: 0.3) |
--top-k | Parámetro de muestreo top-k |
--max-tokens | Número máximo de tokens a generar (por defecto: 500) |
--stream | Habilita el streaming — emite chunks de audio durante la generación |
--first-chunk-frames | Número de frames del primer chunk enviado por streaming |
--chunk-frames | Número de frames de cada chunk subsiguiente enviado por streaming |
--batch-file | Ruta a un archivo de texto con un enunciado por línea para síntesis por lotes |
--batch-size | Número de enunciados en paralelo en modo batch |
Ejemplos
# Síntesis básica
.build/release/audio speak "The quick brown fox." -o fox.wav
# Salida en streaming
.build/release/audio speak "Long passage of text..." --stream -o stream.wav
# Síntesis por lotes desde archivo
.build/release/audio speak --batch-file sentences.txt --batch-size 4 -o output_dir/
Streaming
El flag --stream habilita la salida de audio en chunks durante la generación. En lugar de esperar a que se complete el enunciado entero, el audio se emite en chunks a medida que se producen los tokens. Usa --first-chunk-frames y --chunk-frames para controlar el tamaño de cada chunk.
Modo batch
Para sintetizar múltiples enunciados, usa --batch-file con un archivo de texto que contenga una línea por enunciado. El flag --batch-size controla cuántos enunciados se procesan en paralelo.
Rendimiento
En un M2 Max, Qwen3-TTS alcanza un RTF (factor tiempo real) de aproximadamente 0.55, lo que significa que genera voz más rápido que tiempo real. Con el warmup de compile(), cada paso tarda unos 37 ms.
El máximo por defecto es 500 tokens, lo que produce aproximadamente 40 segundos de audio a 12,5 Hz. Establecer valores más altos arriesga superar el timeout del watchdog de la GPU Metal, lo que puede causar un reinicio del sistema en Apple Silicon dado que la GPU se comparte con el compositor.
Idiomas
Qwen3-TTS soporta síntesis de texto a voz multilingüe. El modelo detecta automáticamente el idioma de entrada y genera voz en consecuencia.
API Swift
import Qwen3TTS
let model = try await Qwen3TTSModel.loadFromHub()
let audio = try await model.speak("Hello, world!")
try audio.write(to: "hello.wav")