korvoice
Push-to-talk (or toggle) Russian voice input for Linux, powered by the local GigaAM speech model. Hold a hotkey, speak, release — the recognized text lands in the clipboard, gets typed into whatever window has focus, and/or shows up in a small history window. Everything runs on-device; nothing is sent anywhere.
Features
- Push-to-talk or toggle — hold the hotkey to record and release to transcribe, or press once to start and again to stop. One mode is active at a time, switchable from Settings or the tray menu, on the same hotkey.
- Three independent output sinks — clipboard, autotype into the focused window, and a history window, any combination at once.
- Local GigaAM recognition —
v3_e2e_ctcby default (fast, with punctuation and case restoration); switch to an RNNT or non-punctuated variant in Settings → Model. CPU/CUDA device is auto-detected. - Long recordings handled without an external VAD model — GigaAM refuses audio over ~25s in one call; longer recordings are split at the nearest detected pause instead of a hard mid-word cut.
- Tray + Nord GUI settings — system / Nord dark / Nord light theme, same visual language across the settings dialog and history window.
- X11 and Wayland — global hotkey via direct
XGrabKeyon X11, theGlobalShortcutsportal on Wayland. Autotype shells out toxdotool(X11) orydotool(Wayland) — see Configuration below — clipboard and the history window always work regardless of session type or whether either tool is installed. - Autostart — optional login autostart entry, toggled from Settings.
Quick start
pipx install korvoice
# Required ASR backend. The GigaAM release currently on PyPI lacks the v3/e2e
# models used by korvoice, so install its current GitHub version into the same
# pipx environment. The extra index selects CPU-only PyTorch wheels.
pipx runpip korvoice install \
--extra-index-url https://download.pytorch.org/whl/cpu \
"gigaam[torch] @ git+https://github.com/salute-developers/GigaAM.git"
korvoice # starts the tray daemon
korvoice --check # environment diagnostics (mic, ffmpeg, hotkey backend, gigaam)
The GigaAM model (weights ~1 GB, cached in ~/.cache/gigaam/) downloads
and loads in the background as soon as the daemon starts, not on first
use — the first hotkey press only has to wait for that warm-up if you
press it within the first few seconds of starting korvoice.
Usage / Configuration / CLI
korvoice # start (or, if already running, no-op) the tray daemon
korvoice --settings # open settings in the running instance
korvoice --history # open the history window in the running instance
korvoice --quit # quit the running instance
korvoice --check # diagnostics: tray, hotkey backend, mic, ffmpeg, gigaam
korvoice --debug # verbose logging (also to ~/.local/state/korvoice/korvoice.log)
Settings (~/.config/korvoice/config.yaml, YAML, written on every change):
| Setting | Values | Default |
|---|---|---|
| Theme | system / nord-dark / nord-light |
system |
| Interface language | system / ru / en |
system |
| Tray icon colour | auto / dark / light |
auto |
| Recording mode | push_to_talk / toggle |
push_to_talk |
| Record hotkey | Ctrl+Alt+...-style combination, or a single modifier (Right/Left Ctrl/Shift/Alt/Super) |
Ctrl+Alt+Space |
| Model | v3_e2e_ctc / v3_e2e_rnnt / v3_ctc / v3_rnnt |
v3_e2e_ctc |
| Inference device | auto / cpu / cuda |
auto |
| Max chunk length | 5-24 seconds | 20 |
| Microphone | any input device PortAudio reports | system default |
| Output: keep in clipboard / autotype / history window | on/off, independently | all on |
| Text ending | nothing / space / new line / blank line / custom text | nothing |
| Keep history between restarts | on/off (last 1000 entries) | off |
| Autostart at login | on/off | off |
GPU acceleration
For NVIDIA CUDA, omit the PyTorch CPU index when installing GigaAM:
pipx runpip korvoice install \
"gigaam[torch] @ git+https://github.com/salute-developers/GigaAM.git"
Then set Settings → Model → Inference device to cuda (or leave auto).
AMD is not supported: the RX580 and similar Polaris-generation cards
(gfx803) were dropped from official ROCm support in ROCm 6.0+, and the
only path back is a third-party patched ROCm/PyTorch Docker image — out of
scope for this project for now.
Autotype
Both backends are external system tools, not pip dependencies:
- X11:
xdotool(sudo apt install xdotoolor your distro's equivalent). Korvoice puts the text in Qt's clipboard and asksxdotoolto send oneCtrl+Vrather than emulating every character:xdotool typerepeatedly changes the X11 keymap for Cyrillic and can freeze the whole desktop. Therefore X11 autotype uses the clipboard temporarily; when “keep in clipboard” is off, the previous MIME contents are restored after pasting (clipboard-history managers may still record the temporary text). - Wayland:
ydotool, whose daemon (ydotoold) needs to be running with access to/dev/uinput.
If the relevant tool isn't set up, autotype silently fails and the reason shows up in the tray tooltip — clipboard and the history window are unaffected either way.
Development
make install
make check # lint + test
No make typecheck/mypy here — see the comment in pyproject.toml's
[project.optional-dependencies]: strict typechecking is this author's
convention for server/backend projects, optional for a small GUI utility.
Publishing to PyPI
.github/workflows/publish.yml tests and builds the package on pull requests,
main pushes and manual runs. Pushing a tag matching the version in
pyproject.toml (for example, v0.1.0) additionally publishes the wheel and
source distribution to PyPI using trusted publishing — no API token is stored
in GitHub.
Configure a PyPI trusted publisher with owner r4ven-me, repository
korvoice, workflow publish.yml, and environment pypi. The required
GigaAM Git installation remains a documented second step because PyPI rejects
direct Git dependencies and its gigaam 0.1.0 package lacks the v3/e2e models.
Links
Project presentation convention: whenever project contacts are listed, keep all four links together:
- Website: r4ven.me
- GitHub: github.com/r4ven-me/korvoice
- Telegram channel: t.me/r4ven_me
- Telegram chat: t.me/r4ven_me_chat
Author
Credits
Speech recognition by GigaAM (Sber/SberDevices), MIT licensed — not affiliated with korvoice.
License
GNU General Public License v3.0 or later (GPL-3.0-or-later), see LICENSE.
Release files for korvoice 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| korvoice-0.2.1.tar.gz | 66.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| korvoice-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 127.4 kB
Release files / korvoice-0.2.1.tar.gz
| Download URL | korvoice-0.2.1.tar.gz |
|---|---|
| Size | 66.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
85f77453e74d46f44a261e5b813355d6e25e8fad1b57d33318f0cdb359739108
|
|
BLAKE2b-256 checksum How to use checksums |
d056f3804abb6feb0f91b2a6b7111dbdce552745f1e21e80f11cdd5f7f5af975
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency logRelease files / korvoice-0.2.1-py3-none-any.whl
| Download URL | korvoice-0.2.1-py3-none-any.whl |
|---|---|
| Size | 61.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e08d9bffd9b10bd42638d2f1ac6bd9a466efdca175b55f74156ab026c62f0d9b
|
|
BLAKE2b-256 checksum How to use checksums |
6019aa8c56f5b266a66ce9e2e2e1b80861b1c0b4e51a806b2ad89291b6f33e0b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency log