100% offline voice-to-text using faster-whisper. No cloud, no subscriptions, no internet needed.
Taura comes from the Shona verb kutaura — to speak.
Hold Ctrl+Shift+Space
│
push_to_talk.py (systemd: dictation-listener)
├── shows red "● REC" indicator (rec_indicator.py)
├── records audio via sox → /tmp/dictation_recording.wav
└── sends wav path via socat → ~/.dictation.sock
│
transcription_server.py (systemd: dictation-daemon)
└── faster-whisper model loaded once, stays in RAM
│
xdotool types transcribed text into the active window
Two systemd user services start at login: the daemon loads the Whisper model once and keeps it resident; the listener handles the hotkey, recording, and visual indicator.
git clone <this-repo> ~/dictation
cd ~/dictation
chmod +x setup.sh
./setup.shReload i3 ($mod+Shift+r), then hold Ctrl+Shift+Space to record. Release to transcribe.
| File | Purpose |
|---|---|
setup.sh |
One-shot installer |
transcription_server.py |
Daemon — holds Whisper model in memory, listens on Unix socket |
push_to_talk.py |
Hold-to-record listener (pynput), manages recording and indicator |
rec_indicator.py |
Floating red "● REC" bar shown while recording |
dictation-daemon.service |
Systemd user service for the transcription daemon |
dictation-listener.service |
Systemd user service for the push-to-talk listener |
Change model size — edit ~/.config/systemd/user/dictation-daemon.service, uncomment and set DICTATION_MODEL:
| Model | Size | RAM | Speed |
|---|---|---|---|
| tiny | 75 MB | ~1 GB | Fastest |
| base | 142 MB | ~1 GB | Fast |
| small | 466 MB | ~2 GB | Default — good balance |
| medium | 1.5 GB | ~5 GB | Slower, more accurate |
| large-v3 | 3 GB | ~10 GB | Best accuracy |
Then: systemctl --user daemon-reload && systemctl --user restart dictation-daemon
Change language — same file, set DICTATION_LANG (default: en).
Change hotkey — edit the on_press / on_release functions in push_to_talk.py, then restart the listener service.
DISPLAY — setup.sh auto-detects and patches this. If the listener starts but doesn't respond to keypresses, check echo $DISPLAY and update Environment=DISPLAY= in ~/.config/systemd/user/dictation-listener.service.