Skip to content

Release v8.11.0

Choose a tag to compare

@github-actions github-actions released this 10 Jul 11:13

Added

Native Windows support — no WSL required (#232)

  • The MCP server, converse, and the CLI now run natively on Windows 11: portable file
    locking (voice_mode/file_lock.py), safe PID liveness probes via psutil, a dead-stream
    stall backstop in the recording loop, and a Windows-safe VOICEMODE_DEBUG. No behavior
    change on Linux/macOS; works with local or remote OpenAI-compatible STT/TTS endpoints.

Multi-voice sequences and voice surveys — converse grows turns[]

  • Multi-voice turns[] (VM-1772) — one converse call speaks an ordered multi-voice
    script with no synthesis dead-air (turn N+1 synthesizes while N plays). Per-turn voice,
    pause_after_ms (default 150 ms), tts_instructions, speed. CLI: repeatable
    --say 'VOICE:TEXT' or --script FILE|-. The scalar message/voice path is unchanged.
  • Surveys — the ask verb (VM-1775) — a turn can speak a question and collect the
    spoken reply, so a multi-question survey runs in one call. Returns an index-aligned JSON
    survey result, so a partial run still shows exactly which questions were answered; each
    reply is logged the instant it's captured. Full per-turn control-channel support plus
    spoken "repeat" / "wait" / "break". CLI --ask exits 0 on completion, 3 on a partial.
  • "Heard you" cue (VM-1859) — opt-in ack plays a short content-free cue the moment an
    ask turn captures a reply, and stays silent on a timeout — audible contrast between
    captured and missed. Default off; enable per turn, call-wide, or with --ack.
  • Survey conventions (VM-1859) — agents are now instructed to announce the question
    count up front and acknowledge collected answers at the top of the next call.

Control channel — transport buttons for in-flight speech

  • pause / resume / stop (VM-1676) — a local-only socket into the running server lets a
    Stream Deck key, media key, or voicemode control {pause|resume|stop} act on the
    utterance being spoken without going through the agent; a stop returns a clean
    [control: stop] marker so the assistant continues in text. Off by default
    (VOICEMODE_CONTROL_CHANNEL_ENABLED=true). See
    docs/reference/control-channel.md.
  • skip-back (VM-1685) — CD-style replay: first press restarts the current utterance,
    further presses step back through a bounded history buffer
    (VOICEMODE_HISTORY_BUFFER_SIZE, default 8). Replays cached audio only — no new agent
    turn, no STT, no model call. Pause now frees the provider connection (resume plays the
    buffered remainder), and a status query reports now-playing + buffer position.
  • skip-forward (VM-1739, VM-1754) — the universal "move on" button: pressed while the
    assistant speaks, it cuts the utterance and hands you the mic; pressed while you
    speak, it ends the recording immediately and transcribes what was captured — a manual
    end-of-turn and a reliable VAD fallback. Lands in ~200 ms.

Other

  • voicemode reconnect (VM-1727) — heal a dropped voicemode MCP server from a single
    CLI call: drives Claude Code's /mcp reconnect flow on the agent's own tmux pane,
    fails loud rather than sending blind keystrokes, distinct exit codes per outcome.

Changed

  • Media-key Next now barges instead of stopping (VM-1742) — the Hammerspoon binding
    sends skip-forward: cut the assistant and take the mic. Point
    ~/.hammerspoon/init.lua at scripts/hammerspoon/voicemode-media-keys.lua.
  • Previous media key now replays (VM-1919) — the Hammerspoon binding's Previous
    handler is wired to voicemode control skip-back (it was a notice-only stub pending
    VM-1685): first press restarts the current utterance, further presses step back.
  • Held pause self-heals after 5 minutes, not 30 seconds (VM-1853)
    pause-and-walk-away now survives; tune with VOICEMODE_CONTROL_PAUSE_TIMEOUT.

Security

  • Control channel hardened following adversarial review (VM-1688) — named intents
    replace free-form agent-facing text; peer-credential authentication with a 0700
    socket directory; bounded input; never-resumed pause self-heals; stale-socket cleanup
    refuses files it doesn't own; handler threads and connection lifetime capped. Docs
    Security section rewritten to the real threat model.

Fixed

  • STT exchange-log records now carry audio_file, matching TTS (VM-4) — the saved
    recording's filename was computed but dropped before logging, so no STT record named
    its audio (0 of ~11k on a long-lived install). The log→audio join is now an exact
    match for both directions; no schema change.
  • Mixed-provider TTS failover resolves the model per endpoint (VM-1390)
    kokoro-fastapi/OpenAI get tts-1, mlx-audio gets mlx-community/Kokoro-82M-bf16, so
    failover in a mixed chain speaks instead of hanging. Per-provider override:
    VOICEMODE_TTS_MODELS_<PROVIDER>.
  • Local Whisper STT retries transient failures (VM-926) — timeouts / connection errors
    / 5xx retry with short backoff instead of losing the turn
    (VOICEMODE_STT_RETRY_ATTEMPTS, default 2); permanent errors still fail fast.
  • voicemode service install names the missing dependencies (VM-1718, #303) — prints
    each missing package with its install command instead of a generic failure.
  • Sony WH/WF-series headphones get full Bluetooth chime amplitude (VM-1883, #496)
    bare WH-/WF- model names are now detected as Bluetooth. Thanks @blakechasteen.

Installation

Quick Start (Recommended)

# Install UV package manager (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh

# Install VoiceMode and configure services
uvx voice-mode-install

# Add to Claude Code MCP
claude mcp add --scope user voicemode -- uvx --refresh voice-mode

Alternative: Direct Installation

# With UV
uv tool install voice-mode

# With pip
pip install voice-mode==8.11.0

For detailed documentation, visit https://getvoicemode.com