Desktop-приложение для быстрого прослушивания текстов и статей на русском языке — локально, без GPU и облака. Для случаев, когда в первую очередь важно быстро понять содержимое, а не красота сгенерированной речи — например, технические статьи.
Задача — временно и частично снять нагрузку с глаз. За рабочий день и после него они и так перегружены чтением: рабочие тексты, соцсети, новости. RuVox позволяет не читать большие тексты и статьи, а прослушать их — быстро, целиком, локально; а если что-то расслышать не удалось, оригинал перед глазами, текущее слово подсвечено.
Современные тяжёлые TTS, как правило, сами грамотно читают цифры, ссылки и английский текст, но требуют мощный GPU и синтезируют заметно дольше. Быстрые лёгкие движки (Silero, Piper) наоборот: моментальны и нетребовательны к ресурсам, но прочитать getUserData() или /api/v2/users не умеют. Когда лёгкий движок встречает такой фрагмент, варианты очевидны:
- просто пропустить его — но вместе с ним может уйти важная информация из текста;
- попытаться имитировать произношение — озвучить фрагмент приближённо, как он прозвучал бы при грамотном чтении.
RuVox идёт по второму пути: нормализация — компенсирующая прослойка, которая переписывает английские термины, аббревиатуры, код, числа и URL в «звучащую» русскую форму, чтобы лёгкий движок прочитал текст целиком. getUserData() → «гет юзер дата», API → «эй пи ай», /api/v2/users — как путь, а не по буквам. Произношение при этом остаётся приближённым, и это осознанный размен: вместо красоты речи и мощного железа RuVox даёт скорость понимания и легковесность по ресурсам.
Озвучивает один из четырёх TTS-движков: TeraTTSv2 (in-process на ONNX Runtime, крейт teratts, 44.1 кГц; движок по умолчанию — читает русскую прозу, английские термины, идентификаторы и блоки кода выбранным голосом, а URL и почту — по-русски; бандл ~410 МБ скачивается по запросу), Silero TTS v5 in-process на ONNX Runtime (крейт silero-native; быстрее и легче — бандл ~230 МБ, английский читает через нормализацию), Piper (in-process, через piper-rs, запасной вариант без внешних зависимостей и без скачивания моделей) или, опционально, Silero TTS out-of-process через Python-сайдкар ttsd (оставлен как fallback).
Синтез полностью локальный — никаких облачных TTS, текст никуда не отправляется. Сеть нужна только для разового скачивания голосовых моделей по запросу, проверки обновлений приложения и импорта текста по ссылке.
Пошаговое руководство по интерфейсу, настройкам и горячим клавишам: docs/user-guide.md.
Примеры озвучки всех движков на одном тексте — на странице проекта.
Готовые сборки публикуются в Releases:
| Платформа | Пакет | Примечания |
|---|---|---|
| Windows 10 22H2+ / 11 (x86_64) | *-setup.exe |
NSIS-установщик; WebView2, mpv и ONNX Runtime встроены; автообновление из приложения |
| Debian / Ubuntu | *.deb |
sudo dpkg -i ./ruvox_*.deb; системный mpv ставится автоматически как зависимость; обновляется вместе с системой |
| Любой дистрибутив Linux | *.AppImage |
запускается напрямую (нужен FUSE; там, где его нет, — --appimage-extract-and-run); mpv встроен; автообновление из приложения |
Модель движка по умолчанию скачивается один раз по запросу: при первом запуске RuVox предлагает бандл TeraTTSv2 (~410 МБ), а отказ не сохраняется — сеанс проходит на Piper, и предложение возвращается при следующем запуске. Бандл Silero Native (~230 МБ) скачивается из «Настроек» → «Движок и голос» → «Модели и голоса» → «Открыть».
| Слой | Технология |
|---|---|
| Shell | Tauri 2 (Rust + нативный webview) |
| Frontend | React 18 + TypeScript 5 + Mantine 8 |
| Backend | Rust (pipeline нормализации, storage, TTS-менеджер) |
| TTS | TeraTTSv2 (in-process, ONNX Runtime, крейт teratts, 44.1 кГц, по умолчанию); Silero v5 нативный (in-process, ONNX Runtime, silero-native, быстрее и легче); Piper (in-process, piper-rs + onnxruntime, fallback без скачивания моделей); Silero через ttsd (опциональный Python 3.12 subprocess, fallback) |
| Аудио | tauri-plugin-mpv (libmpv с scaletempo2) |
- TeraTTSv2 по умолчанию — естественнее читает русскую прозу, английские термины и код; бандл ~410 МБ скачивается один раз и предлагается при первом запуске. Быстрее и легче — Silero Native (~230 МБ, из «Настроек»), совсем без скачивания — Piper.
- Сверка с текстом — синхронная подсветка читаемого слова: непонятный на слух фрагмент можно тут же уточнить по оригиналу.
- Нормализация — английский (camelCase/snake_case), аббревиатуры, числа, даты, URL, email, код.
- Чтение английского текста — выбор в настройках: «Авто» (как умеет движок), «Нативно» (английским голосом движка) или «По-русски» (транслитерация); если движок не умеет английский, «Нативно» читается по-русски, а выбор сохраняется.
- Словарь произношения — замена для слов, которые движок читает неверно:
IPv6→ «айпи ви шесть». Слово-источник — одно слово латиницей или по-русски (замок), ищется по точной форме; для русской записи можно перечислить формы (замка,замке), которые произносятся так же. Дефис допускается внутри слова (UTF-8,e-mail), и такая запись ищет слово целиком — важнее записей для его частей. Словарь состоит из общего и движковых наборов: общий действует везде, движковый — только для выбранного движка и важнее общего при совпадении слова. Задаётся в настройках, добавляется кнопкой «В словарь» из диалога предпросмотра; регистр не важен, работает в прозе, коде и ссылках, а также в блоках кода, когда их проговаривает сам пайплайн, хранится в правимом руками TOML-файле. Ударение задаётся знаком+перед гласной:Москв+а; движки без поддержки ударения метку отбрасывают. - Markdown + HTML — рендер и озвучивание с сохранением смысла; формат источника определяется автоматически.
- Импорт из файлов и ссылок — «Файл…», «Файл с кодировкой…», «По ссылке…», а также drag-n-drop
.txt/.md/.htmlи ссылок в окно; кодировка (UTF-8, CP1251, KOI8-R и другие) определяется автоматически, с ручным переопределением. - Mermaid-диаграммы — визуализация в UI; для TTS заменяются маркером «Тут мермэйд диаграмма».
- Preview-диалог — предпросмотр нормализованного текста до синтеза.
- Экспорт аудио — «Сохранить аудио как…» в контекстном меню очереди: WAV или Ogg Opus.
- Параметры записи — в контекстном меню очереди и по двойному клику: каким движком, голосом и настройками создана запись.
- Скорость воспроизведения — до 3×, сохраняется между запусками.
- Системный трей — close-to-tray, фоновый режим.
- Уведомления — о готовности записи и об ошибках (отключаются в настройках).
- Локализация — интерфейс на русском и английском, переключается в настройках.
- Автообновления — Windows-установщик и AppImage сами проверяют и ставят обновления с проверкой подписи.
Быстрые лёгкие движки читают только русский текст: английские слова, код и спецсимволы в чистом виде синтезатор произнести не может, а пропускать фрагменты — значит терять смысл. Поэтому перед озвучкой RuVox переписывает текст так, чтобы он звучал естественно:
- идентификаторы кода:
getUserData→ «гет юзер дата»,user_id→ «юзер ай ди»; - аббревиатуры:
HTTP→ «эйч ти ти пи»,API→ «эй пи ай»; - числа, версии и даты:
v1.2.3→ «один точка два точка три»,2024-05-12→ «двенадцатое мая две тысячи двадцать четвёртого года»; - URL и email:
user@example.com→ «юзер собака экзампл точка ком»; - операторы и символы:
!=→ «не равно»,===→ «строго равно»,->→ «стрелка»,α→ «альфа»; - блоки кода: по умолчанию заменяются фразой вида «далее следует пример кода на пайтон»; в режиме «Читать полностью» TeraTTSv2 и Piper читают блок сами, а Silero проговаривает его целиком с расшифровкой идентификаторов и операторов; mermaid-диаграмма всегда заменяется фразой «Тут мермэйд диаграмма».
Увидеть результат до синтеза можно в диалоге предпросмотра (открывается при добавлении текста): слева — оригинал, справа — то, что будет прочитано вслух.
- Формат источника в диалоге предпросмотра: «Авто», «Обычный текст», «Markdown» или «HTML». По умолчанию включён «Авто» — RuVox сам распознаёт формат: из HTML извлекается читаемый текст, а разметка Markdown (заголовки, списки, блоки кода) обрабатывается по смыслу, а не зачитывается посимвольно. HTML-разметка распознаётся только когда текст начинается и заканчивается тегом — поэтому вставленный CHANGELOG и техническая проза с угловыми скобками (
Vec<T>,<type>(<module>): <desc>) остаются обычным текстом или Markdown. Если автоопределение ошиблось, формат можно выбрать вручную. - Озвучка блоков кода в настройках: «Кратко» (по умолчанию) — блок кода заменяется фразой «далее следует пример кода на <язык>»; «Читать полностью» — блок отдаётся движку: TeraTTSv2 и Piper читают код сами, Silero проговаривает его целиком с нормализацией идентификаторов, операторов и скобок. Настройка применяется сразу, без перезапуска приложения.
- ОС: Windows 10 22H2+ / 11 (x86_64) или Linux (X11 или Wayland; Ubuntu 24.04+, Debian 13+, Fedora 40+, Arch).
- Nix (для сборки из исходников на Linux): рекомендуется — всё окружение (Rust, Node, Python, Tauri-зависимости) собирается из
flake.nix(dev-shell живёт вnix/devshell.nix). - Без Nix (сборка из исходников на Linux): дистрибутив с
webkit2gtk-4.1(Ubuntu 24.04+, Debian 13+, Fedora 40+, Arch). Подробная пошаговая инструкция по сборке: docs/install.md (на английском). Python 3.12 +uvнужны только для Python-движка Silero (сайдкарttsd) — TeraTTSv2 (Rust/ONNX), Piper и нативный движок Silero в них не нуждаются.
# Интерактивная оболочка
nix develop
pnpm install
pnpm tauri dev
# Или одну команду без входа в оболочку
nix develop -c pnpm install
nix develop -c pnpm tauri devВсе команды в документации подразумевают запуск внутри nix develop (либо через nix develop -c ...).
# По умолчанию (slim) — TeraTTSv2 + Piper + нативный Silero, без Python/torch в closure.
nix build .#ruvox
./result/bin/ruvox
# Опционально (full) — дополнительно встраивает сайдкар ttsd, чтобы был
# доступен Python-движок Silero.
nix build .#ruvox-with-silero
./result/bin/ruvoxОба варианта собирают release-бинарь Tauri и оборачивают его через wrapProgram (runtime LD_LIBRARY_PATH + GIO_EXTRA_MODULES); mpv в обоих случаях попадает в PATH. Вариант .#ruvox-with-silero дополнительно кладёт в PATH бинарь ttsd (Silero Python subprocess). Slim-вариант его не содержит — на runtime в «Настройках» опция Python-движка Silero окрашена серым. TeraTTSv2 и нативный движок Silero работают в обоих вариантах: их ONNX-бандлы — ~410 МБ для TeraTTSv2 (движок по умолчанию, предлагается при первом запуске) и ~230 МБ для Silero Native — скачиваются по запросу из «Настроек» → «Движок и голос» → «Модели и голоса».
Windows-установщик и Linux-пакеты (.deb, .AppImage) собираются в CI при пуше тега v* (см. .github/workflows/release.yml).
Первый запуск
nix build: derivationfrontendиспользуетpnpm.fetchDepsсlib.fakeHash— Nix упадёт с hash mismatch, напишет реальный hash; его нужно подставить вflake.nixи повторить build. Это стандартная процедура pnpm2nix.
Все команды ниже выполняются внутри nix develop (или через nix develop -c ...).
just lint # все статические проверки (fmt, clippy, cargo-deny, eslint, knip, tsc, ruff)
just test # все тесты (Rust + TypeScript + Python)
pnpm typecheck # TypeScript
pnpm test:unit # TS unit-тесты
cargo test --manifest-path src-tauri/Cargo.toml # Rust (включая golden-тесты pipeline)
cargo test --manifest-path src-tauri/Cargo.toml --test golden # только golden-тесты
cargo test --manifest-path silero-native/Cargo.toml # нативный движок Silero (bundle-gated тесты скипаются без SILERO_NATIVE_BUNDLE)
cargo test --manifest-path teratts/Cargo.toml # движок TeraTTSv2 (bundle-gated тесты скипаются без TERATTS_BUNDLE)
cd ttsd && uv run python -m pytest # Python subprocess| Файл | Описание |
|---|---|
| docs/user-guide.md | Руководство пользователя: первый запуск, очередь, воспроизведение, настройки, словарь, трей, горячие клавиши |
| docs/index.md | Указатель документации: архитектура, спеки поведения, процесс разработки |
| AGENTS.md | Правила разработки, структура проекта, соглашения |
| docs/install.md | Сборка из исходников на Linux без Nix (Ubuntu 24.04+, на английском) |
| docs/development.md | Dev-окружение, команды, отладка |
| docs/contributing.md | Контрибуция: словари, правила коммитов и стиля |
| silero-native/ | Крейт нативного движка Silero v5 (ONNX Runtime): архитектура, экспорт бандла, parity-тесты (на английском) |
| teratts/ | Крейт движка TeraTTSv2 (ONNX Runtime, 44.1 кГц): экспорт, версионирование и обновление бандла, лицензии (на английском) |
| openspec/specs/ | Спецификации поведения (OpenSpec): IPC, хранилище, pipeline, UI, плеер |
| CHANGELOG.md | Хронология изменений |
Код приложения — GPL-3.0, см. LICENSE.md.
Важно: голосовая модель Silero Native распространяется по лицензии CC BY-NC-SA 4.0 — использовать её можно только в некоммерческих целях. Подробности: silero-native/NOTICE. Для использования без лицензионных ограничений выбирайте движок Piper — он сам и его голосовые модели распространяются по MIT.
TeraTTSv2: модель распространяется по TeraTTSv2 Model License (Open RAIL-M с условием коммерческой атрибуции) и BigScience Open RAIL-M; коммерческое использование возможно при выполнении условия атрибуции. Публичное использование обязано содержать атрибуцию «Text-to-speech powered by TeraTTSv2 by TeraSpace» со ссылкой на модель. Подробности: teratts/NOTICE.
