dsh-music-dj
AI DJ for DeepSeek Harness: turn a sentence into a song; searches and switches tracks through a local LX Music instance (bundles no audio sources).
- Stars
- 0
- Language
- JavaScript
- Created
- Oct 22, 2026
- Updated
- Oct 22, 2026
Introduction
音乐 DJ(dsh-music-dj)
把 DeepSeek Harness 的对话接成一台 AI DJ:说一句「来点适合写代码的」或「放首晴天」,DSH 就会自己搜歌、自己切歌。
本插件不含任何音源、不下载音频、不分发音源脚本。 它只负责「把话变成检索词」和「遥控播放器」;真正的音源与播放都在你本机的 LX Music(洛雪音乐助手) 里。
它解决的问题
| 普通音乐插件 | 音乐 DJ |
|---|---|
| 需要你自己维护曲库(下载/整理/索引) | 不需要,音源由洛雪提供 |
| 模型只能「播放/暂停/下一首」 | 模型能理解意图:场景、情绪、具体歌曲 |
| 插件里塞解码器、代理、歌词、媒体键 | 全部交给洛雪,插件本体只有几十 KB |
| 切歌要你开口 | 开了 DJ 模式,模型会在合适的时候自己换歌 |
搭配要求(重要)
插件本身不能放歌。第一次使用请按下面四步准备,只需一次:
- 安装 LX Music 桌面版 ≥ 2.8(建议 ≥ 2.12,支持
-hidden托盘启动):GitHub Releases - 打开洛雪 →「设置 → 自定义源」→ 导入一个可用的自定义音源(洛雪 2023 年起不再内置音源,自行选择社区源;插件不提供、不分发)
- 打开洛雪 →「设置 → 开放 API」→ 启用(默认端口
23330,只监听127.0.0.1) - 在 DSH 里打开「设置 → 音乐 DJ」→ 点「检测连接」,看到「已连接」即可
音源是消耗品:社区源会失效。插件在点歌失败时会明确说"没确认播放成功",而不是假装播了。换源后重试即可。
安装
-
插件市场:在 DSH 插件市场搜索「音乐 DJ / dsh-music-dj」安装(推荐)。
-
命令行:
dsh plugin add dsh-music-dj(前提是 CLI 可用;本插件声明了dsh.bundle,可被dsh plugin add安装)。 -
本地开发:把本仓库克隆到任意目录,在 profile 的
cordis.patch.yml里insert一条:- insert: - id: dsh-music-dj name: dsh-music-dj
怎么用
直接对 DSH 说:
- 「来点适合写代码的」→ 按场景词搜索并播放
- 「放首周杰伦的晴天」→ 精确点歌(会校验播的确实是这首)
- 「换首更安静的」→ 叠加意图重新找
- 「声音小一点」「暂停一下」「下一首」→ 控制
- 「现在放的什么」→ 读取真实状态
模型拿到的三个工具
| 工具 | 作用 |
|---|---|
music_play | 点歌/找歌播放:intent(场景)、query(检索词)、title+artist(精确点歌) |
music_control | play/pause/toggle/next/prev/seek/volume/mute/collect/uncollect |
music_status | 连接诊断 + 当前播放 + 最近错误 |
所有工具都返回回读校验后的真实结果:成功了告诉你实际在放什么,失败告诉你试过哪些检索词、大概率是哪个环节坏了。
工作原理(为什么可靠)
洛雪的协议有个现实约束:开放 API 能控制但没有搜索,搜歌只能靠 lxmusic://music/searchPlay/<检索词> 这类 Scheme URL,而它是"发出去就不管了"、没有回执。所以插件采用双通道 + 回读校验:
用户的意图
↓ 模型调用 music_play(intent="写代码")
场景词表 → 检索词序列 ["lofi 纯音乐", "轻音乐 工作", ...]
↓ 逐条尝试
派发 lxmusic://music/searchPlay/<词>
↓ 每 800ms 回读 http://127.0.0.1:23330/status
校验:在播 + 歌名变化/进度回零(精确点歌还要标题/歌手匹配)
↓ 命中即停;3 次不对就换下一个词;全失败 → 如实报错
另外还做了这些:
- 动态上下文:把「正在播放」写进模型的系统上下文(一行,≤30 token),模型不用问你就知道在放什么;
- 曲线事件:开启 DJ 模式后,每轮对话结束、超过冷却时间、且音乐已暂停时才自动续播,绝不打断你正在听的;
- 多标签单实例:播放状态在洛雪里,DSH 开几个标签都不会重复出声;
- 多平台:Windows / macOS / Linux(Scheme URL 分别走
cmd start/open/xdg-open)。
设置项
配置文件:~/.dsh/dsh-music-dj.json(人类可编辑,改完重启 DSH 生效;设置页也会写这里)
{
"engine": "lx",
"lx": { "apiPort": 23330, "exe": "" },
"dj": { "enabled": false, "cooldownMin": 10, "autoNext": false },
"scenes": {
"写代码": ["lofi 纯音乐", "轻音乐 工作", "study lofi"],
"专注": ["专注 纯音乐", "钢琴 纯音乐"],
"放松": ["轻松 纯音乐", "轻音乐 放松"]
}
}
scenes随便加、随便改中文;模型说「来点写代码的」时按这里的词去搜;dj.enabled默认关——不主动打扰,想让它自己切歌再打开;- 端口不是 23330 就改
lx.apiPort;洛雪装在非默认路径就填lx.exe。
合规声明
- 插件不内置、不分发任何音源,也不下载、不转存任何音频;所有播放行为发生在用户本机的洛雪中,音源由用户自行安装的第三方脚本提供。
- 洛雪是 Apache-2.0 + 补充协议 授权的第三方软件;本插件只调用其公开文档化的本地接口,不包含其代码。
- 请遵守各音乐平台的用户协议与版权规定;本插件不提供任何绕过付费/会员/版权保护的能力。
开发
node --test test/*.test.mjs # 纯函数单测(意图映射 / 播放校验 / 配置 / Scheme URL)
index.js Host:工具、动态上下文、事件、/music-dj-api
client.js Client:迷你播放条 + 设置页
lib/config.mjs 配置读写 + 默认场景表
lib/intent.mjs 意图 → 检索词;播放是否成功的判定(纯函数)
lib/lx.mjs 洛雪引擎适配器(HTTP + Scheme URL)
test/ node:test 单测
DESIGN.md 设计文档与取舍记录
Roadmap
- v0.2:SSE
/subscribe-player-status实时同步(曲末自动续播不再依赖轮询) - v0.2:
music_queue工具(AI 队列:一次排 5 首,曲末自动下一条) - v0.3:第二个引擎适配器(
mpv + yt-dlp,不装洛雪也能用) - v0.3:音源健康检查(记住哪些场景词最近失败过,自动跳过)
- 持续:Windows 之外的平台实测(
-hidden、Scheme 注册)
License
MIT