Claude Code Tools

claude-awake-speak

github

让 Claude Code 自动朗读中文回复,使用 Edge TTS 跳过代码和英文,支持多音色、异步播放、零额外 token

Stars
⭐ 0
License
MIT
Last Updated
2026-05-20
Source
github

claude-awake-speak — 让你的 Claude Code 会说话

给 Claude Code 装上嘴巴。每次回复结束后,自动用语音朗读中文内容,告别冷冰冰的纯文字终端。

功能特点

Claude Code 回复完毕后,自动用 微软 Edge TTS 把中文内容读出来。

  • 只读中文,代码块、表格、URL、纯英文全部跳过
  • 超过 300 字自动截断(不然听到天荒地老)
  • 后台异步播放,不阻塞 Claude 的工作流
  • 8 种微软官方音色,实时切换,支持试听
  • 完全免费,不需要 API Key
  • 不消耗额外 token(hook 只读取已生成的回复文本,不触发新的 API 调用)

可选音色

音色 ID中文名性别风格推荐场景
zh-CN-YunjianNeural云健体育解说风默认,热血激情
zh-CN-YunxiNeural云希小说旁白风阳光开朗
zh-CN-YunyangNeural云扬新闻播报风专业稳重
zh-CN-XiaoxiaoNeural晓晓通用女声温暖亲切
zh-CN-XiaoyiNeural晓伊儿童故事风活泼可爱
zh-CN-YunxiaNeural云夏少儿男声可爱少年感
zh-CN-liaoning-XiaobeiNeural晓北辽宁方言搞笑担当
zh-CN-shaanxi-XiaoniNeural晓妮陕西方言地道西北味

安装

1. 安装依赖

pip install edge-tts

2. 复制脚本

tts-speak.py 复制到你的 Claude Code hooks 目录:

# Windows
mkdir %USERPROFILE%\.claude\hooks
copy tts-speak.py %USERPROFILE%\.claude\hooks\tts-speak.py

# macOS/Linux
mkdir -p ~/.claude/hooks
cp tts-speak.py ~/.claude/hooks/tts-speak.py

3. 配置 Hook

编辑 ~/.claude/settings.json,添加 hooks 字段:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "python ~/.claude/hooks/tts-speak.py",
            "timeout": 30,
            "async": true
          }
        ]
      }
    ]
  }
}

Windows 用户:把路径改为 python C:/Users/你的用户名/.claude/hooks/tts-speak.py

4. 复制音色切换工具(可选)

# Windows
copy voice-switch.py %USERPROFILE%\.claude\hooks\voice-switch.py

# macOS/Linux
cp voice-switch.py ~/.claude/hooks/voice-switch.py

5. 重启 Claude Code

退出当前会话,重新打开即可。

配置

切换音色

方法一:命令行工具(推荐)

# 交互式菜单
python ~/.claude/hooks/voice-switch.py

# 直接切换
python ~/.claude/hooks/voice-switch.py set xiaoxiao    # 晓晓·温暖亲切
python ~/.claude/hooks/voice-switch.py set yunxi        # 云希·阳光开朗
python ~/.claude/hooks/voice-switch.py set xiaobei      # 晓北·东北方言

# 试听音色
python ~/.claude/hooks/voice-switch.py preview yunyang   # 试听云扬
python ~/.claude/hooks/voice-switch.py preview xiaoyi    # 试听晓伊

# 列出所有音色
python ~/.claude/hooks/voice-switch.py list

# 查看当前设置
python ~/.claude/hooks/voice-switch.py status

方法二:直接编辑配置文件

配置文件位置:~/.claude/hooks/voice-config.json

{
  "voice": "yunjian",
  "max_chars": 300,
  "enabled": true
}

voice 字段可选值:yunjian / yunxi / yunyang / xiaoxiao / xiaoyi / yunxia / xiaobei / xiaoni

调整最大朗读字数

python ~/.claude/hooks/voice-switch.py chars 500   # 改成500字

或编辑 voice-config.jsonmax_chars 字段。

开关语音

python ~/.claude/hooks/voice-switch.py off    # 关闭
python ~/.claude/hooks/voice-switch.py on     # 开启

或编辑 voice-config.jsonenabled 字段。

工作原理

Claude 回复结束

Stop Hook 触发

tts-speak.py 从 stdin 读取 last_assistant_message

提取中文文本(过滤代码/表格/URL/英文)

edge-tts 生成 mp3 临时文件

系统播放音频(Windows: PowerShell / macOS: afplay / Linux: mpv)

播放完毕,自动删除临时文件

平台支持

平台状态播放方式
Windows已验证PowerShell MediaPlayer(presentationCore)
macOS支持afplay(系统自带)
Linux支持mpv / ffplay / aplay

已知限制

  • edge-tts 需要联网(调用微软 Edge 的在线 TTS 服务)
  • 不支持离线使用
  • 长文本会被截断(默认 300 字)
  • 音色固定为预设,不支持声纹克隆

常见问题

语音会消耗额外的 token 吗?

不会。 Hook 是在 Claude 回复生成完毕后触发的,它只读取已经生成好的 last_assistant_message 文本,不会触发新的 API 调用,不产生任何额外 token 消耗。

为什么听到的是乱码?

大概率是 Windows 编码问题。确保脚本里用了 sys.stdin.buffer.read().decode('utf-8') 而不是 sys.stdin.read()

为什么没有声音?

排查步骤:

  1. pip show edge-tts 确认已安装
  2. edge-tts --voice zh-CN-YunjianNeural --text "测试" --write-media test.mp3 手动生成
  3. 双击 test.mp3 确认有声音
  4. 检查 ~/.claude/settings.json 的 hooks 配置
  5. 重启 Claude Code

开源协议

MIT

致谢