Skip to main content
This page will cover voice input and output. Voice brackets the turn rather than changing it: speech-to-text feeds the same message-building path as typed input, and text-to-speech reads back the reply after the output guard has run, so a guardrail refusal is spoken too rather than silently dropped. Push-to-talk is bound to F11, started with the --voice flag, or toggled with the /voice command. Backends are pluggable on both sides. Locally, faster-whisper handles STT and Piper handles TTS; install them with uv sync --group voice-local. Cloud backends cover OpenAI, Deepgram, and ElevenLabs, and policy files name the environment variable holding an API key, never the key itself. The page will cover voice_policy.yaml in full. It is off by default, and the presence of the file does not enable it, so you must set enabled: true and install your chosen backends. Settings include per-direction backend and model selection, capture settings with a hard cap on one utterance as a runaway-microphone guard, a cap on synthesized text length, and fail_open, which degrades to text with a notice rather than crashing when a backend fails. Voice is interactive only; the headless one-shot path stays text-only.
This page is in progress. The shipped voice_policy.yaml is fully commented and is the best reference until it lands.
See Terminal UI for the push-to-talk binding, Commands for /voice, and Configuration for how voice_policy.yaml resolves.