A desktop application for narrating technical Russian-language texts.
Normalizes English terms, abbreviations, code, numbers, and URLs, then pipes the result into one of three TTS engines: Silero TTS v5 in-process on ONNX Runtime (the silero-native crate, default; model bundle downloaded on demand), Piper (in-process via piper-rs, zero-dependency fallback), or, optionally, Silero TTS out-of-process via the ttsd Python sidecar (kept as a fallback). Unlike a bare TTS, RuVox knows how to read getUserData() as «гет юзер дата», API as «эй пи ай», and /api/v2/users as a path rather than letter by letter.
All synthesis runs locally on your machine — no cloud TTS, nothing is sent anywhere. The network is used only to download voice models on demand, once per voice.
| Layer | Technology |
|---|---|
| Shell | Tauri 2 (Rust + native webview) |
| Frontend | React 18 + TypeScript 5 + Mantine 8 |
| Backend | Rust (normalization pipeline, storage, TTS manager) |
| TTS | Silero v5 native (in-process, ONNX Runtime, silero-native crate, default); Piper (in-process, piper-rs + onnxruntime, fallback); Silero via ttsd (optional Python 3.12 subprocess, fallback) |
| Audio | tauri-plugin-mpv (libmpv with scaletempo2) |
- Normalization — English (camelCase / snake_case), abbreviations, numbers, dates, URLs, email, code.
- Markdown + HTML — rendered and narrated while preserving meaning.
- Mermaid diagrams — visualized in the UI; replaced with a «тут мермэйд диаграмма» marker for TTS.
- Word highlight — synchronous highlighting of the currently narrated word during playback.
- Preview dialog — preview the normalized text before synthesis.
- System tray — close-to-tray, background mode.
- OS: Linux (X11 or Wayland).
- Nix: recommended — the entire toolchain (Rust, Node, Python, Tauri deps) is built from
flake.nix(dev shell lives innix/devshell.nix). - Without Nix: Linux distribution that ships
webkit2gtk-4.1(Ubuntu 24.04+, Debian 13+, Fedora 40+, Arch). Detailed step-by-step build guide: docs/install.md. Python 3.12 +uvare only required for the Python Silero engine (thettsdsidecar) — Piper and the native Silero engine need neither.
# Interactive shell
nix develop
pnpm install
pnpm tauri dev
# Or run a single command without entering the shell
nix develop -c pnpm install
nix develop -c pnpm tauri devAll commands in the docs assume execution inside nix develop (or via nix develop -c ...).
# Default (slim) — Piper + native Silero, no Python/torch in the closure.
nix build .#ruvox
./result/bin/ruvox
# Opt-in (full) — additionally bundles the ttsd sidecar, so the Python
# Silero engine is also available.
nix build .#ruvox-with-silero
./result/bin/ruvoxBoth variants build the Tauri release binary and wrap it via wrapProgram (runtime LD_LIBRARY_PATH + GIO_EXTRA_MODULES) with mpv in PATH. .#ruvox-with-silero additionally puts the ttsd (Silero Python subprocess) binary in PATH; .#ruvox does not, and the Settings dialog greys the Python Silero engine out at runtime. The native Silero engine works in both variants — its ~230 MB ONNX model bundle is downloaded on demand from Settings.
First
nix buildrun: thefrontendderivation usespnpm.fetchDepswithlib.fakeHash— Nix will fail with a hash mismatch and print the real hash; substitute it intoflake.nixand re-run the build. This is the standard pnpm2nix procedure.
pnpm typecheck # TypeScript
cargo test --manifest-path src-tauri/Cargo.toml # Rust (incl. pipeline golden tests)
cargo test --manifest-path src-tauri/Cargo.toml --test golden # golden tests only
cargo test --manifest-path silero-native/Cargo.toml # native Silero engine (bundle-gated tests skip without SILERO_NATIVE_BUNDLE)
cd ttsd && uv run python -m pytest # Python subprocess| File | Description |
|---|---|
| AGENTS.md | Development rules, project structure, conventions |
| docs/install.md | Building from source on Linux without Nix (Ubuntu 24.04+) |
| silero-native/ | Native Silero v5 engine crate (ONNX Runtime): architecture, bundle export, parity tests |
| openspec/specs/ | Behavior specs (OpenSpec): IPC, storage, pipeline, UI, playback |
| CHANGELOG.md | Change history |
GPL-3.0 — see LICENSE.md.
