Voice dictation for Linux using OpenAI's Whisper models. Type with your voice using local speech recognition - no cloud services required.
- Flexible Output: Instant typing at cursor or copy to clipboard
- Dual Backends: Choose between
whisper.cpporfaster-whisper - Hardware Acceleration: CUDA, Vulkan, OpenVINO, and CPU support
- Model Preloading: Daemon mode keeps models in memory for instant transcription
- System Tray Indicator: Shows recording status, backend info on hover
- NixOS Integration: First-class NixOS and Home Manager support
- Single Instance: Only one recording at a time, automatic cleanup of old files
{
# With NixOS
imports = [ whisp-away.nixosModules.nixos ];
# With home-manager
imports = [ whisp-away.nixosModules.home-manager ];
services.whisp-away = {
enable = true;
accelerationType = "vulkan"; # or "cuda", "openvino", "cpu" - requires rebuild
defaultBackend = "faster-whisper"; # or "whisper-cpp"
defaultModel = "base.en"; # Model to use
useClipboard = false; # true = copy to clipboard, false = type at cursor
# Optional: Auto-start services on login
autoStartDaemon = true; # Keep model preloaded for fast transcription
autoStartTray = true; # System tray for control
};
}Configure in your window manager. Two options:
Option 1: Single key toggle (simplest)
# Hyprland - press once to start, press again to stop and transcribe
bind = ,section,exec, whisp-away toggle
# With clipboard output:
bind = ,section,exec, whisp-away toggle --clipboard true
Option 2: Push-to-talk (hold to record)
# Hyprland - hold key to record, release to transcribe
bind = ,section,exec, whisp-away start
bindr = ,section,exec, whisp-away stop
# Sway equivalent:
bindsym section exec whisp-away start
bindsym --release section exec whisp-away stop
Note: section is the § key on Swedish keyboards (top-left, below Esc). Replace with your preferred key.
The tray icon shows recording status at a glance:
- Icon: Changes to indicate recording state (active mic = recording, muted mic = idle)
- Hover: Shows backend, model, and acceleration info
- Right-click menu: Displays current status (informational only)
Start manually if not using autoStartTray:
whisp-away trayThe tray is purely informational - use keybinds to control recording.
Keep the model preloaded for instant transcription:
# Start daemon (or use autoStartDaemon = true in NixOS config)
whisp-away daemon
# In another terminal, use start/stop as normal
whisp-away start # Begin recording
whisp-away stop # Stop and transcribe (instant with daemon)# Toggle mode - single command for start/stop
whisp-away toggle # Start if not recording, stop if recording
whisp-away toggle --clipboard true # Same but output to clipboard
# Separate start/stop commands
whisp-away start # Start recording
whisp-away stop # Stop and transcribe
# Specify model, backend, or output mode
whisp-away stop --model medium.en
whisp-away stop --backend faster-whisper
whisp-away stop --clipboard true # Copy to clipboard instead of typing
# Transcribe an existing audio file
whisp-away stop --audio-file recording.wav| Model | Size | Speed | Quality | Use Case |
|---|---|---|---|---|
| tiny.en | 39 MB | Instant | Basic | Quick notes, testing |
| base.en | 74 MB | Fast | Good | Casual dictation |
| small.en | 244 MB | Moderate | Better | Daily use (recommended) |
| medium.en | 769 MB | Slow | Excellent | Professional transcription |
| large-v3 | 1550 MB | Slowest | Best | Maximum accuracy, multilingual |
Models download automatically on first use and are stored in:
~/.cache/whisper-cpp/models/(GGML models for whisper.cpp)~/.cache/faster-whisper/(CTranslate2 models for faster-whisper)
| Type | Backend Support | Hardware |
|---|---|---|
| vulkan | whisper.cpp | Most GPUs (AMD, NVIDIA, Intel) |
| cuda | Both backends | NVIDIA GPUs only |
| openvino | whisper.cpp | Intel GPUs and CPUs |
| cpu | Both backends | Any CPU (slow) |
Note: faster-whisper only supports CUDA and CPU. The whisper.cpp backend supports all acceleration types.
services.whisp-away = {
enable = true;
defaultModel = "small.en"; # sets WA_WHISPER_MODEL
defaultBackend = "faster-whisper"; # sets WA_WHISPER_BACKEND
accelerationType = "vulkan"; # GPU acceleration type
useClipboard = false; # sets WA_USE_CLIPBOARD
autoStartDaemon = true; # Start daemon on login
autoStartTray = true; # Start tray on login
};| Variable | Description | Default |
|---|---|---|
WA_WHISPER_MODEL |
Model to use | base.en |
WA_WHISPER_BACKEND |
Backend (whisper-cpp or faster-whisper) |
faster-whisper |
WA_USE_CLIPBOARD |
Output mode (true/false) |
false |
RUST_LOG |
Log level (warn, info, debug, trace) |
warn |
WHISPER_VAD |
Enable VAD filter (true/false) |
true |
Enable verbose logging to diagnose issues:
RUST_LOG=debug whisp-away start
RUST_LOG=debug whisp-away stopThe VAD (Voice Activity Detection) filter may be too aggressive. Try:
-
Check your microphone - Record and play back to verify:
pw-record /tmp/test.wav # Speak for a few seconds, then Ctrl+C pw-play /tmp/test.wav -
Check the right input device is selected using
pavucontrolor your desktop audio settings -
Disable VAD temporarily to test:
WHISPER_VAD=false whisp-away daemon
- Ensure you have a system tray (GNOME needs an extension like AppIndicator)
- Check if the app is running:
ps aux | grep whisp-away - Try starting manually:
whisp-away tray
- Use a smaller model (
tiny.enorbase.en) - Enable GPU acceleration if available
- Use daemon mode (
autoStartDaemon = true) to keep the model preloaded
- Check the notification for errors
- For typing mode (Wayland): Verify
wtypeis installed - For typing mode (X11): Verify
xdotoolis installed - For clipboard mode: Verify
wl-copy(Wayland) orxclip(X11) - Try toggling output mode:
whisp-away stop --clipboard true
- Ensure PipeWire is running:
systemctl --user status pipewire - Check audio permissions and that your user is in the
audiogroup - Test recording directly:
pw-record --channels 1 --rate 16000 /tmp/test.wav
nix build # Build with default settings
nix develop # Enter development shellcargo build --release --features vulkanInstall pre-push hooks to catch dependency hash mismatches before pushing:
./scripts/setup-git-hooks.shThe whisper-rs dependency is pinned to a specific commit in Cargo.toml for reproducible builds.
To update to a newer version:
# 1. Find the latest commit from the whisp-away branch
git ls-remote https://codeberg.org/madjinn/whisper-rs.git whisp-away
# 2. Update the rev in Cargo.toml to the new commit hash
# 3. Update Cargo.lock
cargo update -p whisper-rs
# 4. Update Nix hashes
./scripts/update-git-deps.sh
# 5. Commit all changes
git add Cargo.toml Cargo.lock git-deps.nix
git commit -m "chore: update whisper-rs to <new-commit>"The pre-push hook will verify hashes are correct before pushing.
nothing yet
This project is actively maintained and primarily tested on NixOS. Contributions are welcome!
MIT License
- OpenAI Whisper - Original speech recognition models
- whisper.cpp - C++ implementation
- faster-whisper - CTranslate2 optimized implementation
- whisper-rs - Rust bindings
- madjinn's implementation - original implementation, this repo is a fork of
madjinn'simplementation.