CLI tool
jatinkrmalik/vocalinux avatar
jatinkrmalik/vocalinux

Vocalinux: offline voice dictation on Linux, from whisper.cpp to Vulkan

Project brief: Free, open-source, 100% offline voice dictation for Linux. Speak and type anywhere via whisper.cpp, Whisper & VOSK engines, GPU-accelerated, works on X11 + Wayland!

849 stars96 forksPythonAGPL-3.0

At a glance

What is it?
Vocalinux is an AGPL-3.0 desktop app that types your speech into any Linux application using on-device recognition. It ships three engines and a distro-aware installer, and it is the licence change, not the feature list, that deserves a second look.
Who is it for?
Adopt Vocalinux if you dictate into many applications on a Linux desktop and want the audio to stay on the machine; the default whisper.cpp engine plus Vulkan covers AMD, Intel and NVIDIA without a CUDA stack. Skip it if you need a signed, reproducible package or you cannot install libgirepository-2.0-dev and the distro PyGObject package, because the installer builds against system GI rather than a pip wheel.
Can I use it commercially?
Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 20, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

What Vocalinux is for, and who ends up using it

Linux desktops have never had a default answer to "hold a key and talk". Vocalinux is that answer as a GTK desktop application: you speak, and the text lands in whatever window has focus, whether that is a browser, an editor or a chat client. It is aimed at end users rather than developers, which the pyproject classifiers say outright with Intended Audience :: End Users/Desktop and Environment :: X11 Applications :: GTK.

The project's own framing is that speech-to-text stays on your machine after the model download, and that no Voca account is required. That matters for people dictating notes, email or code comments who cannot send audio to a hosted API, and for anyone on a metered or unreliable connection. It is also a plausible fit for users who find typing difficult, since dictation into arbitrary applications is the whole point rather than a transcription window you copy text out of.

The repository is not archived and the last push was on 2026-08-29, with nightly builds published on 2026-08-27, 2026-08-28 and 2026-08-29. The current release line is 0.16.0, and the README describes v0.16.0 as adding an in-app update checker, a Right Alt push-to-talk default for new installs, a searchable language list, model deletion and a dictation tone picker.

Three engines, one capture path, and where the text actually goes

The engine is the first architectural decision the app exposes. whisper.cpp is the default and is described as high-performance C++ speech recognition; OpenAI Whisper is the PyTorch route and is documented as NVIDIA GPU only; VOSK is the lightweight option for older systems. The optional dependency groups in pyproject.toml mirror that split: vosk pulls vosk, whisper pulls openai-whisper, torch and torchaudio, and there are separate parakeet and faster_whisper groups built on sherpa-onnx and faster-whisper respectively.

GPU acceleration is not tied to CUDA. The README states that Vulkan acceleration covers AMD, Intel and NVIDIA, and the 0.16.0 notes mention honouring bundled GPU libraries and skipping software Vulkan in the AppImage build. That is the part worth understanding: the default engine is a C++ binary talking to a Vulkan device, so the Python process is mostly capture, hotkey handling and text injection.

Injection is the least visible and most failure-prone layer. The dependencies include pynput and evdev for input handling, and the release notes describe IBus work in 0.16.0: safer scoped injection, engine restore after teardown, and XKB layout restore on X11. There is also a clipboard path, with restore after a ydotool paste and text-only reads. So the text can reach the focused application through more than one mechanism, and the one that works depends on your session type and toolkit. The README does not document which path is chosen when, which is the first thing I would want written down.

Installing Vocalinux and dictating your first sentence

The README recommends the interactive installer, which it says detects hardware (GPU, RAM, Vulkan support) and recommends an engine. It is a shell script fetched to /tmp and executed:

bash
curl -fsSL raw.githubusercontent.com/VocaHQ/vocalinux/main/install.sh -o /tmp/vl.sh && bash /tmp/vl.sh

During the run you choose between whisper.cpp, OpenAI Whisper and VOSK. The script then installs dependencies and downloads a model. Watch the output for the distro PyGObject requirement: the 0.16.0 notes say the installer requires distro python3-gi because there is no pip sdist of PyGObject, and gate util-linux-extra to Ubuntu 24.04 and newer. If a model download fails, the release notes say the installer reports it rather than continuing silently.

For distribution packages, the README links a PyPI project page and an AUR package, so Arch users can go through the AUR rather than the script. The source tree also carries snap/ and packaging/ directories, a vocalinux.desktop entry and uninstall.sh. The README does not document a Flatpak or a Debian package.

After installation, the default activation for new installs is hold Right Alt to talk, per the v0.16.0 highlights. Existing configurations keep whatever shortcut they already had. Settings includes a Test Dictation action, and 0.16.0 fixed a bug where Test Dictation reported no speech when recognition had never started. Use that before blaming your microphone. If you want to run from a checkout instead, the justfile is the entry point and `just` with no recipe lists everything available; `just deps` builds the development environment with uv, and `just install` creates the venv from the system Python so the distro PyGObject stays importable.

The PyGObject constraint and other places it breaks

The hardest constraint is packaging. PyGObject is declared as a plain dependency with no version pin, and the project's own justfile comments explain why: the dev environment pip-builds PyGObject from the lock and needs libgirepository-2.0-dev on Ubuntu 24.04 or newer, while Debian 12 cannot build version 3.56 at all and is told to use `just install-dev` instead. Two environments exist deliberately, .venv for tooling and venv for the app, and install.sh will ignore an activated .venv and rebuild venv if another interpreter created it. This is a project that has fought its own build system, and the comments in the justfile are unusually candid about it.

A second limitation is scope. This is a desktop dictation tool, not a transcription service. There is no documented batch mode, no server API, no diarization and no timestamped transcript output. If you want to transcribe a directory of recordings, this is the wrong tool.

Third, the shortcut default changed in 0.16.0. New installs get hold Right Alt; existing configs are left alone. Right Alt is AltGr on many non-US layouts, so on a layout where AltGr produces characters, a push-to-talk binding on that key is a conflict you will feel immediately. The README does not discuss that interaction.

Finally, the release cadence is nightly. The three most recent releases are all nightly builds of 0.16.0.dev, which means the newest code arrives before it has sat in a stable release. The in-app update checker can follow stable or nightly channels, and choosing nightly is choosing that trade-off.

How it compares with nerd-dictation and the Whisper CLI route

nerd-dictation is the closest comparison people search for, and the difference is in the shape of the thing. nerd-dictation is a script-driven front end that feeds a VOSK model and emits text through a small set of output actions; you configure it by editing files and wiring it into your session yourself. Vocalinux is a GTK application with a settings dialog, a system tray with status states, XDG autostart, an update checker and a choice of three engines. If you want a composable script you can read in one sitting, nerd-dictation is the better fit. If you want a tray icon and a preferences window, Vocalinux is.

The other route is the Whisper command line itself. Running whisper.cpp or openai-whisper over a recorded file gives you a transcript and stops there; you still need something to capture the microphone, handle a hotkey and paste the result into the focused window. Vocalinux is that something, and its value is concentrated in the injection layer and the tray, not in the recognition, which is upstream either way.

The 0.16.0 notes also show where the project spends its effort: IBus scoping, clipboard restore after ydotool paste, filtering unsafe virtual capture devices and opening stereo microphones at their native channel count. Those are integration bugs, not model bugs. That tells you what you are adopting.

Licence, maintenance and what an upgrade costs

The licence changed. pyproject.toml declares license = "AGPL-3.0-only" with license-files = ["LICENSE"], and the v0.16.0 highlights list AGPL-3.0 as a change made to align with other VocaHQ projects. The repository metadata in this profile still shows GPL-3.0, which is stale relative to the source. If you redistribute Vocalinux or offer it as a network service, AGPL-3.0-only is a materially different obligation from GPL-3.0, and that difference is worth a conversation with whoever handles licensing at your organisation. I am not giving legal advice; read LICENSE.

Upgrade cost is low but not zero. Nightly builds are tagged with a date and a commit, models are downloaded once and can now be deleted from Settings, and the update checker can be pointed at stable or nightly. The friction is in the environment: the justfile warns that `uv sync` prunes whatever flags do not name, so omitting `--group lint` really does uninstall the linters, and recipes use `uv run --no-sync` to avoid undoing `just deps-all`. The same class of surprise applies to users: install.sh rebuilds venv when a different interpreter created it, so a virtualenv you activated by hand may be ignored.

The last push was on 2026-08-29 and nightlies followed daily through that week. That is a fast-moving project with a single named maintainer in pyproject.toml, which is a normal shape for a desktop utility but means the packaging edge cases above are fixed by whoever hits them.

Editorial conclusion

Adopt Vocalinux if you dictate into many applications on a Linux desktop and want the audio to stay on the machine; the default whisper.cpp engine plus Vulkan covers AMD, Intel and NVIDIA without a CUDA stack. Skip it if you need a signed, reproducible package or you cannot install libgirepository-2.0-dev and the distro PyGObject package, because the installer builds against system GI rather than a pip wheel. Before committing, install on a spare account, confirm that the Right Alt push-to-talk default does not collide with your keyboard layout, and check whether the IBus injection path works in the specific toolkit you type into.

Frequently asked questions

How do I use Vocalinux to dictate into an application?

Install it, download a speech model, then hold the activation key while you speak. New installs default to hold Right Alt for push-to-talk, and the README says there is also a toggle mode. The text is inserted into whichever application has focus.

Does Vocalinux work offline?

The README states that models are downloaded once and speech-to-text then stays on your machine, with no Voca account required. The recognition engines run locally, so dictation itself does not need a network connection.

Which speech engines does Vocalinux support?

Three: whisper.cpp, which is the default and runs with Vulkan acceleration, OpenAI Whisper, which the README describes as PyTorch-based and NVIDIA GPU only, and VOSK, which is positioned as the lightweight option for older systems.

What are the requirements to install Vocalinux?

pyproject.toml sets requires-python to 3.11 or newer, and the 0.16.0 notes say the installer requires the distro python3-gi package because there is no pip sdist of PyGObject. The justfile comments add that the development environment needs libgirepository-2.0-dev on Ubuntu 24.04 or newer, and that Debian 12 cannot build PyGObject 3.56.

Can I use Vocalinux on Wayland?

The project description says it works on X11 and Wayland. The 0.16.0 release notes describe IBus injection work and XKB layout restore specifically on X11, and clipboard restore after a ydotool paste, so the injection path differs between the two sessions.

Official sources

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
Community notes

Community notes