之前使用 Claude Code 的时候,为了方便摸鱼的时候加了一个很小的功能:
当 Claude Code 完成一轮任务,会自动播放一段“已完成”的语音。
这个功能本身不复杂,但体验提升非常明显。不用一直盯着终端了,可以有个让人放心地摸鱼 ![]()
最近的版本中 Codex 也刚好更新了 Hook 功能,给 Codex 也整了一个。
主要流程
AI 完成一轮回答 / 任务停止
↓
触发 Stop Hook
↓
执行本地脚本
↓
播放 完成语音
文件结构大概是这样:
.codex/
hooks.json
hooks/
stop.js
audio/
completed.wav
hooks.json 里配置 Stop 事件:
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "node .codex/hooks/stop.js",
"timeout": 10000
}
]
}
]
}
}
然后在 stop.js 里播放音频:
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const audioFile = path.join(process.cwd(), '.codex', 'audio', 'completed.wav');
try {
if (fs.existsSync(audioFile)) {
const platform = process.platform;
if (platform === 'darwin') {
execSync(`afplay "${audioFile}"`, { stdio: ['pipe', 'pipe', 'pipe'] });
} else if (platform === 'win32') {
const safePath = audioFile.replace(/'/g, "''");
execSync(
`powershell -c "(New-Object Media.SoundPlayer '${safePath}').PlaySync()"`,
{ stdio: ['pipe', 'pipe', 'pipe'] }
);
} else if (platform === 'linux') {
try {
execSync(`aplay "${audioFile}"`, { stdio: ['pipe', 'pipe', 'pipe'] });
} catch {
execSync(`paplay "${audioFile}"`, { stdio: ['pipe', 'pipe', 'pipe'] });
}
}
}
} catch {
// 播放失败不影响主流程
}
process.exit(0);
如果你用的是 Claude Code,也可以放在:
.claude/
settings.json
hooks/
stop.js
audio/
completed.wav
settings.json 里配置:
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "node .claude/hooks/stop.js",
"timeout": 10000
}
]
}
]
}
}
大佬们也可以发散运用一下,给 Codex / Claude Code 在更多生命周期加上语音播报。这样或许能加强点人机交互感 ![]()
8 个帖子 - 6 位参与者