dsh-sing
给 DeepSeek Harness 的唱歌插件:在 QQ 里点歌,由 sing-gateway 搜索歌曲、截取片段并用 RVC 音色翻唱,再把音频发回当前 QQ 会话。
和 AstrBot 版的 deepseek-sing 是同一件事,区别只在投递:AstrBot 插件有 event.send(Record(...)),DSH 没有平台中立的消息链,所以本插件带一层很薄的 投递适配器——优先语音,其次文件,最后回退链接。
QQ 用户
↕ qq-bridge / SnowLuma / NapCat / OneBot 通道插件
DeepSeek Harness Agent
↕ dsh-sing(本插件)
sing-gateway
→ Bilibili / NetEase 搜索下载 → ffmpeg 截取 → Replicate AICoverGen → 缓存
插件本身不碰 Replicate、音乐源或音色白名单;搜索、截取、翻唱、缓存全部在网关侧。
工具
| 工具 | 作用 |
|---|---|
sing_song |
点歌并生成翻唱。正常点歌直接调用;插件会尝试把音频发到当前 QQ 会话。 |
confirm_song |
重新确认是哪一首(免费,不生成音频)。只在用户说“唱错歌了/不是这首”时调用。 |
sing_status |
查询未完成的异步任务;完成后自动投递。 |
list_voices |
返回音色广场链接和用法;音色名不在接口里枚举。 |
模型侧看到的一次 sing_song 调用就完成了“生成 + 投递”,不需要额外再调一次发送工具。
安装
DSH 桌面端(设置 → 插件 → 添加插件)
输入本地绝对路径或打好的 tgz,不要直接输入 dsh-sing——这个包还没发布到 npm,按包名查 registry 会返回“未找到相关插件”。
D:/projects/dsh-sing/dsh-sing-0.1.0.tgz ← 推荐
D:/projects/dsh-sing
优先用 tgz:目录安装通常是把源码目录 symlink 进 profile,会连带开发用的 node_modules/@deepseek-ai/dsh-tools(0.1.5)一起被 Node 解析到,可能和宿主的 0.2.x 重复。tgz 不含 node_modules,会正确使用宿主提供的 dsh-tools。如果一定要目录安装,先把项目里的 node_modules 删掉。
安装源 对本地路径 / tgz 不生效,保持 npm 官方源即可。安装完成后点「立即启用」,工具列表里应出现 4 个工具。
普通 DSH profile(非桌面端)
# 从 GitHub
dsh plugin --profile web add https://github.com/leicanxi/dsh-sing
# 从 npm(发布后)
dsh plugin --profile web add dsh-sing
# 或直接从本地目录 / 打好的 tgz
dsh plugin --profile web add /path/to/dsh-sing
dsh plugin --profile web add ./dsh-sing-0.1.0.tgz
desktop profile 由 Electron 桌面端独占管理,CLI 不能直接往里装;桌面端请用上面的 UI。
然后在 profile 的 cordis.patch.yml 里确认有:
- insert:
- id: dsh-sing
name: dsh-sing
重启 DSH 后,在设置 → 插件里应能看到 dsh-sing。
Android(dsha / DeepSeek Harness 手机版)
把本包放进 dshroot/lib/node_modules/@deepseek-ai/dsh/node_modules/dsh-sing/,在 @deepseek-ai/dsh 的 package.json dependencies 里声明 "dsh-sing": "0.1.0",再把 cordis.patch.yml 的 insert: 条目加进 profile 配置。dsh-patches/overlay/ + apply.sh 的做法与现有的 dsh-tool-* 插件一致。
本地开发
cd dsh-sing
npm install # 只装 @deepseek-ai/dsh-tools(devDependency,用于测试)
npm test
npm run selftest
npm run pack:check
插件没有运行时依赖,只用 Node 内置模块和全局 fetch;要求 Node 20+。@deepseek-ai/dsh-tools 是 peerDependency,测试时由 devDependency 提供。
配置
优先读 $DSH_HOME/sing.json(默认 ~/.dsh/sing.json),也可以在本插件 cordis.patch.yml 的 config: 下覆盖,或使用环境变量。改完 sing.json 不需要重启,下一次工具调用会重新读取。
从示例开始:
mkdir -p "$DSH_HOME" && cp sing.example.json "$DSH_HOME/sing.json"
chmod 600 "$DSH_HOME/sing.json"
FlowBee 模式(推荐,免部署)
{
"billing_mode": "flowbee",
"flowbee_base_url": "https://flowbee.top/v1",
"flowbee_api_key": "你的 FlowBee Key",
"default_voice": "",
"duration": 25,
"start": 60,
"pitch": 2,
"pitch_mode": "no-change",
"transport": "auto",
"delivery": "auto"
}
按次计费到你的 FlowBee 账户,用你自己的 Key;插件不会使用运营方的 SING_GATEWAY_TOKEN。
自托管模式
{
"billing_mode": "selfhosted",
"gateway_base_url": "http://127.0.0.1:9001",
"gateway_token": "SING_GATEWAY_TOKEN 的值"
}
gateway_base_url 写 http://host:9001 或 http://host:9001/v1 都可以;插件会自动剥掉 /v1 去访问 /sing/v1/jobs。
全部配置
| 键 | 环境变量 | 默认 | 说明 |
|---|---|---|---|
billing_mode |
SING_BILLING_MODE |
flowbee |
flowbee 或 selfhosted |
flowbee_base_url |
SING_FLOWBEE_BASE_URL |
https://flowbee.top/v1 |
FlowBee 的 OpenAI 兼容地址 |
flowbee_api_key |
SING_FLOWBEE_API_KEY / FLOWBEE_API_KEY |
— | 用户自己的 Key |
gateway_base_url |
SING_GATEWAY_BASE_URL |
http://127.0.0.1:9001 |
自托管网关地址 |
gateway_token |
SING_GATEWAY_TOKEN |
— | 自托管网关令牌 |
default_voice |
SING_VOICE |
— | 默认音色名;留空用网关默认 |
start |
SING_START |
60 |
截取起点(秒) |
duration |
SING_DURATION |
25 |
片段长度(秒) |
pitch |
SING_PITCH |
2 |
升降调半音 |
pitch_mode |
SING_PITCH_MODE |
no-change |
no-change / male-to-female / female-to-male |
instrumental_volume |
SING_INSTRUMENTAL_VOLUME |
网关默认 | 伴奏增益 dB,-60 静音到 +12 |
backup_vocals_volume |
SING_BACKUP_VOCALS_VOLUME |
网关默认 | 和声增益 dB |
transport |
SING_TRANSPORT |
auto |
auto 优先任务接口,旧网关回退同步;job 只用任务;sync 只用同步 |
delivery |
SING_DELIVERY |
auto |
auto 语音→文件→链接;voice;file;url |
auto_send |
SING_AUTO_SEND |
true |
关闭后只返回本地路径/链接,不主动发送 |
cleanup |
SING_CLEANUP |
true |
语音发送成功后删除本地 MP3;文件发送会保留(桥可能还要读) |
media_dir |
SING_MEDIA_DIR |
$DSH_HOME/media/onebot/sing |
下载目录;必须在桥的出站白名单内 |
plaza_url |
SING_VOICE_PLAZA_URL |
https://voice-models.flowbee.top |
音色广场 |
poll_timeout_ms |
SING_POLL_TIMEOUT_MS |
300000 |
sing_song 等待异步任务的上限 |
poll_interval_ms |
SING_POLL_INTERVAL_MS |
3000 |
任务轮询间隔 |
request_timeout_ms |
SING_REQUEST_TIMEOUT_MS |
30000 |
提交/查询请求超时 |
sync_timeout_ms |
SING_SYNC_TIMEOUT_MS |
960000 |
同步 /chat/completions 生成超时;冷启动最长约 4 分钟 |
download_timeout_ms |
SING_DOWNLOAD_TIMEOUT_MS |
120000 |
下载 MP3 超时 |
media_max_bytes |
SING_MEDIA_MAX_BYTES |
52428800 |
MP3 大小上限(50MB) |
投递适配器
插件按顺序探测当前 agent 可见的发送工具:
- 语音:
qq_send_voice、qq_send_record、send_voice、send_audio - 文件:
qq_send_file、qq_send_local_file、send_file、qq_send_document - 链接:都没有时返回
audio_url
工具参数按它自己的 schema 适配:path / file / file_path 都支持;如果工具要求 name,会填入文件名;如果它要求 chat_id 这类插件无法推断的必填参数,就跳过它,继续下一个适配器。
不同 QQ 桥的现状
| 桥 | 出站能力 | 本插件的效果 |
|---|---|---|
dsh-onebot-qq(OneBot/NapCat/SnowLuma) |
qq_send_voice(path) |
语音条,最接近 AstrBot |
dsh-qq-onebot(OneBot/NapCat) |
qq_send_file(path) |
MP3 文件(QQ 里可播放) |
dsh-qq-bridge(QQ 官方 bot) |
qq_send_local_file(path) |
MP3 文件;路径需在它的 allowed roots 内 |
| 外部 qq-bridge / 其他 | 视产品而定 | 有语音/文件工具就适配,否则回链接 |
dsh-onebot-qq 的默认媒体目录是 <DSH_HOME>/media/onebot;本插件默认下载到 <DSH_HOME>/media/onebot/sing,正好在它的白名单内。用其他桥时,如果发送报“路径不在允许的媒体目录内”,把 media_dir 指到该桥允许的目录即可。
示例对话
- 用户:「唱晴天」→
sing_song {song:"晴天"}→ 插件生成并作为语音发出 - 用户:「不是这首」→
confirm_song {query:"晴天"}→ 用户选一个 →sing_song {url:"..."} - 用户:「带伴奏」→
sing_song {song:"晴天", instrumental_volume:0} - 用户:「唱 60 秒」→
sing_song {song:"晴天", duration:60} - 用户:「有什么音色」→
list_voices→ 返回音色广场链接
模型被要求在正常点歌时不要先调 confirm_song,也不要伪造“已发送”;如果结果是 delivered=url,它会把链接告诉用户。
安装排错
| 提示 | 原因 | 处理 |
|---|---|---|
| 未找到相关插件 | 输入的是包名,但 dsh-sing 还没发布到 npm;或本地路径不是绝对路径 |
改用 D:/projects/dsh-sing 或 D:/projects/dsh-sing/dsh-sing-0.1.0.tgz;发布 npm 后才能按包名装 |
| not-a-bundle | 包没有声明 dsh.bundle.patch |
本包已声明;确认装的是当前版本 |
| incompatible-version | peerDependencies 与当前 DSH 运行时不匹配 |
本包 peer 范围是 >=0.1.5-0 <0.3.0-0,已覆盖 0.2.0-rc.x;用最新构建 |
| already-installed | 同名包已在 profile 里 | 先在插件页卸载,再装新版 |
| 安装成功但工具没出现 | 组合包未启用,或 DSH 没重启 | 点「立即启用」;必要时重启 DSH |
安全
- 不要把 FlowBee Key 或网关令牌提交到仓库;
$DSH_HOME/sing.json建议chmod 600。 - 插件不接受用户传入 RVC 模型 URL;音色只能通过音色广场挑选后用名字引用。
- 生成的 MP3 会下载到
media_dir;语音发送成功后默认删除,文件发送会保留;cleanup=false可全部保留。 - 插件只访问配置的 sing-gateway / FlowBee 地址,不访问其他主机。
No comments yet. Be the first to write one.