Whisper Dictation on Linux: What Actually Works (2026)

Whisper solved transcription. It did not solve dictation, and the gap between those two things is why so many Linux setups stall halfway.
Whisper takes an audio file and returns text. Dictation means: press a key anywhere, speak, and have punctuated text appear at the cursor in whatever window you are looking at. Whisper is one of the four parts you need. This is what the other three are, and what to install depending on how much assembly you want to do.
TL;DR
- Whisper alone is not a dictation tool. You need capture, a trigger, and text injection around it.
- Fastest local route → Handy or Speech Note. Both wrap Whisper-class models with the rest already wired up.
- Best raw speed on an NVIDIA GPU → faster-whisper.
- No Python, or old hardware → whisper.cpp.
- You want to build it yourself → whisper.cpp plus a hotkey script plus
ydotool/dotool. Budget an evening. - You do not want to build anything and can accept cloud → Vibe Typer.
The four parts of a dictation tool
- Capture — get audio from the microphone while a key is held. PipeWire on any current distro;
parec,soxorpw-catat the command line. - Recognition — Whisper. This part is solved and free.
- Injection — put the resulting text into the focused window. This is the hard part on Linux.
- A trigger — a global hotkey your desktop environment routes to the right script.
Every guide that ends at step 2 leaves you with a transcript in a terminal, which is not what you wanted.
Which Whisper
whisper.cpp
A C/C++ port with no Python dependency. Runs on CPU, CUDA, Vulkan and Metal. MIT licensed. This is the one to use on a machine without a discrete GPU, or where you do not want a Python environment in the loop.
git clone https://github.com/ggerganov/whisper.cpp
cd whisper.cpp && cmake -B build && cmake --build build -j --config Release
bash ./models/download-ggml-model.sh base.en
It ships a stream example that approximates live transcription. Be clear about what that is: it is a demo of continuous transcription, not a dictation front-end. There is no hotkey and no injection.
faster-whisper
A Python library built on CTranslate2, roughly 4× the throughput of reference Whisper on an NVIDIA GPU with int8 quantisation. If you have the GPU, this is the fastest path to a good transcript.
pip install faster-whisper
The trade is a Python environment and CUDA libraries you now maintain.
Which model size
base.en is the honest default for dictation. small.en is noticeably better on accents and technical vocabulary and still fast on modern hardware. medium and above are for transcribing recordings, not for a tool you want to respond in under a second — the latency stops feeling like typing.
English-only variants (.en) beat the multilingual model of the same size if you only dictate English. If you switch languages, you need the multilingual one and should expect it to be slower.
Injection: the part that actually stops people
Getting text into the focused window is where Linux dictation setups die, and it is Wayland's doing — deliberately. Wayland's security model stops one client synthesising input into another, which is a good decision for security and an inconvenient one here.
Check what you are running first:
echo $XDG_SESSION_TYPE
On X11 it is easy. xdotool type "$text" works, and always has.
On Wayland your options are:
ydotool— goes through/dev/uinput, below the display server, so it works everywhere including TTYs. Needs a daemon with access to that device, which is a genuine privilege decision.dotool— the sameuinputapproach with a simpler interface. Same permission question.wtype— the clean protocol-level answer, and it does not work on GNOME. Mutter does not implement the virtual-keyboard protocol it needs, and there is no sign that is changing. Since GNOME is the default on Ubuntu and Fedora, this ruleswtypeout for most desktops.- Clipboard + paste — put the text on the clipboard with
wl-copyand synthesise Ctrl+V. Works widely, but it clobbers your clipboard and fails in terminals where paste is Ctrl+Shift+V.
There is no option here that is both universal and free of caveats. That is the honest state of it in 2026.
The shortcut: tools that ship all four parts
If you want Whisper-class accuracy without wiring the pipeline yourself:
Handy — MIT licensed, cross-platform, runs Whisper locally, push-to-talk, handles injection. The closest thing to "Whisper dictation, installed."
Speech Note — a Flatpak with a GUI, many engines including Whisper, fully offline, and it will read text back too. Its own window rather than system-wide injection, so it suits composing-then-pasting more than typing directly into an IDE.
OpenWhispr and Whispering — Electron and desktop wrappers around the same idea, both open source.
nerd-dictation — worth naming even though it is VOSK rather than Whisper, because its Python post-processing hook is the best scripting story on Linux. Lower accuracy, no punctuation, total control. We compared it in detail in nerd-dictation vs Vibe Typer.
Rolling your own: the honest shape of it
If you do want to build it, the working pattern is:
- A hotkey bound in your DE that runs a script on press and release.
- On press, start
pw-cat --recordto a temp WAV. - On release, stop it and pipe the file to
whisper-clior faster-whisper. - Take the output, strip the timestamps, and hand it to
ydotool typeorwl-copy+ paste.
That works and plenty of people run it. Things that will eat your evening: the hotkey release event (many DEs only bind press), the uinput permissions, .wav sample-rate mismatches, and Whisper's habit of emitting [BLANK_AUDIO] or hallucinating a "Thanks for watching!" on silence — which you have to filter, or it types it.
Where Vibe Typer sits, and where it does not
We should be direct: Vibe Typer is not a Whisper wrapper you run locally. It streams audio to a backend and returns punctuated, formatted text. It is a single AppImage, it handles injection natively on Wayland and X11 including GNOME, and there is nothing in the four-part pipeline for you to assemble.
If offline is a requirement, it is the wrong tool and one of the local options above is right. We would rather say that here than have you find out after installing it. If offline is a preference and you would rather not spend the evening on uinput permissions, that is the trade we are offering.
chmod +x VibeTyper.AppImage
./VibeTyper.AppImage
FAQ
Does Whisper run in real time on Linux?
Not truly streaming, out of the box. whisper.cpp's stream example chunks audio and re-transcribes, which approximates it. For dictation you do not need streaming — you need a fast turnaround after you stop speaking, and base.en or small.en on decent hardware gives you that.
Do I need a GPU?
No. base.en on whisper.cpp is comfortable on a modern CPU. A GPU with faster-whisper mainly buys you the ability to run a larger model at the same latency.
Why does my transcript have "Thank you" at the end of silent clips? A known Whisper artefact — it hallucinates common phrases from its training data on near-silent input. Filter short outputs and use a voice-activity gate before transcribing.
Which is better, whisper.cpp or faster-whisper? faster-whisper if you have an NVIDIA GPU and do not mind Python. whisper.cpp everywhere else, and on principle if you want one binary with no runtime.
For the complete field of Linux dictation tools, with a Wayland column on each, see Linux dictation software: 14 tools that actually run. For the input-injection problem specifically, voice typing on Wayland goes deeper.
Try Vibe Typer free
Voice typing that works in every app on Linux, Windows, and macOS. Free to download: 2,000 words a month, no card.


