Bidirectional voice: continuous listening + TTS output as first-class session features

Resolved 💬 9 comments Opened Apr 1, 2026 by Quillrun Closed May 16, 2026

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:

  • /voice requires 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-json for 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)

  1. Continuous listening mode/voice continuous that listens ongoing with VAD silence detection, no spacebar required. The STT infrastructure already exists.
  1. Session message channel — a Unix socket, named pipe, or file-watch mechanism per session that accepts stream-json user 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.
  1. TTS output hook event — a PostResponse or AssistantMessage hook event containing the response text. #36029 works around this with PreToolUse + Stop, but a dedicated event would be cleaner and capture streaming chunks.

Prior art

  • #36029 — Community TTS via hooks (works but limited to PreToolUse/Stop timing)
  • #34656 — Semantic voice/text channel separation (great UX idea, complementary)
  • #35392 — --voice CLI 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.

View original on GitHub ↗

This issue has 9 comments on GitHub. Read the full discussion on GitHub ↗