前言¶
DeepSeek Harness(DSH)桌面会话页右侧有一列 turn rail 跳转锚点,用来在长对话里快速定位各轮次。默认样式是静态几何:当前阅读的锚点最长,未加载的最短。若希望在写代码、查资料时仍保留这层导航,又想让界面有一点与当前播放内容同步的反馈,可以在不改锚点颜色、不盖掉宿主状态逻辑的前提下,用频谱数据只驱动「条的长度」。
下面介绍社区插件 dsh-audio-rail-macos(维护者 Blueteemo,MIT,npm 包名 dsh-audio-rail-macos)。它仅面向 macOS 14.2+,通过 Core Audio Process Tap 采集本机正在播放的音频,在浏览器侧把 12 段对数频谱映射到右侧锚点的小白条长度上。分类上在 SkillHub 目录里属于「趣味换装」;仓库当前 GitHub 星标为 1。DSH 生态主张「一切皆插件」,SkillHub 等目录站与 DeepSeek / 幻方无官方从属关系,安装前仍建议自行查看源码与许可证。
这是什么¶
一句话:macOS 专用 DSH 插件,让会话页右侧锚点随 Mac 当前播放音乐的 12 段真实频谱脉冲,只改 2px 白条长度,不叠加颜色或发光,也不覆盖「正在看最长、未加载最短」等宿主规则。
音频分析在本地 Swift 采集器里完成;浏览器只通过宿主在 127.0.0.1 上提供的 loopback 路由读取每帧 12 个 0..1 的数值,音频本身不上传。
核心功能¶
视觉与频谱¶
- 每根锚点对应一条 2px 高 的小白条;音乐只是在宿主已有的长度系数上叠加脉冲,不加颜色、不加发光。
- 12 段对数频谱(约 45 Hz – 16 kHz),低频在列底部、高频在顶部,整列像竖起来的频谱仪。
- 33 ms 一帧,带 attack/release 平滑;停止播放后条会自行落回。
采集与生命周期¶
- 有页面在看才采集:至少一个标签页订阅时采集器才运行;最后一个订阅断开 15 秒 后自动退出;刷新页面可接上仍在运行的实例。
- 不留下孤儿进程:宿主把 stdin 交给采集器,宿主退出(含崩溃)时管道关闭,采集器读到 EOF 即退出,避免长期占用系统音频或录音指示灯常亮。
- 换默认输出设备(耳机、蓝牙等)时采集器会重建 tap,无需重装插件。
平台与二进制¶
- 要求 macOS 14.2 及以上(Core Audio Process Tap)。
- 发布包内采集器为 arm64 + x86_64 通用二进制,Apple Silicon 与 Intel 均可使用。
package.json声明宿主引擎dsh>= 0.2.0-rc.1,且"os": ["darwin"],非 macOS 不适用。
权限¶
首次运行需在 「系统设置 → 隐私与安全性 → 音频录制」 授权;被授权的是拉起采集器的进程(桌面端为 DeepSeek Harness 本身)。拒绝授权不会弹错,页面 simply 不动;/audio-rail/status 会显示 permission-denied,且不会空转重试。授权后 刷新页面(⌘R) 即可恢复订阅。
安装与启用¶
先做安装,再刷新会话页并播放音乐验证。
从 npm 安装:
dsh plugin --profile desktop add dsh-audio-rail-macos
从 GitHub 安装(仓库已带编译好的通用二进制,无需本地 Swift 工具链):
dsh plugin --profile desktop add github:Blueteemo/dsh-audio-rail-macos
本地开发(改动即时可见):
dsh plugin --profile desktop add link:/path/to/dsh-audio-rail-macos
装完后 刷新页面(⌘R),播放任意系统音频即可观察右侧锚点。
卸载:
dsh plugin --profile desktop remove dsh-audio-rail-macos
典型用法与自检¶
日常¶
安装并授权后,保持 DSH 会话页打开,用 Music、浏览器或 IDE 播放音频即可;无需额外配置文件。插件向 @deepseek-ai/dsh-client-ui-chat 注入客户端逻辑(见 package.json 的 dsh.client.inject)。
用 curl 看状态与帧¶
宿主在 127.0.0.1 上暴露 loopback 路由。将端口换成 GUI 地址栏中的 http://127.0.0.1:<port>:
curl -s http://127.0.0.1:<port>/audio-rail/status
期望形如 {"platform":"darwin","status":"listening",...}。status 可能依次为 idle(无人订阅)、starting、listening、permission-denied、error、unsupported。
查看实时帧(每行一个 event: frame,bands 为 12 个 0..1):
curl -Ns http://127.0.0.1:58651/audio-rail/events | head -20
(示例端口 58651 需按你本机实际端口替换。)
单独跑采集器(调试 native 层):
./native/bin/dsh-audio-rail-tap | head -3
输出为 NDJSON,约 33 ms 一帧。
实现要点(供排查参考)¶
native/ 内为自写 Swift 采集器:Core Audio Process Tap → 2048 点 FFT(Hann 窗)→ 12 段对数频段 → 逐段相对归一化,stdout 输出 NDJSON。预编译二进制位于 native/bin/dsh-audio-rail-tap;若改源码需在本机执行:
npm run build:native
浏览器端思路(属性选择器跨 hash、脉冲乘在宿主状态系数上、虚拟列表重扫等)借鉴 dsh-audio-rail(MIT);Core Audio 相关 Swift 改编自 dsh-bgm(MIT)。详见仓库 README 的 Credits。
适用场景与注意¶
适合谁: 在 macOS 14.2+ 上使用 DSH 桌面版、希望右侧 turn rail 随本机播放内容有轻微律动、且接受一次「音频录制」权限的用户。偏展示与氛围,不改变对话能力。
务必注意:
- 插件以 当前 DSH 进程权限 运行;安装前应阅读仓库源码与 MIT 许可证,确认隐私边界(README 说明:采集在本地完成,浏览器只读 12 个数字)。
- 无权限时界面无动静属预期行为,先查
/audio-rail/status是否为permission-denied。 - Linux / Windows 用户应寻找其他平台方案;本包
os字段仅darwin。
结尾¶
dsh-audio-rail-macos 把 Mac 系统播放音频的 12 段真实频谱接到 DSH 会话页右侧锚点上,只动白条长度、保留宿主锚点状态语义,并在无订阅时自动停采、避免孤儿进程。若需要目录简介与仓库详情,可分别打开 SkillHub 插件页与 GitHub README:
- 目录页:https://www.skillhub.cn/plugins/Blueteemo/dsh-audio-rail-macos
- GitHub:https://github.com/Blueteemo/dsh-audio-rail-macos