Qwen3-TTS

Qwen3-TTS — это кодек-языковая модель 12 Гц с декодером Mimi для высококачественного синтеза речи. Модель квантизована в 4 бита и работает быстрее реального времени на Apple Silicon.

Пайплайн

Синтез речи выполняется в три этапа:

  1. Talker — 28-слойный трансформер, преобразующий входной текст в токены первой кодовой книги с частотой 12.5 Гц
  2. Code Predictor — 5-слойный трансформер, предсказывающий оставшиеся 15 кодовых книг по скрытым состояниям первой кодовой книги
  3. Mimi Codec Decoder — преобразует токены всех 16 кодовых книг в звуковой сигнал 24 кГц

Архитектура

Talker

Talker — это основная авторегрессивная модель, которая генерирует кодек-токены из входного текста.

ПараметрЗначение
Слои28
Скрытая размерность1024
Query-головы16
Key/Value-головы8 (GQA)
MLPSwiGLU
Кодирование позицийRoPE

Code Predictor

Лёгкий 5-слойный трансформер, который берёт скрытые состояния первой кодовой книги и параллельно предсказывает оставшиеся 15 кодовых книг. Это позволяет не запускать полный Talker по 16 раз за шаг.

Mimi Codec Decoder

Декодер Mimi превращает квантизованные кодек-токены обратно в аудио:

  1. RVQ-декодирование (16 кодовых книг)
  2. Пред-свёртка (с 512 до 1024 каналов)
  3. Пред-трансформер (bottleneck с 1024 до 512, 8 слоёв, SwiGLU + LayerScale)
  4. Апсемпл (2×, 2×)
  5. SEANet-декодер (стадии апсемпла 8×, 5×, 4×, 3×)
  6. Выход — сигнал 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:

  1. TextProjector — проецирует эмбеддинги текстовых токенов в общее скрытое пространство
  2. CodeEmbedder — эмбеддит токены первой кодовой книги и управляющие токены
  3. MultiCodeEmbedder — эмбеддит токены кодовых книг 1–15
  4. CodeDecoder — 28-слойный авторегрессивный трансформер с stateless KV-кэшем (максимум 256 позиций)
  5. MultiCodeDecoder — 5-слойный code predictor для кодовых книг 1–15
  6. 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
Лимит KV-кэша в CoreML

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