Case file 014Voice input on Linux
The problem
“I have a lot to say, but typing it all is slow. Why can’t my computer just listen?”
Solved
- For
- Me first: dictation on a Linux (Wayland) desktop
- Built
- afk-voicy: a floating mic, a tray icon, a settings window and a CLI
- Stack
- Python · Whisper on Groq / Hugging Face · Deepgram · GTK4
- Result
- Metric to confirm
01 · The pain
Talking is faster than typing. Linux wasn’t listening.
- Long messages typed slowly, when saying them would take seconds.
- Dictation tools built for Windows and Mac, and silent on a Linux desktop.
- Raw transcripts full of “um” and “uh”, pasted in and fixed by hand.
02 · The fix
Speak into a floating button. Watch it clean your words.
A sample transcript. Switch each stage on and off. The filler step uses the app’s real pattern; the word list and AI pass are simulated here.
Sample · Raw transcription from Whisper
Um, so I've been thinking about, uh, how to improve the, erm, deployment pipeline. We need to, um, make it faster. Ahm, specifically, the, uh, kubernetes cluster needs better, erm, resource allocation.
Strip “um”, “uh”, “erm”, “ahm” and collapse spaces — removed 7 fillers
So I've been thinking about, how to improve the, deployment pipeline. We need to, make it faster. specifically, the, kubernetes cluster needs better, resource allocation.
Replace custom terms (e.g. kubernetes → Kubernetes)
Punctuation, capitalisation, no false starts (simulated)
Final output
So I've been thinking about, how to improve the, deployment pipeline. We need to, make it faster. specifically, the, kubernetes cluster needs better, resource allocation.
03 · How it works
Mic to type, with streaming and reconciliation.
Click the floating mic button or use a hotkey
The orb shows the state: grey idle, red listening, amber transcribing. It stops on silence, or when you say “stop listening”.
Speech becomes text while you talk
Whisper (on Groq or Hugging Face) or Deepgram turns the audio into text, and partial results arrive while you are still speaking. Fillers like “um” and “uh” are stripped on the spot.
Text is cleaned, then typed
Your own word list fixes names and jargon. An optional AI pass tidies punctuation and false starts. Then the text is typed into whichever window has focus, by whichever method that window accepts.
The hard part
Never show corrections while you’re still talking.
Waiting for the full sentence feels slow, but typing every guess means words flicker and change on screen. So while you speak, a fresh transcript is requested every 1.2 seconds, and only the words that two transcripts in a row agree on are typed. The last two are always held back, because they still change.
When you stop, the final version is compared with what is already on screen, and only the rest is typed.
Partial 1
so I want to buildPartial 2
so I want to build aTyped so far (2 held back)
so I wantFinal
so I want to build a systemAction
type “to build a system”04 · What changed
Say it once. It appears where the cursor is.
- Words dictated
- —
- Time saved a day
- —
- People using it
- —
Blanks: metrics to confirm.
