Hold a key, speak, release. Transcribes locally with Whisper and pastes into the focused field.
What it does:
- Watches a hold-to-talk key (default: Right Ctrl)
- Records audio while the key is held
- Transcribes locally with Whisper.cpp
- Pastes into the active app
Must have:
- Rust 1.75+ (2024 edition)
alsa-utils(providesarecord)- Access to
/dev/input/event*(add user toinputgroup)
Paste tool (one required):
- X11:
xdotool+xclip - Wayland:
ydotool+wl-clipboard(works on all compositors including KDE) - Wayland (alternative):
wtype+wl-clipboard(for compositors with virtual keyboard support)
Optional:
- Qt6 system tray integration packages (usually installed with
qt6-base+qt6-declarative)
Fedora:
sudo dnf install -y rust cargo alsa-utils qt6-qtbase-devel qt6-qtdeclarative-devel \
wl-clipboard ydotool xdotool xclip curlUbuntu/Debian:
sudo apt install -y cargo rustc alsa-utils qt6-base-dev qt6-declarative-dev \
wl-clipboard ydotool xdotool xclip curlArch (manual dependencies):
sudo pacman -S --needed base-devel git rust alsa-utils \
qt6-base qt6-declarative qt6-tools \
wl-clipboard ydotool wtype xdotool xclip curlThis repository includes a PKGBUILD, so you can emulate the AUR user flow directly:
git clone https://github.com/SomewhatJustin/escucha.git
cd escucha
makepkg -simakepkg -si means:
-s: install missing dependencies from repos-i: install the package after build
After install:
- Launch tray app:
escucha --gui - KRunner launcher:
Escucha - First launch now performs setup checks (permissions + ydotoold) and enables GUI autostart
git clone https://github.com/somewhatjustin/escucha.git
cd escucha
./install.shThe installer will:
- Check for and install missing dependencies (
ydotool,wl-clipboard,alsa-utils, etc.) - Start the
ydotoolddaemon (required for ydotool) - Build the release binary
- Install to
~/.local/bin/escucha - Install systemd services (escucha + ydotoold)
- Optionally add you to the
inputgroup
cargo build --release
make installThe app needs access to /dev/input/event* devices. Add your user to the input group:
sudo usermod -aG input $USERThen log out and back in (or use the tray app's "Fix Input Permissions" action to auto-restart).
Before running, verify your system is configured correctly:
escucha --checkThis validates input device access, arecord, paste tools, and directories.
For automation and CI-style debugging loops:
escucha --diagnosePrints a structured JSON report and exits 0/1.
Runs a non-interactive startup/audio smoke test and prints JSON:
escucha --smoke-testThis is intended for repeatable machine-driven iteration (run, parse, patch, rerun).
escuchaRuns in the background. Hold Right Ctrl and speak to transcribe.
escucha --guiRuns as a system tray app and shows status/error notifications.
On first launch, Escucha will attempt to enable start-on-login by writing
~/.config/autostart/io.github.escucha.desktop.
escucha --list-devicesConfig file: ~/.config/escucha/config.ini
[escucha]
key = KEY_RIGHTCTRL
keyboard_device = auto
model = base.en
language = en
paste_method = auto
paste_hotkey = ctrl+v
clipboard_paste = auto
clipboard_paste_delay_ms = 75
log_file = ~/.local/state/escucha/escucha.log
log_level = infoOptions:
key: Linux input key name (e.g.,KEY_RIGHTCTRL,KEY_FN,KEY_CAPSLOCK)keyboard_device:autoor specific/dev/input/eventXmodel: Whisper model name (tiny.en,base.en,small.en,medium.en,large)language: Language code (en,es,fr,de, etc.)paste_method:auto,xdotool,ydotool,wtype, orwl-copypaste_hotkey: Keyboard shortcut for clipboard paste (ctrl+v,ctrl+shift+v)clipboard_paste:auto,on, oroff(auto uses clipboard on Wayland)clipboard_paste_delay_ms: Delay between clipboard copy and paste simulationlog_level:debug,info,warn,error
Common dictation keys:
KEY_RIGHTCTRL/KEY_LEFTCTRLKEY_RIGHTALT/KEY_LEFTALTKEY_CAPSLOCKKEY_FN(if your keyboard emits it)KEY_F13throughKEY_F24KEY_PAUSE,KEY_SCROLLLOCK,KEY_INSERT
Use escucha --list-devices to see your keyboard and confirm detected device names.
Models are automatically downloaded on first run to ~/.local/share/escucha/models/.
Model sizes:
tiny.en: ~75 MB, fastest, least accuratebase.en: ~142 MB, good balance (default)small.en: ~466 MB, better accuracymedium.en: ~1.5 GB, high accuracylarge: ~3 GB, best accuracy, multilingual
English-only models (*.en) are faster and more accurate for English.
ydotool daemon: The ydotool paste method requires the ydotoold daemon to be running. The installer automatically sets this up as a systemd user service.
If you installed manually, start it with:
systemctl --user enable --now ydotoold.serviceOr run it manually:
ydotoold &For compositors without virtual keyboard support (KDE, GNOME): The app uses ydotool which works universally via /dev/uinput.
For compositors with virtual keyboard support (Sway, Hyprland): Both wtype and ydotool work.
"Setup required: input devices"
- Add user to input group:
sudo usermod -aG input $USER - Log out and back in
- Or use the tray app's "Fix Input Permissions" action
"arecord not found"
- Install
alsa-utils:sudo dnf install alsa-utils
"No paste tool found"
- X11: Install
xdotoolandxclip - Wayland (KDE/most compositors): Install
ydotoolandwl-clipboard - Wayland (Sway/Hyprland): Install
wtypeandwl-clipboard
"ydotoold failed to open uinput"
- Use tray action:
Fix Paste Setup(recommended) - Or manually: ensure
/dev/uinputis writable by groupinputand restart the service:systemctl --user enable --now ydotoold.service
Key not detected
- Run
escucha --list-devicesto verify input access - Use
escucha --list-devicesand set a known key likeKEY_RIGHTCTRLin config - Some keyboards don't emit
KEY_FN- useKEY_RIGHTCTRLor a function key
Paste fails
- X11: Check that
xdotoolandxclipwork:echo "test" | xclip -selection clipboard && xdotool key ctrl+v - Wayland (ydotool): Check that
ydotoolandwl-copywork:echo "test" | wl-copy && ydotool key 29:47 - Wayland (wtype): Check that
wtypeandwl-copywork:echo "test" | wl-copy && wtype -M ctrl -k v -m ctrl - Try increasing
clipboard_paste_delay_msin config
Model download fails
- Check internet connection
- Verify
curlis installed - Models are fetched from huggingface.co
# Build
cargo build
# Run tests
cargo test
# Run clippy
cargo clippy -- -D warnings
# Run with logging
RUST_LOG=debug cargo run -- --gui
# Check environment
cargo run -- --check
# Structured diagnostics JSON
cargo run -- --diagnose
# Headless smoke test JSON
cargo run -- --smoke-test
# One-command closed loop
./scripts/diagnostics-loop.shWhen preparing an AUR update:
# after updating PKGBUILD values (pkgver/pkgrel/source/checksums)
makepkg --printsrcinfo > .SRCINFOAUR submission itself uses a separate AUR git repo containing PKGBUILD and .SRCINFO.
MIT