前言¶
在 DSH Desktop 里长时间对话时,右侧的「轮次导航」导轨负责在多条轮次之间快速跳转。它默认是静态刻度,和当前机器上正在播放的音频没有关系。若想在界面里做一点轻量的视觉反馈,常见做法是浏览器侧用麦克风或屏幕共享抓音——前者在戴耳机时往往抓不到系统混音,后者在 Chrome/Edge 里每次都要重新选共享目标,权限也不会持久化。
dsh-rail-equalizer(维护者 yuanyiHY,社区分类:趣味换装)针对的是另一类需求:只要声音从 Windows 默认播放设备出来,就让官方导轨实时律动,且不 patch 官方聊天 UI 组件。下面介绍它的采集方式、浏览器侧做法,以及安装与日常使用。
这是什么¶
插件全名 dsh-rail-equalizer,版本 0.1.0(MIT)。一句话定位:在 Windows 上通过宿主进程 WASAPI 回环读取默认播放设备的 PCM,经 SSE 推到浏览器;浏览器半只给导轨打标记、注入样式表和 CSS 变量,并插入侧栏控制行,不修改 @deepseek-ai/dsh-client-ui-chat 里的官方组件代码。
音频数据只在内存里算电平,不落盘;不申请麦克风、不录屏、不弹授权窗。戴耳机时只要系统默认输出正常,同样可以工作。
声音从哪里来¶
浏览器 API 无法满足「一次授权、长期抓系统混音」这类需求,因此重活放在 DSH 宿主(Node)侧:用 koffi 调用 Windows Core Audio COM,对默认渲染端点做 loopback 采集,机制与 OBS 抓桌面音频同类。
典型调用链如下(资料原文):
IMMDeviceEnumerator.GetDefaultAudioEndpoint(eRender)
→ IMMDevice.Activate(IAudioClient)
→ IAudioClient.Initialize(AUDCLNT_STREAMFLAGS_LOOPBACK)
→ IAudioClient.GetService(IAudioCaptureClient)
→ 轮询 GetBuffer / ReleaseBuffer
要点:
- 只读混音器交给声卡的数据,不改变音量、不影响其它程序。
- 跟随系统里设置的默认播放设备;若某播放器指定了独立输出,则抓不到那路声音。
- 预编译二进制通过 optional dependency
@koromix/koffi-win32-x64分发,README 说明装包即用,不依赖 Visual Studio / node-gyp。
package.json 声明 "os": ["win32"],非 Windows 上包管理器会拒装,而不是装完再崩溃。
为什么说不「动原组件」¶
官方导轨仍由 @deepseek-ai/dsh-client-ui-chat 渲染。插件不做 fork、不做 patch。浏览器半只做四件事:在导轨 <nav> 上加 data-dsh-eq;插入一张 <style> 用 CSS 覆盖;在 document.documentElement 写 --dsh-eq-* 变量;用 insertBefore 在侧栏插入「律动」控制行,设置面板走官方 shell.overlay 插槽。
律动只叠加 scale、filter、box-shadow,不改 width / height / opacity / background-color,并排除 aria-busy="true" 的生成中轮次。关闭时会移除属性、样式表并清空变量,导轨恢复与未安装时一致。
核心功能¶
侧栏控制与设置¶
侧栏里、官方「工作区」区块正上方会出现一行「律动」开关。点整行(开关以外)展开/收起设置;点右侧开关直接开/关。
设置项(README 表格)包括:
| 项目 | 说明 |
|---|---|
| 总开关 | 关闭后移除样式表,非简单置零 |
| 运动方式 | 频谱 / 脉动 / 摆动 / 行波,四选一 |
| 灵敏度 | 0.4–3.0 |
| 强度 | 0.2–2.0 |
| 低频冲击 | 0–2.0 |
| 行波 | 仅行波模式:关则刻度原地起伏 |
| 波速 | 行波周期 0.46×–2.4×(滑杆 2600–500ms) |
设置保存在浏览器 localStorage,键名 dsh-rail-eq:settings:v1。面板底部有实时电平条与后端状态(设备格式、连接、报错)。
四种运动方式¶
| 方式 | 观感 | 驱动 |
|---|---|---|
| 频谱(默认) | 刻度像播放器频谱条,低→高排开 | 宿主 16 段对数频段 → 按刻度数铺到 N 根 |
| 脉动 | 整排同相位伸缩 | 全局电平 + 相位 |
| 摆动 | 刻度不变形,导轨左右摆 | 电平 × 摆动量 |
| 行波 | 相位错开,波沿轨道向上 | 电平 + 每刻度相位 |
频谱模式在宿主侧做 2048 点 FFT + Hann 窗,40Hz–16kHz 对数切 16 段。若客户端热重载而宿主未更新、没有频段数据,频谱会自动降级为整排一起动;自检字段 bandsAvailable 可区分状态。
宿主路由与资源¶
采集按需启动:有浏览器连接 SSE 才开始抓,最后一个客户端断开约 8 秒后停止;页面未打开时不占 CPU。电平约 30Hz 经 SSE 推送,浏览器用 requestAnimationFrame 平滑。系统开启「减少动态效果」(prefers-reduced-motion)时,仅保留柔和亮度变化。
调试与运维接口(资料原文):
| 路由 | 用途 |
|---|---|
GET /rail-eq/status |
完整状态,含 clientReport |
GET /rail-eq/level |
单发电平,不启动采集 |
GET /rail-eq/stream |
SSE 流(浏览器半使用) |
POST /rail-eq/restart |
重启采集 |
POST /rail-eq/report |
浏览器自检回传 |
安装与启用¶
仅 Windows。 安装前建议自行查看 GitHub 源码与 MIT 许可证;插件以当前 DSH 进程权限运行。
官方安装命令:
dsh plugin --profile desktop add github:yuanyiHY/dsh-rail-equalizer
装完后重启 DSH Desktop,宿主才会加载 bundle 并注册路由。
从本地目录开发(路径中不能有空格):
dsh plugin --profile desktop add link:<克隆到的绝对路径>
卸载:
dsh plugin --profile desktop remove dsh-rail-equalizer
重启后宿主侧路由与采集消失;也可只关侧栏开关,立刻停止视觉效果。
典型用法¶
- 在 Windows 上按上述命令安装并重启 DSH Desktop。
- 打开对话页,确认侧栏「工作区」上方出现「律动」行。
- 打开右侧开关,播放音乐、视频或任意走默认输出设备的声音,观察轮次导航导轨随电平变化。
- 展开设置,按听感调整灵敏度、强度;需要频谱分布时保持「频谱」模式;需要整排呼吸或行波时切换对应运动方式。
- 若换过默认播放设备仍异常,可 POST 重启采集(将
<DSH端口>换成实际端口):
curl -X POST http://127.0.0.1:<DSH端口>/rail-eq/restart
适用场景与注意¶
适合谁: 在 Windows 上使用 DSH Desktop、希望聊天界面导轨对系统播放声音做轻量视觉反馈、且不想碰麦克风或屏幕共享授权的用户。社区目录归类为「趣味换装」,不改变对话能力本身。
务必注意:
- macOS / Linux 未实现;资料说明 macOS 理论上可用 ScreenCaptureKit 或虚拟声卡,但本仓库未做。
- 仅默认播放设备;虚拟声卡或独占模式可能导致
Initialize(LOOPBACK)失败(如 0x88890008),可切换默认输出再试。 - 混音格式需为 IEEE float32 或 PCM16,否则可能出现「不支持的混音格式」;改为 16/24 bit、44100/48000Hz 常见可解。
- 导轨 DOM 若被官方大改,插件可能静默不生效;排查可看
GET /rail-eq/status的clientReport(railFound、matched、tickCount等)。 - 界面文案中英混合,未接入 DSH locale。
导轨完全不动时(README 摘要):先看设置面板底部状态;确认声音走默认设备;确认轮次导航仍在页面上;仍无效则查 clientReport。
结尾¶
DSH 生态强调「一切皆插件」;SkillHub 等社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系。dsh-rail-equalizer 把 WASAPI 回环放在宿主、把视觉限制在 CSS 变量层,在 Windows 上提供零授权弹窗的导轨律动,关闭即可恢复官方样式。
- 目录页:https://www.skillhub.cn/plugins/yuanyiHY/dsh-rail-equalizer
- 源码与说明:https://github.com/yuanyiHY/dsh-rail-equalizer