dsh-rail-equalizer:让轮次导航导轨跟着系统声音律动

前言

在 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

重启后宿主侧路由与采集消失;也可只关侧栏开关,立刻停止视觉效果。

典型用法

  1. 在 Windows 上按上述命令安装并重启 DSH Desktop。
  2. 打开对话页,确认侧栏「工作区」上方出现「律动」行。
  3. 打开右侧开关,播放音乐、视频或任意走默认输出设备的声音,观察轮次导航导轨随电平变化。
  4. 展开设置,按听感调整灵敏度、强度;需要频谱分布时保持「频谱」模式;需要整排呼吸或行波时切换对应运动方式。
  5. 若换过默认播放设备仍异常,可 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜