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:

  1. Talker — transformer de 28 capas que convierte el texto de entrada en tokens del primer codebook a 12,5 Hz
  2. Code Predictor — transformer de 5 capas que predice los 15 codebooks restantes a partir de los estados ocultos del primer codebook
  3. 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ámetroValor
Capas28
Dimensión oculta1024
Cabezas de query16
Cabezas de key/value8 (GQA)
MLPSwiGLU
Codificación posicionalRoPE

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:

  1. Decodificación RVQ (16 codebooks)
  2. Pre-convolución (512 a 1024 canales)
  3. Pre-transformer (cuello de botella 1024 a 512, 8 capas, SwiGLU + LayerScale)
  4. Upsample (2x, 2x)
  5. Decodificador SEANet (etapas de upsample 8x, 5x, 4x, 3x)
  6. Salida de forma de onda a 24 kHz

Variantes del modelo

ModeloTamañoHuggingFace
Qwen3-TTS-0.6B Base (4-bit)1.7 GBaufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-4bit
Qwen3-TTS-0.6B Base (8-bit)2.4 GBaufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-8bit
Qwen3-TTS-0.6B CustomVoice (4-bit)1.7 GBaufklarer/Qwen3-TTS-12Hz-0.6B-CustomVoice-MLX-4bit
Qwen3-TTS-1.7B Base (4-bit)3.2 GBaufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-4bit
Qwen3-TTS-1.7B Base (8-bit)4.8 GBaufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-8bit
Qwen3-TTS CoreML (FP16)2.1 GBaufklarer/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:

  1. TextProjector — Proyecta los embeddings de tokens de texto al espacio oculto compartido
  2. CodeEmbedder — Embebe los tokens del primer codebook y los tokens de control
  3. MultiCodeEmbedder — Embebe los tokens de los codebooks 1–15
  4. CodeDecoder — Transformer autorregresivo de 28 capas con caché KV sin estado (máximo 256 posiciones)
  5. MultiCodeDecoder — Code predictor de 5 capas para los codebooks 1–15
  6. 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
Límite de caché KV de CoreML

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

FlagDescripción
--engineMotor TTS: qwen3 (MLX, por defecto), coreml (CoreML/GPU) o cosyvoice
--output, -oRuta del archivo WAV de salida
--languageIdioma (por defecto: english). Omítelo para usar el dialecto nativo del hablante.
--modelVariante de modelo: base o customVoice
--speakerVoz del hablante (requiere --model customVoice)
--temperatureTemperatura de muestreo (por defecto: 0.3)
--top-kParámetro de muestreo top-k
--max-tokensNúmero máximo de tokens a generar (por defecto: 500)
--streamHabilita el streaming — emite chunks de audio durante la generación
--first-chunk-framesNúmero de frames del primer chunk enviado por streaming
--chunk-framesNúmero de frames de cada chunk subsiguiente enviado por streaming
--batch-fileRuta a un archivo de texto con un enunciado por línea para síntesis por lotes
--batch-sizeNú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.

Límite de seguridad

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