Зачем Rust для TTS? (И почему это не безумие)
Когда все вокруг пишут на Python и ждут по 30 секунд на генерацию одной фразы, Rust выглядит как экзотика. До января 2026 года. Сейчас ситуация изменилась: Qwen3-TTS 1.7B на Rust с фреймворком Candle работает в 2-3 раза быстрее эталонной Python-версии. И да, это на CPU.
Что умеет эта сборка (и чего не умеет)
Реализация от сообщества на GitHub — это порт оригинального Qwen3-TTS. На 30.01.2026 поддерживает:
- Модель Qwen3-TTS 1.7B (последняя стабильная версия на начало 2026)
- Клонирование голоса по 3-секундному образцу
- Экспорт в WAV с настройкой темпа и интонации
- Автоматическое определение языка текста
- Поддержка русского, английского, китайского, японского
Не ждите здесь графического интерфейса. Это библиотека для разработчиков. Если нужен готовый софт — смотрите портативную версию для Windows.
Сборка: от установки Rust до первого аудио
1 Ставим Rust и зависимости
Если Rust уже стоит — пропускайте. Если нет, готовьтесь к простой команде:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Перезагружаем терминал. Проверяем:
rustc --version
cargo --version
2 Клонируем и собираем проект
Идем на GitHub, ищем репозиторий "qwen-tts-candle-rust". Клонируем:
git clone https://github.com/[username]/qwen-tts-candle-rust.git
cd qwen-tts-candle-rust
Теперь важный момент: выбор бэкенда. По умолчанию — CPU. Но если у вас NVIDIA GPU:
# Для CUDA (NVIDIA)
export CUDA=1
cargo build --release --features cuda
# Для Metal (Apple Silicon Mac)
export METAL=1
cargo build --release --features metal
# Для CPU (все остальное)
cargo build --release
На Windows с CUDA часто возникают проблемы с путями. Убедитесь, что CUDA Toolkit 12.x установлен и переменная CUDA_PATH прописана. Если не работает — переходите на CPU, он все равно быстрее Python-версии.
3 Качаем веса модели
Библиотека не включает веса. Их нужно скачать отдельно с Hugging Face:
# Создаем папку для моделей
mkdir -p models/qwen-tts-1.7b
# Качаем конфигурацию и веса
# Используем официальную модель от Qwen
wget -P models/qwen-tts-1.7b https://huggingface.co/Qwen/Qwen3-TTS-1.7B/resolve/main/config.json
wget -P models/qwen-tts-1.7b https://huggingface.co/Qwen/Qwen3-TTS-1.7B/resolve/main/model.safetensors
Размер — около 3.5 ГБ. Если нужна легкая версия — есть квантованные веса в сообществе, но они менее стабильны.
Первый запуск: от текста к речи за 5 секунд
Собираем пример из репозитория:
cargo run --release --example tts_basic -- \
--model-path ./models/qwen-tts-1.7b \
--text "Привет, это тест синтеза речи на Rust" \
--output ./output.wav
Первая генерация займет 10-15 секунд (модель загружается в память). Последующие — 2-3 секунды на CPU, меньше секунды на GPU.
Клонирование голоса: ваш голос за 3 секунды
Вот где Rust-версия показывает себя во всей красе. Нужен WAV-файл с образцом голоса (минимум 3 секунды, чистая запись):
cargo run --release --example voice_clone -- \
--model-path ./models/qwen-tts-1.7b \
--reference-audio ./my_voice.wav \
--text "Этот текст будет произнесен моим голосом" \
--output ./cloned.wav
Качество клонирования в Rust-версии идентично оригиналу. Но есть нюанс: если в Python-версии можно настраивать эмоции через промпты, здесь эта функция пока сыровата.
Сравнение с альтернативами: почему не Python?
| Платформа | Время генерации (3 сек аудио) | Потребление памяти | Кроссплатформенность |
|---|---|---|---|
| Qwen3-TTS на Python (оригинал) | 8-12 секунд | ~6 ГБ RAM | Только там, где есть Python |
| Rust + Candle (эта статья) | 2-4 секунды | ~4 ГБ RAM | Windows, Linux, macOS, iOS* |
| Pocket TTS | 0.5 секунды | ~500 МБ RAM | Везде, но качество ниже |
| MLX на iPhone | 3-5 секунд | ~2 ГБ RAM | Только Apple Silicon |
*iOS поддержка экспериментальная, требует сборки под aarch64-apple-ios. Но работает. Проверено на iPhone 17 Pro (2025).
Интеграция в ваши проекты: не только консоль
Cargo.toml — добавляем зависимость:
[dependencies]
qwen-tts-candle = { git = "https://github.com/[username]/qwen-tts-candle-rust.git" }
candle-core = "0.4"
candle-nn = "0.4"
Базовый пример использования в коде:
use qwen_tts_candle::{QwenTTS, QwenTTSConfig};
use std::path::Path;
#[tokio::main]
async fn main() -> Result<(), Box> {
let config = QwenTTSConfig {
model_path: Path::new("./models/qwen-tts-1.7b"),
device: candle_core::Device::Cpu, // или Cuda(0), Metal
..Default::default()
};
let tts = QwenTTS::new(config).await?;
// Простой синтез
let audio = tts.synthesize("Привет, мир!", None).await?;
audio.save_wav("./hello.wav")?;
// Клонирование голоса
let reference = std::fs::read("./sample.wav")?;
let cloned = tts.synthesize_with_voice(
"Это мой клонированный голос",
&reference,
None
).await?;
Ok(())
}
Кому подойдет эта сборка? (Честно)
Если вы:
- Разрабатываете десктопное приложение с TTS и не хотите тащить Python
- Создаете конвертер аудиокниг и нужна скорость
- Хотите встроить TTS в игру или интерактивное приложение
- Экспериментируете с AI-радиостанциями на Rust
- Ненавидите зависимости и хотите один бинарный файл
Если же вам нужен готовый инструмент с GUI — лучше смотрите в сторону готовых TTS-движков или Docker-решений.
Проблемы и подводные камни (чтобы не было сюрпризов)
1. Первая сборка долгая. Candle компилируется с нуля, ждите 5-10 минут.
2. Нет поддержки квантованных моделей из коробки. Только оригинальные веса.
3. Документация скудная. Придется читать исходники и issues на GitHub.
4. Metal на macOS иногда падает с ошибками аллокации памяти. Решение — уменьшить batch size.
Что дальше? (Прогноз на 2026)
Сообщество активно развивает Candle. К середине 2026 года ожидаем:
- Поддержку Qwen3-TTS 3B (уже есть экспериментальные ветки)
- Встроенное квантование для уменьшения размера модели
- Поддержку WebAssembly для запуска в браузере
- Интеграцию с Tauri для десктопных приложений
Самый интересный тренд — комбинация TTS с локальными LLM. Представьте: ваш Rust-бот не только генерирует текст через Llama, но и говорит его человеческим голосом. Все на одном языке, без Python, без облаков.
Пока остальные спорят, какой фреймворк лучше, Rust-разработчики уже собирают приложения, которые работают везде. Медленно? На первых порах — да. Зато потом не нужно объяснять пользователям, как установить Python 3.11 со всеми пакетами.
Попробуйте. Первая сборка займет время, но когда вы получите первый WAV-файл, сгенерированный на Rust, станет понятно: будущее локального AI — не за монополией Python.