Qwen3-TTS
Qwen3-TTS e um modelo de linguagem codec de 12Hz com decodificador Mimi para sintese de texto para fala de alta qualidade. O modelo e quantizado em 4 bits e executa mais rapido que tempo real em Apple Silicon.
Pipeline
A sintese de fala segue um pipeline em tres etapas:
- Talker — transformer de 28 camadas que converte texto de entrada em tokens do primeiro codebook a 12.5 Hz
- Code Predictor — transformer de 5 camadas que preve os 15 codebooks restantes a partir dos hidden states do primeiro codebook
- Decodificador Mimi Codec — converte todos os 16 tokens de codebook em uma forma de onda de audio a 24 kHz
Arquitetura
Talker
O Talker e o modelo autoregressivo central que gera tokens de codec a partir da entrada de texto.
| Parametro | Valor |
|---|---|
| Camadas | 28 |
| Dimensao oculta | 1024 |
| Cabecas de query | 16 |
| Cabecas de key/value | 8 (GQA) |
| MLP | SwiGLU |
| Codificacao de posicao | RoPE |
Code Predictor
Um transformer leve de 5 camadas que recebe os hidden states do primeiro codebook e preve os 15 codebooks restantes em paralelo. Isso evita executar o Talker completo 16 vezes por passo.
Decodificador Mimi Codec
O decodificador Mimi converte tokens de codec quantizados de volta em audio:
- Decodificacao RVQ (16 codebooks)
- Pre-convolucao (512 para 1024 canais)
- Pre-transformer (gargalo 1024 para 512, 8 camadas, SwiGLU + LayerScale)
- Upsample (2x, 2x)
- Decodificador SEANet (estagios de upsample 8x, 5x, 4x, 3x)
- Saida de forma de onda a 24 kHz
Variantes do modelo
| Modelo | Tamanho | 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
O backend CoreML executa o pipeline Qwen3-TTS completo na GPU via Core ML, permitindo implantacao em iOS e macOS sem dependencias de MLX. O modelo e dividido em 6 submodelos especializados, otimizados para a pilha de computacao da Apple:
- TextProjector — projeta embeddings de tokens de texto para o espaco oculto compartilhado
- CodeEmbedder — incorpora tokens do primeiro codebook e tokens de controle
- MultiCodeEmbedder — incorpora tokens dos codebooks 1–15
- CodeDecoder — transformer autoregressivo de 28 camadas com cache KV sem estado (maximo de 256 posicoes)
- MultiCodeDecoder — code predictor de 5 camadas para os codebooks 1–15
- SpeechDecoder — decodificador Mimi codec, converte 16 tokens de codebook em audio a 24 kHz
# Sintese CoreML
.build/release/audio speak "Hello, world!" --engine coreml -o hello.wav
# CoreML usa temperatura 0.8 por padrao (necessario para saida de qualidade)
.build/release/audio speak "Long text here." --engine coreml --temperature 0.9 -o out.wav
O CodeDecoder CoreML usa um cache KV fixo de 256 posicoes. Passagens mais longas devem ser divididas em frases individuais. Os tokens de decodificacao sao automaticamente limitados para caber nos slots de cache restantes apos o prefill.
Uso do CLI
Gere fala a partir de texto:
.build/release/audio speak "Hello, world!" --output hello.wav
Opcoes
| Flag | Descricao |
|---|---|
--engine | Engine TTS: qwen3 (MLX, padrao), coreml (CoreML/GPU) ou cosyvoice |
--output, -o | Caminho do arquivo WAV de saida |
--language | Idioma (padrao: english). Omita para usar o dialeto nativo do locutor. |
--model | Variante do modelo: base ou customVoice |
--speaker | Voz do locutor (requer --model customVoice) |
--temperature | Temperatura de amostragem (padrao: 0.3) |
--top-k | Parametro de amostragem top-k |
--max-tokens | Numero maximo de tokens a gerar (padrao: 500) |
--stream | Habilita streaming — emite chunks de audio durante a geracao |
--first-chunk-frames | Numero de frames no primeiro chunk transmitido |
--chunk-frames | Numero de frames por chunk subsequente |
--batch-file | Caminho para um arquivo de texto com um enunciado por linha para sintese em lote |
--batch-size | Numero de enunciados paralelos no modo batch |
Exemplos
# Sintese basica
.build/release/audio speak "The quick brown fox." -o fox.wav
# Saida em streaming
.build/release/audio speak "Long passage of text..." --stream -o stream.wav
# Sintese em lote a partir de arquivo
.build/release/audio speak --batch-file sentences.txt --batch-size 4 -o output_dir/
Streaming
A flag --stream habilita saida de audio em chunks durante a geracao. Em vez de aguardar a conclusao do enunciado inteiro, o audio e emitido em chunks conforme os tokens sao produzidos. Use --first-chunk-frames e --chunk-frames para controlar o tamanho de cada chunk.
Modo batch
Para sintetizar varios enunciados, use --batch-file com um arquivo de texto contendo uma linha por enunciado. A flag --batch-size controla quantos enunciados sao processados em paralelo.
Desempenho
Em um M2 Max, o Qwen3-TTS alcanca um RTF (fator de tempo real) de aproximadamente 0.55, ou seja, gera fala mais rapido que tempo real. Com aquecimento via compile(), cada passo leva cerca de 37 ms.
O maximo padrao e de 500 tokens, o que produz aproximadamente 40 segundos de audio a 12.5 Hz. Definir valores mais altos arrisca exceder o watchdog da GPU Metal, o que pode causar uma reinicializacao do sistema em Apple Silicon, ja que a GPU e compartilhada com o compositor.
Idiomas
Qwen3-TTS suporta sintese de texto para fala multilingue. O modelo detecta automaticamente o idioma de entrada e gera fala adequadamente.
API Swift
import Qwen3TTS
let model = try await Qwen3TTSModel.loadFromHub()
let audio = try await model.speak("Hello, world!")
try audio.write(to: "hello.wav")