Bidirectional voice: continuous listening + TTS output as first-class session features
Problem
Claude Code has /voice for speech-to-text input (push-to-talk) but no voice output. The community has built TTS via hooks (#36029) and proposed smart voice routing (#34656).
What's still missing is a continuous listening mode and a clean external input channel. Currently:
/voicerequires holding spacebar per utterance — not hands-free- Hooks can speak responses (
PreToolUse,Stop) but can't accept incoming messages - External tools can use
claude -p --input-format stream-jsonfor programmatic I/O, but this creates a separate headless session — it can't overlay onto a running TUI session - There's no way for an external process to inject a user message into a running interactive session
Who this affects
- Users with vision or motor disabilities who need hands-free interaction
- Developers doing architecture/planning work where conversation is more natural than typing
- Anyone using Claude Code while their hands are occupied (soldering, whiteboarding, etc.)
What would help (in order of impact)
- Continuous listening mode —
/voice continuousthat listens ongoing with VAD silence detection, no spacebar required. The STT infrastructure already exists.
- Session message channel — a Unix socket, named pipe, or file-watch mechanism per session that accepts
stream-jsonuser messages from external processes. The TUI would render injected messages as if typed. This enables external voice bridges, accessibility tools, and automation without process hacks.
- TTS output hook event — a
PostResponseorAssistantMessagehook event containing the response text. #36029 works around this withPreToolUse+Stop, but a dedicated event would be cleaner and capture streaming chunks.
Prior art
- #36029 — Community TTS via hooks (works but limited to
PreToolUse/Stoptiming) - #34656 — Semantic voice/text channel separation (great UX idea, complementary)
- #35392 —
--voiceCLI flag (input only) - VoiceMode MCP (getvoicemode.com) — external tool, requires separate MCP server
What I've built
A working voice bridge prototype using claude -p --input-format stream-json with local Whisper STT and Kokoro TTS. It works well as a standalone Claude Code replacement but can't overlay onto the TUI. The session IPC channel (item 2) is the gap that would make this seamless.
Happy to contribute implementation work if any of these directions align with the roadmap.
Filed by @ahuzmeza (operator) via @Quill-AI-Assistant's development environment. Reviewed and approved by a human.
This issue has 9 comments on GitHub. Read the full discussion on GitHub ↗