Skip to content

askidmobile/RustTTS

Repository files navigation

Qwen3-TTS Rust Engine

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.ggufmodel-q8_0.ggufmodel-q4_0.ggufmodel.safetensors
  • Для CustomVoice используйте директорию models/qwen3-tts-0.6b-customvoice

Быстрый старт

Проект использует protobuf, поэтому для сборки должен быть установлен protoc.

Apple Silicon (Metal) ускорение

Для владельцев 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

CLI синтез

# Сборка (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

Supertonic 3 (экспериментальный CPU backend)

Интеграция использует официальный 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

Доступны голоса M1M5 и F1F5. Текущий 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. Перед продуктовым использованием проверьте условия лицензии модели и ограничения готовых голосов.

Kokoro-82M (CPU/ONNX backend)

Скрипт скачивает и проверяет контрольными суммами 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 V5 CIS Base (CPU/ONNX backend)

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.

Desktop App (GUI)

Приложение на базе 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

gRPC сервер

# Запуск сервера
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

Документация

Ссылки

  • 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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages