dsh-completion-voice
DSH 插件:任务完成 / 需要你做选择时用语音播报(默认「已完成当前任务」和「老大老大,等你做选择呢」) 适合在后台运行任务,需要声音提醒任务结束或等待人工干预决策的用户。
インストール
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:zhangjie-2007/dsh-voiceドキュメント
README 全文を読む ↗配置
默认值写在 lib/impl.mjs 的 DEFAULTS 里;实际生效的覆盖写在 profile 的
\profiles\ \cordis.patch.yml(按 id 匹配):
- id: dsh-completion-voice
name: dsh-completion-voice
config:
text: '已完成当前任务'
choiceText: '老大
老大
,等你做选择呢'
engine: edge
voice: zh-CN-XiaoyiNeural
| 键 | 默认 | 含义 |
|---|---|---|
enabled | true | 总开关 |
text | '已完成当前任务' | 任务完成时的播报文本 |
announceOnChoice | true | 是否播报「需要你做选择」 |
choiceText | `'老大 | |
| 老大 | ||
| ,等你做选择呢'` | 选择提示音的文本;留空则完全不播。支持内联 SSML(见下) | |
choiceToolMatch | 'ask_user_question|exit_plan_mode' | 哪些工具调用算「要做选择」(对工具名做正则匹配,忽略大小写) |
announceOnApproval | true | 权限确认(approval/asked)是否也算「要做选择」 |
choiceVoice | '' | 选择提示音的声线;留空 = 沿用 voice |
choiceMinIntervalMs | 3000 | 两次「要做选择」播报的最小间隔(ms) |
engine | 'edge' | 'edge' = Edge 神经语音(在线合成 + 本地缓存);'sapi' = 系统本地语音 |
voice | 'zh-CN-XiaoyiNeural' | Edge 声线名 |
rate | 0 | 语速:Edge 用百分比(-20 = 慢 20%);engine: sapi 时按 /10 映射到 SAPI 的 -10..10 |
pitch | 0 | 音调偏移(Hz),仅 Edge |
volume | 100 | 音量 0..100(同时控制合成音量和播放音量) |
sapiVoiceMatch | 'Chinese|Huihui|中文|zh-CN|zh_CN' | 仅 SAPI 兜底时选语音的正则 |
settleMs | 800 | 结束后的静默窗口(ms) |
minIntervalMs | 800 | 两次播报的最小间隔(ms) |
includeSubagents | false | 是否也给子代理轮次播报 |
skipActiveGoal | true | 有进行中的 goal 时跳过 |
prefetch | true | 加载时就把音频合成好放进缓存 |
cacheDir | '' | 音频缓存目录,空 = \audio\dsh-completion-voice |
log | true | 是否写诊断日志 |
powershellPath | '' | 自定义 powershell.exe 路径,空则自动探测 |
announceOnLoad | false | 加载时立刻播报一次(自检用) |
debugEvents | false | 把收到的前 40 条 session/event 明细写进日志(排查用) |
在文本里写内联 SSML(局部调速 / 停连)
text 和 choiceText 都可以带内联 SSML,用来只把某几个字拖长或加重。默认的选择提示音就是这么写的:
choiceText: '老大
老大
,等你做选择呢'
插件识别的标签: 、、、 、 (见下面的限制)。检测到标签后送给服务端的就是:
老大
老大
,等你做选择呢
四条实测出来的硬约束(都是踩过的坑):
- 标签不能嵌套。文本里一旦出现标签,插件就不再生成最外层
(否则服务端直接以1007 invalid payload关闭连接),代价是整句的rate/pitch/volume那时不再生效,要写的就写进标签自己身上。 不被这个端点接受(同样 1007)。想要停顿只能用标点,比如老大,老大,等你做选择呢。rate是带百分号的字符串("-45%",+/-都行),pitch是"-30Hz"这样的频率,volume是"-20%"。- 改动文本 = 缓存键变了 = 下次加载会重新联网合成一次;旧 mp3 不会被自动清理,觉得缓存目录脏了就手动删
%USERPROFILE%\.dsh\audio\dsh-completion-voice\下的文件。 - SAPI 兜底(Edge 合成失败时)会把标签剥掉再念,不会把
念出来。
可选声线(微软 Edge 神经语音,中文)
| 声线 | 性别 | 风格 |
|---|---|---|
zh-CN-XiaoyiNeural | 女 | 活泼(当前使用) |
zh-CN-XiaoxiaoNeural | 女 | 温暖(≈豆包那种调子) |
zh-CN-YunyangNeural | 男 | 专业可靠,新闻播音腔 |
zh-CN-YunjianNeural | 男 | 浑厚有力,纪实感 |
zh-CN-YunxiNeural | 男 | 年轻阳光 |
zh-CN-YunxiaNeural | 男 | 童声可爱 |
zh-CN-liaoning-XiaobeiNeural | 女 | 东北话 |
zh-CN-shaanxi-XiaoniNeural | 女 | 陕西话 |
zh-TW-HsiaoChenNeural / zh-HK-HiuMaanNeural | 女 | 台湾腔 / 粤语 |
改代码后怎么生效
- 改
cordis.patch.yml:即时生效(DSH 会热重载插件)。 - 改
lib/impl.mjs/edge-tts.mjs/player.mjs:因为入口用时间戳动态 import,碰一下cordis.patch.yml(随便改一个值再改回来)就会重新加载代码,不必重启 DSH。 - 改
lib/plugin.mjs本身或package.json:入口模块已被宿主进程缓存,需要重启 DSH。