Offline Dictation Tool
# Taura — Offline Voice Dictation for Linux (i3 / X11)
100% offline voice-to-text using faster-whisper. No cloud, no subscriptions, no internet needed.
*Taura* comes from the Shona verb *kutaura* — to speak.
## Architecture
```
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.
## Quick Start
```bash
git clone ~/dictation
cd ~/dictation
chmod +x setup.sh
./setup.sh
```
Reload i3 (`$mod+Shift+r`), then **hold `Ctrl+Shift+Space`** to record. Release to transcribe.
## Files
| 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 |
## Configuration
**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 dic …