Qwen3-TTS Rust Engine — высокопроизводительный движок синтеза речи (TTS) на Rust, совместимый с Qwen3-TTS и поддерживающий экспериментальные сменные backend-ы.
Создать production-ready решение без зависимостей от Python и Torch Runtime, ориентированное на низкую задержку (low-latency) и эффективный стриминг (streaming).
- Pure Rust: Никакого Python в runtime
- Производительность: оптимизация под CPU/Metal/CUDA
- Квантизация: поддержка GGUF Q8/Q4 и safetensors
- Streaming: генерация и отдача аудио чанками по 20-100 мс
- gRPC Server: production-ready сервер с health checks и метриками
- Modular Architecture: независимые crates для core, моделей, runtime и приложений
- Supertonic 3: опциональный CPU/ONNX backend для быстрого локального синтеза
- Kokoro-82M: опциональный CPU/ONNX backend с английским и экспериментальным русским режимами
- Silero V5 CIS Base: опциональный CPU/ONNX backend с 29 русскими голосами и аудио 48 кГц
- Поддерживаются
model.safetensors,model.gguf,model-q8_0.gguf,model-q4_0.gguf - Приоритет выбора:
model.gguf→model-q8_0.gguf→model-q4_0.gguf→model.safetensors - Для CustomVoice используйте директорию
models/qwen3-tts-0.6b-customvoice
Проект использует protobuf, поэтому для сборки должен быть установлен protoc.
Для владельцев Apple Silicon (включая M4) можно использовать feature-флаг metal для инференса на GPU (MPS).
См. BENCHMARK.md: на текущих реализациях Metal в бенчмарках уступает CPU, поэтому по умолчанию рекомендуется CPU.
# Сборка с поддержкой Metal
cargo build --release --features metal
# Синтез на GPU
cargo run -p tts-cli --release --features metal -- synth \
--input "Тест GPU ускорения" \
--output test_metal.wav \
--model-dir models/qwen3-tts-0.6b-customvoice \
--device metal# Сборка (CPU)
cargo build --release
# Синтез текста в WAV (автоматический выбор устройства)
cargo run -p tts-cli --release -- synth \
--input "Привет, мир!" \
--model-dir models/qwen3-tts-0.6b-customvoice \
-o output.wav
# Явное указание устройства
cargo run -p tts-cli --release --features metal -- synth \
--input "Текст" \
--model-dir models/qwen3-tts-0.6b-customvoice \
--output out.wav \
--device metal # варианты: auto, cpu, metal, cuda
# Streaming режим
cargo run -p tts-cli --release -- synth \
--input "Длинный текст..." \
--model-dir models/qwen3-tts-0.6b-customvoice \
-o output.wav \
--streaming
# Нормализация текста (dry run)
cargo run -p tts-cli --release -- normalize --input "100 рублей" --lang ruИнтеграция использует официальный ONNX-пакет и не требует Python или Torch в runtime. Скрипт фиксирует проверенный snapshot 3cadd1ee…; сначала скачайте assets (около 401 МБ):
./scripts/download_supertonic3.shЗатем соберите CLI с feature supertonic и синтезируйте русский текст:
cargo run -p tts-cli --release --features supertonic -- synth \
--engine supertonic3 \
--model-dir models/supertonic-3 \
--speaker F1 \
--lang ru \
--steps 8 \
--speed 1.05 \
--input "Привет! Это локальный синтез Supertonic 3." \
--output output-supertonic3.wavДоступны голоса M1–M5 и F1–F5. Текущий API проекта открывает теги ru, en и mixed (mixed использует нейтральный тег модели); сам официальный пакет заявляет 31 язык, но остальные теги пока не добавлены в tts-core::Lang. Для более быстрого сравнения можно задать --steps 5; baseline качества — 8. Feature использует ort 2.0.0-rc.12 и требует Rust 1.88 или новее. Официальный Rust/ONNX path сейчас работает на CPU. Длинный текст разбивается на фрагменты и склеивается, но это не настоящий streaming, поэтому --streaming для Supertonic 3 отклоняется явно.
Код upstream-примеров распространяется по MIT, а веса Supertonic 3 — по OpenRAIL-M. Перед продуктовым использованием проверьте условия лицензии модели и ограничения готовых голосов.
Скрипт скачивает и проверяет контрольными суммами INT8-модель Kokoro v1.0 и архив голосов (около 121 МБ):
./scripts/download_kokoro.shАнглийский синтез использует eSpeak-фонемизацию и один из 28 английских голосов:
cargo run -p tts-cli --release --features kokoro -- synth \
--engine kokoro \
--model-dir models/kokoro \
--speaker af_heart \
--lang en \
--speed 1.0 \
--input "Hello! This is Kokoro running locally in Rust." \
--output output-kokoro-en.wavРусский режим доступен тем же backend-ом:
cargo run -p tts-cli --release --features kokoro -- synth \
--engine kokoro \
--model-dir models/kokoro \
--speaker af_heart \
--lang ru \
--speed 1.0 \
--input "Привет! Это экспериментальный русский синтез Kokoro." \
--output output-kokoro-ru.wavВажно: оригинальная Kokoro v1.0 не обучалась на русском языке и не содержит русских голосов. Русский режим экспериментально передаёт русские IPA-фонемы eSpeak в исходную модель с английским voice embedding; разборчивость и акцент требуют ручной оценки. Для production-качества нужен совместимый русский checkpoint или отдельная русская модель. Feature kokoro встраивает eSpeak NG (GPL-3.0-or-later), поэтому перед распространением бинарника проверьте лицензионные обязательства.
Backend работает на CPU, выдаёт mono PCM с частотой 24 кГц, поддерживает --speed 0.5..2.0 и явно отклоняет --streaming, --steps, --seed и non-CPU устройства.
Silero добавлен как отдельный движок и не заменяет Qwen3-TTS, Supertonic 3 или Kokoro. Подготовьте проверенный ONNX-бандл:
./scripts/prepare_silero.shСкрипт использует uv, скачивает зафиксированный v5_cis_base_nostress.jit, проверяет SHA-256 и один раз экспортирует пять ONNX-графов в models/silero-v5-cis-base. Python и PyTorch нужны только для этой офлайн-конвертации; Rust runtime от них не зависит.
Синтез:
cargo run -p tts-cli --release --features silero -- synth \
--engine silero \
--model-dir models/silero-v5-cis-base \
--speaker ru_alexandr \
--lang ru \
--speed 1.0 \
--input "Привет! Это отдельная модель Silero в RustTTS." \
--output output-silero.wavДвижок работает детерминированно на CPU, выдаёт mono PCM 48 кГц, поддерживает 29 голосов ru_* из официальной CIS-модели и скорость 0.5..2.0. Длинный текст разбивается на фрагменты; настоящий streaming пока не поддерживается и отклоняется явно. Rust выполняет length regulation и iSTFT самостоятельно. Feature использует ort 2.0.0-rc.12 и требует Rust 1.88 или новее.
Чтобы собрать CLI сразу со всеми реализованными дополнительными backend-ами:
cargo build -p tts-cli --release --features all_enginesИсходная модель и LICENSE_CIS распространяются по MIT; полный текст лицензии сохраняется рядом с экспортированными assets.
Приложение на базе Tauri v2.
# Установка Tauri CLI (если еще нет)
cargo install tauri-cli --version "^2.0.0"
# Запуск в режиме разработки (из папки crates/tts-app)
cd crates/tts-app
cargo tauri dev
# Запуск с поддержкой Metal
cargo tauri dev --features metal# Запуск сервера
cargo run -p tts-server --release
# Health check
curl http://localhost:8080/health
# gRPC синтез (требует grpcurl)
grpcurl -plaintext -d '{"text": "Привет мир", "language": 1}' \
localhost:50051 tts.v1.TtsService/Synthesize┌─────────────────────────────────────────────────────────────────┐
│ tts-cli / tts-server │
├─────────────────────────────────────────────────────────────────┤
│ runtime │
│ ┌─────────────┐ ┌──────────────┐ ┌─────────────────────────┐ │
│ │ TtsPipeline │ │ StreamingSession │ │ BatchScheduler │ │
│ └─────────────┘ └──────────────┘ └─────────────────────────┘ │
├─────────────────────────────────────────────────────────────────┤
│ text-normalizer │ text-tokenizer │ acoustic-model │ codec │
│ ┌─────────────┐ │ ┌────────────┐ │ ┌─────────────┐ │ │
│ │ Normalizer │ │ │ Tokenizer │ │ │ Transformer │ │ │
│ │ (RU/EN) │ │ │ (HF/Mock) │ │ │ + KV Cache │ │ │
│ └─────────────┘ │ └────────────┘ │ └─────────────┘ │ │
├─────────────────────────────────────────────────────────────────┤
│ tts-core │
│ Types, Traits, Errors, Config │
└─────────────────────────────────────────────────────────────────┘
| Crate | Описание |
|---|---|
tts-core |
Базовые типы, трейты, ошибки |
text-normalizer |
Нормализация текста (числа, даты, валюты) |
text-tokenizer |
BPE/Unigram токенизация |
acoustic-model |
Transformer модель с KV cache |
audio-codec-12hz |
Нейронный декодер аудио |
runtime |
Pipeline, streaming, batching |
tts-cli |
Командная строка |
tts-server |
gRPC + HTTP сервер |
tts-app |
Desktop приложение (Tauri) |
tts-engine-silero |
CPU/ONNX backend Silero V5 CIS Base с 29 русскими голосами |
tts-engine-supertonic |
CPU/ONNX backend Supertonic 3 |
tts-engine-kokoro |
CPU/ONNX backend Kokoro-82M |
Сравнение с Python SDK (Apple Silicon, MPS vs Rust CPU/Metal):
| Метрика | Python SDK (MPS) | RustTTS (CPU, GGUF Q8) | RustTTS (Metal, GGUF Q8) |
|---|---|---|---|
| Загрузка модели | 7.7s | 1.92s | 2.20s |
| RTF (short) | 2.59x | 3.24x | 5.30x |
| RTF (medium) | 2.29x | 1.43x | 3.48x |
| RTF (long) | 1.95x | 1.37x | 3.29x |
| Размер | ~2GB (venv) | ~12MB | ~12MB |
| Cold start | ~7-10s | ~1.92s | ~2.20s |
RTF (Real-Time Factor) — отношение времени синтеза к длительности аудио. Меньше = лучше.
Python быстрее на GPU для коротких запросов, Rust выигрывает на CPU на medium/long.
Подробности: Benchmark
# Все тесты
cargo test --workspace
# Тесты конкретного crate
cargo test -p runtime
# С выводом
cargo test -- --nocapture
# Clippy
cargo clippy --workspace -- -D warnings- PRD (Требования) — описание продукта, KPI
- Архитектура — модули, потоки данных
- Roadmap — план развития
- План фаз — детальные задачи
- Qwen3-TTS (оригинал) — официальная модель от Alibaba
- Silero Models — официальный репозиторий Silero и CIS-лицензия
- Kokoro-82M — модель и официальный список языков/голосов
- kokoro-onnx — проверенные ONNX assets
- Candle — ML framework на Rust
- Tonic — gRPC для Rust
MIT OR Apache-2.0