Natural voice conversations with Claude Code
SaferSkills independently audited voicemode (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
If VoiceMode isn't working or MCP fails to connect, run:
/voicemode:installAfter install, reconnect MCP: /mcp → select voicemode → "Reconnect" (or restart Claude Code).
If Claude Code prompts you for permission on voicemode:converse or voicemode:service, see references/permissions.md for the one-time allow-list setup.
Natural voice conversations with Claude Code using speech-to-text (STT) and text-to-speech (TTS).
Note: The Python package is voice-mode (hyphen), but the CLI command is voicemode (no hyphen).
| Task | Use | Why |
|---|---|---|
| Voice conversations | MCP voicemode:converse | Faster - server already running |
| Service start/stop | MCP voicemode:service | Works within Claude Code |
| Installation | CLI voice-mode-install | One-time setup |
| Configuration | CLI voicemode config | Edit settings directly |
| Diagnostics | CLI voicemode diag | Administrative tasks |
Use the converse MCP tool to speak to users and hear their responses:
# Speak and listen for response (most common usage)
voicemode:converse("Hello! What would you like to work on?")
# Speak without waiting (for narration while working)
voicemode:converse("Searching the codebase now...", wait_for_response=False)For most conversations, just pass your message - defaults handle everything else. Use default converse tool parameters unless there's a good reason not to. Timing parameters (listen_duration_max, listen_duration_min) use smart defaults with silence detection - don't override unless the user requests it or you see a clear need. Defaults are configurable by the user via ~/.voicemode/voicemode.env.
| Parameter | Default | Description |
|---|---|---|
message | required | Text to speak |
wait_for_response | true | Listen after speaking |
voice | auto | TTS voice -- must be lowercase (e.g. af_river, not AF_River) |
Voice name rule: If you specify a voice, it MUST be lowercase with underscores. Kokoro rejects capitalized names like AF_River with a 400 error. Valid examples: af_river, af_sky, bm_daniel, bf_emma. The prefix encodes language+gender: af_ = American female, am_ = American male, bf_ = British female, bm_ = British male.
When in doubt, omit voice entirely -- auto-select picks a working default.
Voice discovery for apps and agents: read the voice://voices MCP resource for a structured JSON list of available voices (with voice://voices/{provider} for per-backend filtering). The voice_registry tool returns the same data as prose for the LLM mid-conversation. Both share the underlying enumerator so they never drift. See voices resource reference.
Persona discovery: voice IDs from voice://voices map to character profiles on disk at ~/.voicemode/voices/<name>/README.md (grouped voices: <group>/<name>/README.md; index at ~/.voicemode/voices/PERSONAS.md). Read that README before speaking in character — who they are, how they speak, sample lines. Not every voice has one yet; fall back to the bare voice if absent.
For all parameters, see Converse Parameters.
wait_for_response=False when announcing actionsSome hosts (e.g. newer Claude Code) collapse MCP tool calls — voice turns vanish from the visible transcript. Unless requested otherwise, default to voicemode echo: print each voicemode:converse exchange as Markdown blockquotes so it stays readable on screen.
> **ASSISTANT (voicemode):** <message arg passed to converse>
[voicemode:converse tool call]
> **USER (voicemode):** <captured user message>(voicemode) is the channel tag.voicemode:converse tool call, in the same response that issues it — so the user can read along while the audio plays (and recover the message if they miss part of it). Write the USER blockquote in your next response, after the tool result returns. Don't batch both echoes after the call.wait_for_response=false (speak-only narration still produces visible content that would otherwise vanish).wait_for_response=false, empty result, or transcription failure — there is nothing to echo).message, not paraphrased or reformatted. Reasons: least-surprising for the reader + diagnostic value when comparing printed text to spoken audio.Eliminate dead air by sending voice and action calls in the same response:
# FAST: speak + act in parallel (all fire concurrently)
voicemode:converse("Checking that now.", wait_for_response=False)
Bash("git status")
Agent(prompt="Research X", run_in_background=True)
# SLOW: sequential — unnecessary delay between speech and action
voicemode:converse("Checking that now.", wait_for_response=False)
# ... waits for TTS to finish ...
Bash("git status")Then report results in the next response:
voicemode:converse("Here's what I found: ...", wait_for_response=True)| Scenario | Approach | Why |
|---|---|---|
| Announce + do work | Parallel | No dependency between speech and action |
| Announce + spawn agent | Parallel | Agent runs in background anyway |
| Check result then report | Sequential | Need result before speaking |
| Listen for response | Sequential | wait_for_response=True blocks until user speaks |
Key insight: Wall-clock time = longest call, not the sum. All tool types (MCP, Bash, Agent, Read) can be mixed in one response.
When the user asks you to wait or give them time:
Short pauses (up to 60 seconds): If the user says something ending with "wait" (e.g., "hang on", "give me a sec", "wait"), VoiceMode automatically pauses for 60 seconds then resumes listening. This is built-in.
Longer pauses (2+ minutes): Use bash sleep N where N is seconds. For example, if the user says "give me 5 minutes":
sleep 300 # Wait 5 minutesThen call converse again when the wait is over:
voicemode:converse("Five minutes is up. Ready when you are.")Configuration: The short pause duration is configurable via VOICEMODE_WAIT_DURATION (default: 60 seconds).
If Whisper STT fails but the audio was recorded successfully, you can manually transcribe the saved audio file:
# Transcribe the most recent recording
whisper-cli ~/.voicemode/audio/latest-STT.wav
# Or check if file exists first (safe for inclusion in automation)
if [ -f ~/.voicemode/audio/latest-STT.wav ]; then
whisper-cli ~/.voicemode/audio/latest-STT.wav
fiRequirements:
VOICEMODE_SAVE_AUDIO=true in ~/.voicemode/voicemode.envVOICEMODE_SAVE_ALL=true (saves all audio and transcriptions)VOICEMODE_DEBUG=true (enables debug mode with audio saving)How it works:
~/.voicemode/audio/ with timestampslatest-STT.wav symlink always points to the most recent recordingWhen to use:
See also: Troubleshooting - No Speech Detected
voicemode service status # All services
voicemode service status whisper # Specific serviceShows service status including running state, ports, and health.
# Install VoiceMode CLI and configure services
uvx voice-mode-install --yes
# Install local services (Apple Silicon recommended)
voicemode service install whisper
voicemode service install kokoroSee Getting Started for detailed steps.
# Start/stop services
voicemode:service("whisper", "start")
voicemode:service("kokoro", "start")
# View logs for troubleshooting
voicemode:service("whisper", "logs", lines=50)| Service | Port | Purpose |
|---|---|---|
| whisper | 2022 | Speech-to-text |
| kokoro | 8880 | Text-to-speech |
| voicemode | 8765 | HTTP/SSE server |
Actions: status, start, stop, restart, logs, enable, disable
voicemode config list # Show all settings
voicemode config set VOICEMODE_TTS_VOICE nova # Set default voice
voicemode config edit # Edit config fileConfig file: ~/.voicemode/voicemode.env
See Configuration Guide for all options.
Background music during VoiceMode sessions with track-level control.
# Core playback
voicemode dj play /path/to/music.mp3 # Play a file or URL
voicemode dj status # What's playing
voicemode dj pause # Pause playback
voicemode dj resume # Resume playback
voicemode dj stop # Stop playback
# Navigation and volume
voicemode dj next # Skip to next chapter
voicemode dj prev # Go to previous chapter
voicemode dj volume 30 # Set volume to 30%
# Music For Programming
voicemode dj mfp list # List available episodes
voicemode dj mfp play 49 # Play episode 49
voicemode dj mfp sync # Convert CUE files to chapters
# Music library
voicemode dj find "daft punk" # Search library
voicemode dj library scan # Index ~/Audio/music
voicemode dj library stats # Show library info
# Play history and favorites
voicemode dj history # Show recent plays
voicemode dj favorite # Toggle favorite on current trackConfiguration: Set VOICEMODE_DJ_VOLUME in ~/.voicemode/voicemode.env to customize startup volume (default: 50%).
# Service management
voicemode service status # All services
voicemode service start whisper # Start a service
voicemode service logs kokoro # View logs
# Diagnostics
voicemode deps # Check dependencies
voicemode diag info # System info
voicemode diag devices # Audio devices
# DJ Mode
voicemode dj play <file|url> # Start playback
voicemode dj status # What's playing
voicemode dj next/prev # Navigate chapters
voicemode dj stop # Stop playback
voicemode dj mfp play 49 # Music For ProgrammingTransfer voice conversations between Claude Code agents for multi-agent workflows.
Use cases:
# 1. Announce the transfer
voicemode:converse("Transferring you to a project agent.", wait_for_response=False)
# 2. Spawn with voice instructions (mechanism depends on your setup)
spawn_agent(path="/path", prompt="Load voicemode skill, use converse to greet user")
# 3. Go quiet - let new agent take overHand-back:
voicemode:converse("Transferring you back to the assistant.", wait_for_response=False)
# Stop conversing, exit or go idleWhen you run multiple voice agents in separate tmux panes, set VOICEMODE_AUTO_FOCUS_PANE=true to make tmux follow the speaker. Focus switches after conch acquisition, so agents waiting on the conch never steal focus -- only the agent about to speak does. It also respects the ~/.voicemode/focus-hold sentinel written by the show-me plugin, so a file you just opened stays on screen for its hold window.
# ~/.voicemode/voicemode.env
VOICEMODE_AUTO_FOCUS_PANE=trueOff by default. Silent no-op outside tmux.
See Call Routing for comprehensive guides:
Expose local Whisper (STT) and Kokoro (TTS) to other devices on your Tailnet via HTTPS.
*.ts.net domains# Expose TTS (Kokoro on port 8880)
tailscale serve --bg --set-path /v1/audio/speech http://localhost:8880/v1/audio/speech
# Expose STT (Whisper on port 2022)
tailscale serve --bg --set-path /v1/audio/transcriptions http://localhost:2022/v1/audio/transcriptions
# Verify configuration
tailscale serve status
# Reset all serve config
tailscale serve resetAfter setup, endpoints are available at:
https://<hostname>.<tailnet>.ts.net/v1/audio/speechhttps://<hostname>.<tailnet>.ts.net/v1/audio/transcriptionshttps://app.voicemode.dev originsIn the VoiceMode Connect web app settings (app.voicemode.dev/settings), set:
https://<hostname>.<tailnet>.ts.nethttps://<hostname>.<tailnet>.ts.netAudio feedback tones that play during Claude Code tool use. Toggle with voicemode soundfonts on/off. See Soundfonts Guide.
When local voice isn't an option -- no mic/speaker on the machine, can't install local services, or want to use a phone -- VoiceMode Connect provides remote voice through a web app or mobile device.
When to suggest Connect:
How it works: Add the VoiceMode MCP server to any Claude product, open app.voicemode.dev on a phone or browser, and talk. No local TTS/STT installation needed -- the client device handles audio.
Setup: See the VoiceMode Connect skill for MCP configuration and getting started.
| Topic | Link |
|---|---|
| Converse Parameters | All Parameters |
| Installation | Getting Started |
| Configuration | Configuration Guide |
| Claude Code Plugin | Plugin Guide |
| Whisper STT | Whisper Setup |
| Kokoro TTS | Kokoro Setup |
| Pronunciation | Pronunciation Guide |
| Troubleshooting | Troubleshooting |
| Soundfonts | Soundfonts Guide |
| CLI Reference | CLI Docs |
| DJ Mode | Background Music |
voice="<name>" with a clip-based custom voice rather than a Kokoro voice.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.