Jump to content

Talon Voice Control

From Archive
Revision as of 15:41, 19 February 2026 by Claude (talk | contribs) (Create Talon voice control documentation with GitHub links)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Talon Voice Control Setup

Custom voice control configuration for macOS using Talon.

Source code: github.com/ejfox/dotfiles/talon-overrides

Overview

Voice-driven workflow for terminal (Ghostty + tmux), macOS app switching, and window management. All config lives in ~/.dotfiles/talon-overrides/ (symlinked to ~/.talon/user/ejfox-overrides/).

The TTS feedback script (claude-say) lives at github.com/ejfox/dotfiles/bin/claude-say and the symlink setup is in sync-dotfiles.sh.

Architecture

  • Community scripts: ~/.talon/user/community/ (talonhub/community clone)
  • Custom overrides: ~/.talon/user/ejfox-overrides/ (dotfiles-tracked)
  • Speech engine: Conformer (Talon's built-in, downloaded via Talon menu)

Files

File Purpose Source
settings.talon Global settings (tmux prefix, subtitle config) github
custom_keys.talon Mode switching (cmd/talk) and Enter aliases github
tmux.talon ~30 tmux voice commands (windows, panes, sessions) github
terminal_commands.talon Ghostty-specific: line editing, nav, git, launchers github
macos_nav.talon App switching, Rectangle Pro, Spaces, general macOS github
ghostty.talon Ghostty terminal detection (too new for community) github
cursor.talon Cursor IDE detection github
apps.py App definitions for newer apps not in community github
nato_alphabet.py NATO phonetic alphabet override (Python Context) github
mode_line.py 2px colored bar at screen bottom showing current mode github
ejfox_subtitles.py Right-aligned subtitles below sketchybar github
vocabulary.talon-list ~250 custom vocabulary terms github

Key Design Decisions

NATO Alphabet via Python Override

The community .talon-list file takes priority over user overrides. The only reliable way to replace the letter list is a Python Context override.

tmux Prefix Timing

tmux needs sleep(100ms) between the prefix key and the command key. Without it, the command fires before tmux registers the prefix.

Anchored Rules for Dictation Mode

Commands must use ^...$ anchors to work in dictation mode. Without anchors, the prose capture engine swallows the command and types it as text.

Custom Subtitles

Community subtitles plugin is center-aligned with no horizontal position setting. Custom ejfox_subtitles.py renders right-aligned text below sketchybar (38px from top).

Mode Line

2px colored line at screen bottom replacing default circle indicator:

  • Pink (#e60067): Command mode
  • Teal (#6eedf7): Dictation mode
  • Muted (#735865): Sleep mode

Voice Command Reference

Mode Switching

Say Does
cmd Switch to command mode
talk Switch to dictation mode
go ahead / send it Press Enter

tmux Windows

Say Does
mux one thru mux nine Jump to window N
mux next / mux previous Next/prev window
mux last Last used window
mux new New window
mux rename Rename window
mux close Close window
mux alert / mux newest Jump to window with bell

tmux Panes

Say Does
mux left/right/up/down Navigate panes
mux next pane Cycle panes
mux split right/down Split pane
mux pane right/down/left/up Split + auto-focus new pane
mux close pane Close current pane
mux zoom Toggle pane fullscreen
mux sessions Session picker
mux scroll Enter scroll mode

Window Management (Rectangle Pro)

Say Does
snap left / snap right Half screen
snap full / snap up Fullscreen
snap down Bottom half
window bigger / window smaller Resize
window grid Grid overlay (F1)

App Switching

open ghosty, open chrome, open safari, open slack, open discord, open signal, open messages, open obsidian, open claude, open figma, open finder, open music, open OBS

Terminal (Ghostty)

Say Does
wipe Clear line (ctrl-u)
wipe word Delete last word
cancel / nope / bail Ctrl-C
again Re-run last command
edit Open nvim
lazy Open lazygit
files Open yazi
go home/code/smallweb/clients Navigate directories
go subway/newswell/gem/paperclip Project shortcuts
git status/push/pull/log/diff Git commands
dev server / install npm run dev / npm install
run claude Launch Claude Code
connect VPS SSH to VPS

claude-say (TTS)

Script at ~/bin/claude-say lets Claude Code speak responses aloud:

  • Mutes mic input before speaking (prevents Talon feedback loop)
  • Restores mic volume after speaking
  • Prefixes with tmux window number for voice navigation
  • Uses macOS say -v Samantha

Lessons Learned

  1. .talon-list overrides don't reliably replace community lists — use Python Context overrides
  2. Ghostty is too new for community scripts — need custom app detection
  3. sleep(100ms) between tmux prefix and command key is essential
  4. ^...$ anchors required for commands to work in dictation mode
  5. Built-in Talon subtitle controlled by speech._subtitles setting (undocumented)
  6. Community subtitles are a separate plugin with their own settings
  7. macOS say triggers Talon — must mute mic first via claude-say wrapper

See Also

  • Dotfiles — full dotfiles setup
  • CLI — terminal workflow
  • Nvim — editor configuration
  • tmux — multiplexer setup