Desktop-приложение для быстрого прослушивания текстов и статей на русском языке — локально, без GPU и облака. Для случаев, когда в первую очередь важно быстро понять содержимое, а не красота сгенерированной речи — например, технические статьи.
Задача — временно и частично снять нагрузку с глаз. За рабочий день и после него они и так перегружены чтением: рабочие тексты, соцсети, новости. RuVox позволяет не читать большие тексты и статьи, а прослушать их — быстро, целиком, локально; а если что-то расслышать не удалось, оригинал перед глазами, текущее слово подсвечено.
Современные тяжёлые TTS, как правило, сами грамотно читают цифры, ссылки и английский текст, но требуют мощный GPU и синтезируют заметно дольше. Быстрые лёгкие движки (Silero, Piper) наоборот: моментальны и нетребовательны к ресурсам, но прочитать getUserData() или /api/v2/users не умеют. Когда лёгкий движок встречает такой фрагмент, варианты очевидны:
- просто пропустить его — но вместе с ним может уйти важная информация из текста;
- попытаться имитировать произношение — озвучить фрагмент приближённо, как он прозвучал бы при грамотном чтении.
RuVox идёт по второму пути: нормализация — компенсирующая прослойка, которая переписывает английские термины, аббревиатуры, код, числа и URL в «звучащую» русскую форму, чтобы лёгкий движок прочитал текст целиком. getUserData() → «гет юзер дата», API → «эй пи ай», /api/v2/users — как путь, а не по буквам. Произношение при этом остаётся приближённым, и это осознанный размен: вместо красоты речи и мощного железа RuVox даёт скорость понимания и легковесность по ресурсам.
Озвучивает один из трёх TTS-движков: Silero TTS v5 in-process на ONNX Runtime (крейт silero-native, движок по умолчанию, бандл модели скачивается по запросу), Piper (in-process, через piper-rs, запасной вариант без внешних зависимостей) или, опционально, Silero TTS out-of-process через Python-сайдкар ttsd (оставлен как fallback).
Синтез полностью локальный — никаких облачных TTS, текст никуда не отправляется. Сеть нужна только для разового скачивания голосовых моделей по запросу, проверки обновлений приложения и импорта текста по ссылке.
Готовые сборки публикуются в 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 встроен; автообновление из приложения |
Голосовая модель движка скачивается по запросу при первом использовании (для Silero Native — бандл ~230 МБ).
| Слой | Технология |
|---|---|
| Shell | Tauri 2 (Rust + нативный webview) |
| Frontend | React 18 + TypeScript 5 + Mantine 8 |
| Backend | Rust (pipeline нормализации, storage, TTS-менеджер) |
| TTS | 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) |
- Сверка с текстом — синхронная подсветка читаемого слова: непонятный на слух фрагмент можно тут же уточнить по оригиналу.
- Нормализация — английский (camelCase/snake_case), аббревиатуры, числа, даты, URL, email, код.
- 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→ «юзер собака экзампл точка ком»; - операторы и символы:
!=→ «не равно»,===→ «строго равно»,->→ «стрелка»,α→ «альфа»; - блоки кода: по умолчанию заменяются фразой вида «далее следует пример кода на пайтон», а в режиме «Читать полностью» проговариваются целиком с расшифровкой идентификаторов и операторов; mermaid-диаграмма всегда заменяется фразой «Тут мермэйд диаграмма».
Увидеть результат до синтеза можно в диалоге предпросмотра (открывается при добавлении текста): слева — оригинал, справа — то, что будет прочитано вслух.
- Формат источника в диалоге предпросмотра: «Авто», «Обычный текст», «Markdown» или «HTML». По умолчанию включён «Авто» — RuVox сам распознаёт формат: из HTML извлекается читаемый текст, а разметка Markdown (заголовки, списки, блоки кода) обрабатывается по смыслу, а не зачитывается посимвольно. HTML-разметка распознаётся только когда текст начинается и заканчивается тегом — поэтому вставленный CHANGELOG и техническая проза с угловыми скобками (
Vec<T>,<type>(<module>): <desc>) остаются обычным текстом или Markdown. Если автоопределение ошиблось, формат можно выбрать вручную. - Озвучка блоков кода в настройках: «Кратко» (по умолчанию) — блок кода заменяется фразой «далее следует пример кода на <язык>»; «Читать полностью» — код проговаривается целиком, с нормализацией идентификаторов, операторов и скобок. Настройка применяется сразу, без перезапуска приложения.
- ОС: 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) — 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) — 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 в Settings опция Python-движка Silero окрашена серым. Нативный движок Silero работает в обоих вариантах — его бандл ONNX-моделей (~230 МБ) скачивается по запросу из Settings.
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)
cd ttsd && uv run python -m pytest # Python subprocess| Файл | Описание |
|---|---|
| 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-тесты (на английском) |
| 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.
