voice
Voice
Speak text aloud and transcribe speech with local and cloud providers.
Usage
/voice command loop
/voice What should we work on next?
Optional inline config:
/voice stt=local tts=local duration=8 What should we work on next?/voice stt=elevenlabs tts=elevenlabs duration=10 Ready when you are.
Local TTS (macOS say)
uv run ~/.claude/skills/voice/scripts/tts_local.py --text "Hello Michael"
Examples:
# Save audio to file
uv run ~/.claude/skills/voice/scripts/tts_local.py \
--text "Build succeeded" \
--voice Alex \
--rate 200 \
--output /tmp/build.aiff
# List macOS voices
uv run ~/.claude/skills/voice/scripts/tts_local.py --list-voices
Local STT (mlx-whisper, Apple Silicon)
# Record microphone for 5 seconds and transcribe
uv run ~/.claude/skills/voice/scripts/stt_local.py --duration 5
# Transcribe an existing file
uv run ~/.claude/skills/voice/scripts/stt_local.py --file ./meeting.wav
# List input devices
uv run ~/.claude/skills/voice/scripts/stt_local.py --list-devices
# Use a specific device
uv run ~/.claude/skills/voice/scripts/stt_local.py --duration 5 --device 1
ElevenLabs TTS (cloud)
uv run ~/.claude/skills/voice/scripts/tts_elevenlabs.py \
--text "Hello Michael" \
--voice George
Examples:
# Save and play the generated mp3
uv run ~/.claude/skills/voice/scripts/tts_elevenlabs.py \
--text "Deployment complete" \
--model eleven_turbo_v2_5 \
--output /tmp/deploy.mp3 \
--play
ElevenLabs STT (Scribe v2)
# Record microphone for 5 seconds and transcribe
uv run ~/.claude/skills/voice/scripts/stt_elevenlabs.py --duration 5
# Transcribe an existing audio file
uv run ~/.claude/skills/voice/scripts/stt_elevenlabs.py --file ./call.wav
# List input devices
uv run ~/.claude/skills/voice/scripts/stt_elevenlabs.py --list-devices
# Use a specific device
uv run ~/.claude/skills/voice/scripts/stt_elevenlabs.py --duration 5 --device 1
Provider checks
uv run ~/.claude/skills/voice/scripts/tts_local.py --check
uv run ~/.claude/skills/voice/scripts/stt_local.py --check
uv run ~/.claude/skills/voice/scripts/tts_elevenlabs.py --check
uv run ~/.claude/skills/voice/scripts/stt_elevenlabs.py --check
Provider Comparison
| Provider | Mode | Latency | Quality | Cost |
|---|---|---|---|---|
tts_local.py |
Local | Low | Good | Free |
stt_local.py |
Local | Medium (first run downloads model) | Good | Free |
tts_elevenlabs.py |
Cloud | Very low with flash model | Very high | Paid API |
stt_elevenlabs.py |
Cloud | Low | Very high | Paid API |
Environment Variables
| Variable | Required | Used by |
|---|---|---|
ELEVENLABS_API_KEY |
Yes (cloud only) | tts_elevenlabs.py, stt_elevenlabs.py |
ELEVEN_LABS_API_KEY |
Accepted alias | tts_elevenlabs.py, stt_elevenlabs.py |
Set via ~/.env or shell export.
Troubleshooting
Getting an ElevenLabs API key
- Open https://elevenlabs.io/app/settings/api-keys
- Create a key
- Export it:
export ELEVENLABS_API_KEY=your-key-here
macOS microphone permissions
If transcription fails with permission errors:
- Open
System Settings -> Privacy & Security -> Microphone - Allow Terminal (or your Claude host app)
- Re-run the command
Common issues
say: command not found: install or restore macOS command line toolsmlx-whisper import error: run command viauv runso dependencies installAPI key invalid: regenerate key and ensure no whitespace
Self-Validation
Run fast provider checks:
uv run ~/.claude/skills/voice/tests/test_voice.py
Run file-based ask/listen/respond loop (no microphone required):
uv run ~/.claude/skills/voice/tests/test_voice_loop.py
Include cloud loop validation (requires ElevenLabs key):
uv run ~/.claude/skills/voice/tests/test_voice_loop.py --cloud
Fixture files for loop validation:
tests/fixtures/loop_prompt.txttests/fixtures/expected_keyword.txt
References
- Architecture & research: See references/architecture.md — three-tier design, ElevenLabs API details, Claude Code background communication research, CLI programmatic modes
- Voice bridge backlog: See
backlog/voice-bridge-plan.md— standalone process for continuous voice conversation with self-eval loop
More from fairchild/dotclaude
backlog
Capture explored work as a backlog item for future implementation. Use when you've explored an enhancement, alternative approach, or feature but decided to defer it. Creates comprehensive plan files in backlog/ directory with enough context for a future session to execute efficiently.
20frontend-design
Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.
1session-titles
Session title generation, evaluation, and optimization. Auto-generates context-aware titles via Stop hook. Includes quality evaluation (pattern checks, LLM judge), GEPA-inspired prompt evolution, golden dataset tooling, and interactive title rating for training data collection.
1status-line-live
Customize or troubleshoot the live status line. Use when modifying statusline.sh, debugging token display, or understanding the rendering pipeline. The status line runs passively -- this skill is for working on it, not using it.
1team-memory
Persistent AI teammate memory framework. Gives Claude Code agents persistent memory, evolving personality, and teammate-like behavior across sessions. Use when setting up personality.md injection, durable memory blocks in ~/.ai-memory, session start/end memory workflows, journal/remember/consolidate scripts, or packaging a distributable memory skill profile.
1chronicle
Capture and curate session memory blocks. Use /chronicle to save current work, /chronicle catchup to restore context, /chronicle curate to organize memory, /chronicle insights for deep analysis, /chronicle summarize for AI summaries, /chronicle pending for open threads, /chronicle search to find sessions, /chronicle publish for digests, /chronicle ui for dashboard with repo-level views and usage stats.
1