ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Claude Code干活终于会「出声」了!用hook+afplay脚本配置完成提示音

Claude Code干活终于会「出声」了!用hook+afplay脚本配置完成提示音 1. Claude Code 干完活不出声盯屏等待到底有多折磨Claude Code 这个工具用起来是真香但有个细节特别反人类它干完活从来不吭声。你让它重构一个模块、跑一遍测试、生成一堆文件它就在那儿默默跑跑完了也不告诉你。结果就是你每隔十几秒切回终端看一眼发现还在转圈再切回去干别的过一会儿又忍不住看——一上午下来正事没干多少眼睛倒是快盯瞎了。这个痛点在做长任务的时候尤其明显。比如你让 Claude Code 去处理一个跨十几个文件的批量改动或者跑一个耗时几分钟的代码分析中间你根本不知道它是在思考、在等工具返回、还是已经卡住了。没有反馈的等待是最消耗注意力的因为你没法真正把注意力转移到别的事情上总惦记着「它好了没」。解决办法其实很直接让 Claude Code 在关键节点「出声」。任务完成时响一声需要你确认权限时响另一声新会话开始时再换一个音效。这样你完全可以去泡杯咖啡、回个消息听到声音再回来处理。这就是 hook 机制 afplay 脚本要干的事。Claude Code 的 hook 本质上是一套事件回调系统。它在执行流程的特定节点会触发事件你可以在配置文件里声明「当某个事件发生时去执行某条命令」。这条命令可以是一个 shell 脚本脚本里调用 macOS 自带的 afplay 播放音频文件。整套链路是Claude Code 触发事件 → 执行你配置的命令 → 命令调用脚本 → 脚本用 afplay 播放 mp3。理解了这个链路后面配置起来就不会迷糊。适合谁看这篇如果你满足下面任意一条这篇就是写给你的用 macOS 跑 Claude Code经常让它做耗时任务受够了反复切窗口查看进度愿意花十分钟做一次性配置。Windows 用户思路一样只是播放命令要换成 PowerShell 的[console]::beep()或者调用系统播放器本文以 macOS 的 afplay 为主线。需要提前说清楚一个容易踩的坑不同版本的 Claude Code 支持的 hook 事件名不完全一样。网上很多教程直接甩一段配置让你复制结果你复制完发现根本不触发原因就是事件名对不上你的版本。所以本文会先教你查自己版本支持哪些事件再动手写配置而不是上来就贴代码。另外hook 配置里除了音频播放通常还会带上模型接入相关的环境变量。如果你还没配好 Claude Code 的模型来源可以先去 TaoToken 的接入文档看一眼标准写法把 Base URL、Key、Model ID 三件套对齐再回来加 hook这样排查问题时变量更少。文档地址在 https://taotoken.net/doc 里面有各客户端的配置示例。2. 前置准备查清 hook 事件名别让配置白写动手之前必须先做一件事确认你当前 Claude Code 版本支持哪些 hook 事件。这一步看着不起眼但它是后面所有配置能不能生效的前提。我见过太多人配置写完、脚本也测通了就是不响最后发现是事件名写错了。查事件名的方法很简单在 Claude Code 的交互界面里输入斜杠命令/help然后找到 hooks 相关的说明或者直接输入/hooks终端底部会列出当前版本支持的全部 hook 事件。以 Claude Code v1.0.72 为例实际支持的事件大致是这几个事件名触发时机适合用来做什么PreToolUse工具执行前记录即将执行的操作、做前置校验PostToolUse工具执行后任务完成提示音、结果日志Notification发送通知时权限确认提醒、异常告警UserPromptSubmit用户提交提示时提交确认音、输入记录SessionStart新会话开始时启动提示音、环境初始化这里要重点区分 PostToolUse 和 Notification。PostToolUse 是「工具执行完之后」触发也就是 Claude 完成一次工具调用比如写完文件、跑完命令就会响适合做「干完活提醒」。Notification 更多是在需要你介入的时候触发比如它要请求权限、要你确认某个操作这时候响一声提醒你回来点确认。两个事件配合起来用体验最好。如果你想让「每次我发消息」也有个反馈音那就用 UserPromptSubmit。想让「新开一个会话」有提示用 SessionStart。事件选对了后面脚本和配置才有意义。选好事件之后准备音频文件。音效来源随意自己录、用系统自带、或者用剪辑软件导出都行。建议准备两到三个不同的音方便区分状态任务完成用一个偏轻快的权限确认用一个偏急促的会话启动用一个短的。文件格式用 mp3 或 wav 都可以afplay 都支持。把音频文件统一放到一个目录里比如mkdir -p ~/hooks然后把你的音频文件丢进去假设命名为done.mp3、notify.mp3、start.mp3。路径记清楚后面配置里要写绝对路径不能用~简写因为 hook 执行时的环境不一定能正确展开波浪号。还有一点确认你的系统音量不是静音afplay 播放走的是系统默认输出设备。如果你外接了显示器带音箱、或者用了蓝牙耳机确认当前输出设备是你能听到的那个。这个听起来像废话但真有人排查半天发现是输出设备切错了。前置准备做到这里就够了事件名查清、音频文件就位、路径确认。接下来写脚本。3. 可复制配置afplay 脚本 settings.json hook 片段这一节是核心分两步走先写播放脚本再写 settings.json 配置。两步都给你可直接复制的片段路径换成你自己的就行。3.1 写一个通用的播放脚本脚本的作用很简单接收一个音频文件路径作为参数用 afplay 播放它同时记一行日志方便调试。先建目录和文件mkdir -p ~/.local/bin nano ~/.local/bin/claude-beep.sh脚本内容如下#!/bin/bash # 记录触发时间和传入的音频路径方便排查 echo Hook triggered at $(date): $1 /tmp/claude-hook.log # 播放传入的音频文件 afplay $1保存退出后给它加上执行权限chmod x ~/.local/bin/claude-beep.sh手动测一下脚本能不能出声~/.local/bin/claude-beep.sh ~/hooks/done.mp3听到声音就说明脚本没问题。如果没声音先直接用 afplay 测音频本身afplay ~/hooks/done.mp3afplay 能响但脚本不响检查脚本权限和路径afplay 也不响检查音频文件是否损坏、系统音量、输出设备。日志文件/tmp/claude-hook.log里会记录每次触发后面排查 hook 有没有被调用时非常有用。3.2 配置 settings.json 的 hooks 段Claude Code 的配置文件是.claude/settings.json注意它必须在.claude目录的根下放错位置会读不到。完整配置结构如下路径记得全部换成你自己的{ env: { ANTHROPIC_AUTH_TOKEN: sk-你的Key, ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_MODEL: claude-sonnet-4-5, CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: 1, API_TIMEOUT_MS: 600000 }, permissions: { allow: [], deny: [] }, hooks: { PostToolUse: [ { matcher: , hooks: [ { type: command, command: /Users/你的用户名/.local/bin/claude-beep.sh /Users/你的用户名/hooks/done.mp3 } ] } ], UserPromptSubmit: [ { matcher: , hooks: [ { type: command, command: /Users/你的用户名/.local/bin/claude-beep.sh /Users/你的用户名/hooks/start.mp3 } ] } ], Notification: [ { matcher: permission, hooks: [ { type: command, command: /Users/你的用户名/.local/bin/claude-beep.sh /Users/你的用户名/hooks/notify.mp3 } ] } ] } }几个关键点解释一下。env段里的ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKEN是模型接入配置如果你用的是 TaoToken 的 APIBase URL 填https://taotoken.net/apiKey 去控制台生成Model ID 按你实际要用的填。这三件套必须对齐否则 Claude Code 连模型都连不上hook 配得再对也没机会触发。hooks段里每个事件对应一个数组数组元素里有matcher和hooks。matcher用来过滤触发条件空字符串表示全部匹配。Notification那里我写了matcher: permission意思是只在权限请求类通知时触发避免所有通知都响。command字段必须是绝对路径脚本路径和音频路径都要写全。macOS 上用户目录一般是/Users/你的用户名/别用~。配置改完重启 Claude Code 让它重新加载 settings.json。重启方式就是退出当前会话再重新进入。如果你同时用多个客户端比如 Cline、Codex建议把 Base URL、Key、Model ID 这三件套在各自配置里保持一致避免出现「这个客户端能连、那个连不上」的混乱。TaoToken 的 API Keys 管理页在 https://taotoken.net/api-keys 生成和轮换 Key 都在那里。4. 验证请求确认任务完成时真的会出声配置写完不算完必须验证。验证分三层脚本层、hook 触发层、端到端层。一层层过出问题好定位。第一层脚本层。前面已经手动测过claude-beep.sh能出声这层过了。第二层hook 触发层。重启 Claude Code 后随便发一条消息比如「你好」。如果UserPromptSubmit配对了你应该立刻听到start.mp3。听到了说明 hook 机制通了配置被正确读取。没听到的话先看日志tail -f /tmp/claude-hook.log再发一条消息观察日志有没有新增行。有新增行说明 hook 被调用了问题在 afplay 或音频路径没有新增行说明 hook 根本没触发问题在事件名或配置位置。第三层端到端层。让 Claude Code 干一件会调用工具的事比如「在当前目录创建一个 test.txt 文件」。它执行写文件这个工具后PostToolUse应该触发你听到done.mp3。这一步成功说明整条链路完全打通。验证时可以故意做个对照把done.mp3和start.mp3换成明显不同的音效这样你能清楚区分是哪个事件在响。如果两个事件响的是同一个音你会误以为配置生效了其实可能只有一个事件在工作。再补一个验证技巧观察日志的时间戳。日志里会记录每次触发的精确时间你可以对照 Claude Code 界面上的操作时间确认响应对不对得上。比如你 10:00:05 提交消息日志里 10:00:05 有一条记录那就对上了。端到端验证通过后你就可以放心把注意力从屏幕上移开了。长任务跑起来听到done.mp3再回来。权限确认的时候notify.mp3会提醒你不会让你干等着。如果你在验证过程中发现模型请求本身有问题比如一直转圈不出结果那可能是接入配置的问题跟 hook 无关。这时候去 TaoToken 的模型对话页面单独测一下模型能不能正常返回地址是 https://taotoken.net/models 能返回说明 Key 和 Base URL 没问题问题在 Claude Code 客户端侧。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth配置 hook 的过程中报错基本集中在几类。下面按真实报错对照着排查。401 未授权。这个报错跟 hook 没关系是模型接入的 Key 有问题。表现是 Claude Code 一发请求就报 401日志里能看到401 Unauthorized。排查顺序先确认ANTHROPIC_AUTH_TOKEN填的是有效 Key没有多余空格再确认ANTHROPIC_BASE_URL写对了TaoToken 的地址是https://taotoken.net/api结尾不要多加斜杠最后确认 Key 没有过期或被禁用。去 https://taotoken.net/api-keys 重新生成一个换上试试。local proxy failed。这个报错通常出现在客户端尝试走本地代理但代理没起来的时候。如果你在配置里写了代理相关设置先去掉直连试试。Claude Code 的 settings.json 里不要保留任何代理字段。如果系统层面有代理环境变量临时 unset 掉再测unset HTTP_PROXY HTTPS_PROXY ALL_PROXYreading choices 相关报错。这类报错一般是响应格式不符合预期常见于 Base URL 指向的端点不兼容 Anthropic 协议。确认你用的 Base URL 是 Anthropic 兼容端点TaoToken 的https://taotoken.net/api是兼容的。如果 Model ID 填错也可能导致返回结构异常检查ANTHROPIC_MODEL是不是有效模型名。OAuth 相关报错。如果你用的是需要 OAuth 登录的客户端比如某些版本的 Codex报 OAuth 错误说明登录态失效或配置冲突。这时候检查auth.json里的凭据是否有效Base URL、Key、Model ID 三件套是否齐全。三件套缺任何一个都可能触发认证流程异常。hook 不触发但没有任何报错。这是最隐蔽的一类。排查顺序第一确认 settings.json 在.claude根目录下不是子目录第二确认事件名跟/hooks列出来的一致第三确认command是绝对路径且脚本有执行权限第四看/tmp/claude-hook.log有没有记录。四步走完基本能定位。脚本触发了但没声音。日志有记录但听不到检查音频文件路径是否正确、文件是否损坏、系统输出设备是否是当前在用的那个。afplay 直接测音频文件能响就是脚本参数问题不能响就是音频或设备问题。权限确认不响。Notification事件的matcher写的是permission如果你希望所有通知都响把 matcher 改成空字符串。但要注意改成空字符串后所有通知都会触发可能比较吵建议还是保留permission过滤。排查的核心思路就一条把链路拆成「事件触发 → 命令执行 → 脚本运行 → 音频播放」四段用日志确认卡在哪一段。日志文件是/tmp/claude-hook.log这是你最好的朋友。6. 把提示音接进你的日常编码流配置跑通之后真正有价值的是把它融进日常习惯。我自己的用法是这样PostToolUse用done.mp3Notification的 permission 用notify.mp3SessionStart用start.mp3。三个音效区分度拉满闭着眼都知道现在是什么状态。长任务场景收益最大。比如让 Claude Code 批量重构、跑全量测试、生成文档这些动辄几分钟起步。以前我得反复切窗口现在提交完就去干别的听到done.mp3再回来验收。注意力不再被切碎效率提升是实打实的。如果你经常用 Coding Plan 跑 Agent 类的长任务提示音的价值会更高因为 Agent 任务链路长、中间状态多没有声音反馈你根本不知道它跑到哪一步了。Coding Plan 的入口在 https://taotoken.net/coding-plan 配合 hook 提示音用体验会顺很多。再给几个实用小技巧。音效别选太长的一两秒足够太长会烦。音量别太大能听到就行突然一声巨响会吓到人。如果你在办公室建议用耳机或者把音量调低别打扰同事。音频文件统一放~/hooks脚本统一放~/.local/bin路径规范了以后换机器也好迁移。最后hook 机制不止能播声音。你完全可以在脚本里加更多动作任务完成时发一条系统通知、写一行记录到日志文件、甚至触发一个自动化流程。脚本是你的想加什么加什么。afplay 只是最直观的那个用法。整套配置一次性做好后面就是纯收益。Claude Code 干活会出声了你的眼睛就解放了。
返回列表