dsh-audio-rail-macos: Syncing DSH Session Anchors with Mac System Audio

前言

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
羽毛球分组比赛记分
小程序二维码

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

Xiaoye