voice-mode

v2026.09.24

Talk to Claude by voice. Records the mic, transcribes with ElevenLabs Scribe (hosted STT, no local Whisper), sends the text to Claude via the local `claude` CLI, and speaks the reply back with ElevenLabs TTS. Use when the user wants a spoken/voice conversation, voice input, or to dictate to Claude.

GitHub
安装命令
npx skhub add idanbeck/voice-mode
Markdown
SKILL.md

Voice Mode

A hands-free voice loop for Claude:

mic → ElevenLabs Scribe (STT) → Claude (local `claude` CLI) → ElevenLabs (TTS) → speaker

Why not Whisper / "use Claude to transcribe"? Claude has no audio input — it can't transcribe. So a fast hosted speech model (ElevenLabs Scribe) does the STT, and Claude is the brain in the middle. This avoids running Whisper locally (slower, heavier).

Auth (no new credentials)

Reuses the ElevenLabs API key already set for eleven-labs-skill (~/.claude/skills/eleven-labs-skill/config.json, or ELEVENLABS_API_KEY). The brain uses your existing Claude Code login via the claude CLI — no API key needed.

One-time setup

pip3 install -r ~/.claude/skills/voice-mode/requirements.txt   # sounddevice, numpy, requests
python3 ~/.claude/skills/voice-mode/voice_mode.py setup        # verifies ElevenLabs + claude CLI

macOS will prompt for microphone permission the first time the terminal records. The sounddevice wheel bundles PortAudio — no brew install needed.

Use

# Continuous conversation (default). Speak, pause, hear the reply. Say "goodbye" or Ctrl-C to stop.
python3 ~/.claude/skills/voice-mode/voice_mode.py converse

# One turn: record → answer → speak
python3 ~/.claude/skills/voice-mode/voice_mode.py once

# Utilities
python3 ~/.claude/skills/voice-mode/voice_mode.py listen        # record → {"text": ...}
python3 ~/.claude/skills/voice-mode/voice_mode.py say "hello"   # TTS only
python3 ~/.claude/skills/voice-mode/voice_mode.py stt clip.wav  # transcribe a file
python3 ~/.claude/skills/voice-mode/voice_mode.py mics          # list input devices

It auto-detects when you stop talking (silence-based cutoff), so there's no push-to-talk.

Config (config.json)

keydefaultnotes
voice_id21m00Tcm4TlvDq8ikWAMElevenLabs voice (Rachel, a standard voice)
stt_modelscribe_v1ElevenLabs Scribe
tts_modeleleven_turbo_v2_5low-latency; use eleven_flash_v2_5 for min latency
brainclaudeclaude (Claude Code CLI) or codex
silence_secs1.2trailing silence that ends an utterance
max_utterance_secs30hard cap per turn

Change the voice: voice_mode.py setup --voice-id <ID> --voice-name "<name>" (browse voices with the eleven-labs-skill). Idan already has a personal voice clone from the digital-twin skill — pass its voice id here to have Claude reply in his voice.

Switch the brain to Codex: voice_mode.py setup --brain codex.

Notes / gotchas

  • Replies are constrained by a system prompt to be short and TTS-friendly (no markdown/lists).
  • Each turn sends the running transcript to claude -p (fresh context per call — avoids the --continue staleness issue), keeping the last ~6 exchanges.
  • STT and TTS are hosted calls (billed to your ElevenLabs account); latency is network-bound, typically a second or two per leg — far faster than local Whisper on this machine.
发现
标签

此技能尚未发布标签。

版本
最新版本元数据

版本

v2026.09.24

发布时间

2026年9月24日

分类

未分类

许可证

未指定

源路径

voice-mode

默认分支

main

最新提交

37ba03e

Tree SHA

265ac91