zhangjie-2007/dsh-voice ↗★ 0

dsh-completion-voice

DSH 插件:任务完成 / 需要你做选择时用语音播报(默认「已完成当前任务」和「老大老大,等你做选择呢」) 适合在后台运行任务,需要声音提醒任务结束或等待人工干预决策的用户。

Package
dsh-completion-voice
Compatibility
Unverified
Version
0.2.0
License
MIT
Last updated
Oct 16, 2026

Install

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:zhangjie-2007/dsh-voice

配置

默认值写在 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
键默认含义
enabledtrue总开关
text'已完成当前任务'任务完成时的播报文本
announceOnChoicetrue是否播报「需要你做选择」
choiceText`'老大
老大
,等你做选择呢'`选择提示音的文本;留空则完全不播。支持内联 SSML(见下)
choiceToolMatch'ask_user_question|exit_plan_mode'哪些工具调用算「要做选择」(对工具名做正则匹配,忽略大小写)
announceOnApprovaltrue权限确认(approval/asked)是否也算「要做选择」
choiceVoice''选择提示音的声线;留空 = 沿用 voice
choiceMinIntervalMs3000两次「要做选择」播报的最小间隔(ms)
engine'edge''edge' = Edge 神经语音(在线合成 + 本地缓存);'sapi' = 系统本地语音
voice'zh-CN-XiaoyiNeural'Edge 声线名
rate0语速:Edge 用百分比(-20 = 慢 20%);engine: sapi 时按 /10 映射到 SAPI 的 -10..10
pitch0音调偏移(Hz),仅 Edge
volume100音量 0..100(同时控制合成音量和播放音量)
sapiVoiceMatch'Chinese|Huihui|中文|zh-CN|zh_CN'仅 SAPI 兜底时选语音的正则
settleMs800结束后的静默窗口(ms)
minIntervalMs800两次播报的最小间隔(ms)
includeSubagentsfalse是否也给子代理轮次播报
skipActiveGoaltrue有进行中的 goal 时跳过
prefetchtrue加载时就把音频合成好放进缓存
cacheDir''音频缓存目录,空 = \audio\dsh-completion-voice
logtrue是否写诊断日志
powershellPath''自定义 powershell.exe 路径,空则自动探测
announceOnLoadfalse加载时立刻播报一次(自检用)
debugEventsfalse把收到的前 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。