Qwen3-TTS
Qwen3-TTS — это кодек-языковая модель 12 Гц с декодером Mimi для высококачественного синтеза речи. Модель квантизована в 4 бита и работает быстрее реального времени на Apple Silicon.
Пайплайн
Синтез речи выполняется в три этапа:
- Talker — 28-слойный трансформер, преобразующий входной текст в токены первой кодовой книги с частотой 12.5 Гц
- Code Predictor — 5-слойный трансформер, предсказывающий оставшиеся 15 кодовых книг по скрытым состояниям первой кодовой книги
- Mimi Codec Decoder — преобразует токены всех 16 кодовых книг в звуковой сигнал 24 кГц
Архитектура
Talker
Talker — это основная авторегрессивная модель, которая генерирует кодек-токены из входного текста.
| Параметр | Значение |
|---|---|
| Слои | 28 |
| Скрытая размерность | 1024 |
| Query-головы | 16 |
| Key/Value-головы | 8 (GQA) |
| MLP | SwiGLU |
| Кодирование позиций | RoPE |
Code Predictor
Лёгкий 5-слойный трансформер, который берёт скрытые состояния первой кодовой книги и параллельно предсказывает оставшиеся 15 кодовых книг. Это позволяет не запускать полный Talker по 16 раз за шаг.
Mimi Codec Decoder
Декодер Mimi превращает квантизованные кодек-токены обратно в аудио:
- RVQ-декодирование (16 кодовых книг)
- Пред-свёртка (с 512 до 1024 каналов)
- Пред-трансформер (bottleneck с 1024 до 512, 8 слоёв, SwiGLU + LayerScale)
- Апсемпл (2×, 2×)
- SEANet-декодер (стадии апсемпла 8×, 5×, 4×, 3×)
- Выход — сигнал 24 кГц
Варианты модели
| Модель | Размер | HuggingFace |
|---|---|---|
| Qwen3-TTS-0.6B Base (4-bit) | 1.7 ГБ | aufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-4bit |
| Qwen3-TTS-0.6B Base (8-bit) | 2.4 ГБ | aufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-8bit |
| Qwen3-TTS-0.6B CustomVoice (4-bit) | 1.7 ГБ | aufklarer/Qwen3-TTS-12Hz-0.6B-CustomVoice-MLX-4bit |
| Qwen3-TTS-1.7B Base (4-bit) | 3.2 ГБ | aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-4bit |
| Qwen3-TTS-1.7B Base (8-bit) | 4.8 ГБ | aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-8bit |
| Qwen3-TTS CoreML (FP16) | 2.1 ГБ | aufklarer/Qwen3-TTS-CoreML |
Бэкенд CoreML
Бэкенд CoreML запускает полный пайплайн Qwen3-TTS на GPU через Core ML, что позволяет развёртывать его на iOS и macOS без зависимости от MLX. Модель разделена на 6 специализированных подмоделей, оптимизированных под вычислительный стек Apple:
- TextProjector — проецирует эмбеддинги текстовых токенов в общее скрытое пространство
- CodeEmbedder — эмбеддит токены первой кодовой книги и управляющие токены
- MultiCodeEmbedder — эмбеддит токены кодовых книг 1–15
- CodeDecoder — 28-слойный авторегрессивный трансформер с stateless KV-кэшем (максимум 256 позиций)
- MultiCodeDecoder — 5-слойный code predictor для кодовых книг 1–15
- SpeechDecoder — декодер кодека Mimi, преобразует токены 16 кодовых книг в аудио 24 кГц
# Синтез через CoreML
.build/release/audio speak "Hello, world!" --engine coreml -o hello.wav
# CoreML по умолчанию использует температуру 0.8 (нужна для качества вывода)
.build/release/audio speak "Long text here." --engine coreml --temperature 0.9 -o out.wav
CodeDecoder на CoreML использует фиксированный KV-кэш на 256 позиций. Длинные фрагменты следует разбивать на отдельные предложения. Количество декодируемых токенов автоматически ограничивается так, чтобы помещаться в оставшиеся слоты кэша после prefill.
Использование CLI
Сгенерировать речь из текста:
.build/release/audio speak "Hello, world!" --output hello.wav
Опции
| Флаг | Описание |
|---|---|
--engine | Движок TTS: qwen3 (MLX, по умолчанию), coreml (CoreML/GPU) или cosyvoice |
--output, -o | Путь выходного WAV-файла |
--language | Язык (по умолчанию: english). Опустите, чтобы использовать родной диалект диктора. |
--model | Вариант модели: base или customVoice |
--speaker | Голос диктора (требует --model customVoice) |
--temperature | Температура сэмплирования (по умолчанию: 0.3) |
--top-k | Параметр top-k сэмплирования |
--max-tokens | Максимальное число генерируемых токенов (по умолчанию: 500) |
--stream | Включает потоковый режим — выдаёт фрагменты аудио по ходу генерации |
--first-chunk-frames | Число кадров в первом потоковом фрагменте |
--chunk-frames | Число кадров в каждом последующем фрагменте |
--batch-file | Путь к текстовому файлу с одним предложением на строке для пакетного синтеза |
--batch-size | Число параллельных предложений в пакетном режиме |
Примеры
# Базовый синтез
.build/release/audio speak "The quick brown fox." -o fox.wav
# Потоковый вывод
.build/release/audio speak "Long passage of text..." --stream -o stream.wav
# Пакетный синтез из файла
.build/release/audio speak --batch-file sentences.txt --batch-size 4 -o output_dir/
Потоковый режим
Флаг --stream включает покадровый вывод аудио во время генерации. Вместо ожидания завершения всего предложения аудио выдаётся фрагментами по мере появления новых токенов. Параметры --first-chunk-frames и --chunk-frames управляют размером каждого фрагмента.
Пакетный режим
Для синтеза нескольких предложений используйте --batch-file с текстовым файлом, где на каждой строке одно предложение. Флаг --batch-size задаёт, сколько предложений обрабатывается параллельно.
Производительность
На M2 Max Qwen3-TTS показывает RTF (отношение к реальному времени) примерно 0.55, то есть генерирует речь быстрее реального времени. С прогревом через compile() один шаг занимает около 37 мс.
По умолчанию максимум — 500 токенов, что даёт около 40 секунд аудио при 12.5 Гц. Увеличение этого значения может привести к превышению watchdog-таймаута Metal GPU, а на Apple Silicon это способно вызвать перезагрузку системы, поскольку GPU разделён с композитором.
Языки
Qwen3-TTS поддерживает многоязычный синтез речи. Модель автоматически определяет язык входного текста и генерирует соответствующую речь.
Swift API
import Qwen3TTS
let model = try await Qwen3TTSModel.loadFromHub()
let audio = try await model.speak("Hello, world!")
try audio.write(to: "hello.wav")