Skip to content
xilecPublic

About

Desktop-приложение для быстрого прослушивания текстов и статей на русском языке — локально, без GPU и облака. Для случаев, когда в первую очередь важно быстро понять содержимое, а не красота сгенерированной речи — например, технические статьи. https://xilec.github.io/RuVox/

Topics

Resources

Contributing

Stars

3 stars

Watchers

0 watching

Forks

Latest commit

 

History

1,204 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RuVox

English version

CI License: GPL-3.0

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, текст никуда не отправляется. Сеть нужна только для разового скачивания голосовых моделей по запросу, проверки обновлений приложения и импорта текста по ссылке.

Скриншот RuVox

Пошаговое руководство по интерфейсу, настройкам и горячим клавишам: 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 в них не нуждаются.

Dev-окружение

# Интерактивная оболочка
nix develop
pnpm install
pnpm tauri dev

# Или одну команду без входа в оболочку
nix develop -c pnpm install
nix develop -c pnpm tauri dev

Все команды в документации подразумевают запуск внутри nix develop (либо через nix develop -c ...).

Сборка production-бинаря

# По умолчанию (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: derivation frontend использует 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.

About

Desktop-приложение для быстрого прослушивания текстов и статей на русском языке — локально, без GPU и облака. Для случаев, когда в первую очередь важно быстро понять содержимое, а не красота сгенерированной речи — например, технические статьи. https://xilec.github.io/RuVox/

Topics

Resources

Contributing

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages