jiaqinzhang123
peon-voice
给 DeepSeek Harness 用的语音 + 主题音乐插件:在 agent 会话生命周期事件上播放随机语音提示,并按主题播放网易云音乐背景乐。
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 16, 2026
- Updated
- Aug 16, 2026
Introduction
peon-voice — 语音主题包插件(DSH)
给 DeepSeek Harness 用的语音 + 主题音乐插件:在 agent 会话生命周期事件上播放随机语音提示,并按主题播放网易云音乐背景乐。
- 🎙️ 语音包:新会话(问候)、收到消息(应答)、一轮完成(完成)、agent 向你提问(提问)时随机播放对应语音,多条随机且避免连播同一条
- 🎵 主题包:切换主题时自动切换对应语音包,并播放该主题关键词搜到的网易云歌单
- 🔊 网易云音乐:匿名接口获取免费歌曲并后台顺序播放,不可播 VIP 歌曲(自动跳过);歌单全部播完或连续多首无法播放时自动切换到新歌单;播放语音时背景乐自动闪避(duck)
- 🖥️ 双端实现:Host 端(Node,注册
/peon/*HTTP 路由)+ Client 端(浏览器,轮询事件队列并播放) - 🔄 每次启动重置:播放状态不持久化,每次打开 DSH 都会重新随机挑选歌单(主题/语音包选择会保留)
目录结构
peon-voice/
├── lib/
│ ├── index.js # Host 端:事件监听、语音/主题扫描、HTTP 路由
│ ├── client.js # Client 端:浏览器 UI + 音频播放(__ModuleLoader__ 模块)
│ └── netease.js # 网易云客户端(匿名歌单搜索、流媒体代理)
├── voice-packs/ # 语音包(每个子目录一个包)
│ ├── orc/ # 兽人男声 · Orc Peon
│ └── female/ # 日语动漫萌音 · 女生
├── theme-packs/ # 主题包(每个子目录一个主题)
│ ├── orc-epic/ # 兽人史诗
│ └── anime/ # 日系动漫
└── package.json
安装
把本仓库放到 DSH profiles 的 node_modules 下(或通过路径引用),然后在你的 cordis 配置(如 cordis.patch.yml)中注册该插件条目即可,例如:
plugins:
peon-voice: {}
插件启动后会注册 /peon/* 路由;浏览器端会在 DSH Web 界面加载并开始播放。路径默认指向仓库内的 voice-packs/ 与 theme-packs/,克隆即用。
语音包格式
voice-packs/<pack-id>/ 下一个目录即一个语音包,文件名以类型开头即可(.mp3/.wav 均可,数字后缀随意):
| 文件名 | 触发时机 |
|---|---|
greeting-* | 问候音:打开应用 / 新会话 / 切换工作区(可多条随机) |
ack-* | 应答音:收到消息时(可多条随机) |
done-* | 完成音:一轮对话完成时 |
question-* | 提问音:agent 向你提问时 |
可选 pack.json:{"label": "显示名"}(不写则用目录名)。放好音频后在应用里切换到这个语音包即可,无需重启。
主题包格式
theme-packs/<theme-id>/pack.json:
{
"label": "日系动漫",
"voice": "female",
"music": { "keywords": ["动漫主题曲", "二次元主题曲"] }
}
label:界面显示名voice:切换该主题时自动切换的语音包 idmusic.keywords:用于在网易云搜索歌单的关键词(每次从评分最高的若干歌单中随机选一个播放)
环境变量
所有路径都可通过环境变量覆盖,默认值开箱即用:
| 变量 | 默认值 | 说明 |
|---|---|---|
PEON_VOICE_PACKS | <仓库>/voice-packs | 语音包根目录 |
PEON_VOICE_THEMES | <仓库>/theme-packs | 主题包根目录 |
PEON_VOICE_STORE | ~/.dsh/peon-voice-pack.json | 当前选中语音包/主题的持久化 |
PEON_VOICE_DEBUG_LOG | ~/.dsh/peon-voice-debug.log | 调试日志 |
HTTP 路由
| 路由 | 说明 |
|---|---|
GET /peon/events | 拉取并清空事件队列(Client 轮询) |
GET /peon/audio?kind= | 从当前语音包随机返回一条音频 |
GET /peon/packs · POST /peon/pack | 列出 / 切换语音包 |
GET /peon/themes · POST /peon/theme | 列出 / 切换主题(同时切换语音包) |
GET /peon/music/playlist · GET /peon/music/stream?id= | 主题歌单 / 歌曲流媒体代理 |
POST /peon/music/leader | 心跳/竞选播放者,返回全局音乐状态 |
POST /peon/music/action | 队列化一条播放命令(由播放者执行) |
POST /peon/music/report | 播放者上报播放状态(全局镜像) |
GET /peon/status | 插件状态总览 |
播放行为
- 歌单内顺序播放,全部播放完毕自动切换到该主题的新随机歌单
- VIP 受限歌曲播放失败时自动跳过;连续 3 首失败(歌单基本全是 VIP)自动切换新歌单
- 手动「切歌」仍为随机(不重复上一首),手动「切歌单」立即换一个新歌单
- 播放状态(当前歌单/曲目)不持久化:每次打开 DSH 都是新的随机歌单
- 多窗口/多标签全局统一:同时开多个会话(多个浏览器上下文)时,由 Host 仲裁出唯一播放者实际播放音乐,其余上下文静默并镜像同一播放状态(歌单/曲目/播放/暂停、主题与语音包切换全部同步);播放者窗口关闭后自动移交并续播同一曲目。语音提示保持各上下文独立触发,不做全局统一。
免责声明
- 语音素材版权归原版权方所有:兽人苦工 / 人类农民语音出自《魔兽争霸 III》(© Blizzard Entertainment),女生语音包素材版权归原作者所有。本仓库仅供个人娱乐学习使用,请勿商用。
- 网易云音乐接口为非官方匿名实现(公开 /api 端点),仅作个人使用;VIP 歌曲不可播放,请遵守网易云音乐服务条款。