前言¶
在 DeepSeek Harness(DSH)里,对话 transcript 右侧有一条自带的「轮次轨」(turn rail):一排小刻度对应各轮对话,默认还会把最新一轮标亮。如果你一边写智能体、一边听歌或开会外放,这条轨只是静态装饰,和机器里正在播放的声音没有关系。
社区插件 dsh-pinpu(README 里也叫 Spectrum Rail / 频谱律动)接管的是 DSH 自己的那条轮次轨,不是另画一层 UI。它用 WASAPI loopback 抓取默认输出设备上你实际听到的声音,做频谱后驱动每条刻度的长度;同时把 DSH 内置的「最新轮次常亮」改成更接近 Codex 的行为:默认不亮,只有指针悬停时才高亮,点击跳转逻辑不改。
这是什么¶
- 仓库: sqslm/dsh-pinpu
- 维护者: sqslm
- 社区目录: SkillHub 插件页(独立社区站点,与 DeepSeek / 幻方无官方从属关系)
- 分类:趣味换装
- 当前包版本(
package.json):0.4.0,许可证 MIT
插件在 DSH「一切皆插件」的 Cordis 模型里拆成两半:宿主侧负责采集与 FFT,浏览器侧只负责把频带映射到轮次轨上的刻度样式。
核心功能¶
轮次轨:几何发现,不依赖内部 class 名¶
DSH 轮次轨在构建后会是带 hash 的 CSS Module 类名(如 mark、markActive 等)。插件 不读取 这些类名,而是:
- 在
[data-conversation-scroll]内,按几何找一组兄弟button:同一尺寸、同一右缘、固定垂直步长(约 10px),即认定为轮次轨。 - 给容器打
data-pinpu-rail,每条刻度自下而上编号data-pinpu-tick="i"(最下方为 0)。 - 用一份带
!important的样式覆盖:所有刻度先统一为暗淡色与相同长度,从而去掉内置高亮;:hover只提亮指针下的一条;播放时长度由transform: scaleX(var(--pinpu-scale))表示各频带电平,频带在 45 Hz–16 kHz 上对数排布,低频靠近轨的底部(靠近最新一轮)。若某条刻度处于生成动画(markBusy,通过::before动画检测),则不改其脉冲。
点击跳转未被改写:只重样式 ::before,命中区域仍是应用自己的按钮,实测预览里点击仍会交给应用处理器。
音频:系统输出 loopback,而非麦克风¶
数据路径可以概括为:
任意播放器 → 默认输出设备 → WASAPI loopback → 频谱 → 轮次轨
要点如下:
- 采集的是 默认输出设备的 loopback,即你耳朵听到的混音,不需要虚拟声卡,也不绑定某个播放器。
- 宿主进程运行随插件自带的
vendor/loopback.py,使用 DSH 自带的 CPython 3.12(插件自行查找);底层为 vendored PyAudioWPatch(带 loopback 的 PortAudio 构建),以 mono float32 PCM 从 stdout 流出,宿主做 FFT 与频带映射。 - 渲染进程 没有 采集代码,也 不需要 麦克风权限或用户手势。
- README 写明:目前仅 Windows(WASAPI loopback)。Linux 需另选
getUserMedia监视端或 PulseAudio.monitor等方案,尚未实现。
设置里 device 为空则跟随默认输出;若要在耳机播放但采集板载声卡 loopback,可在设备列表里指定对应的 [Loopback] 设备。
高亮与律动以外的行为¶
| 能力 | 说明 |
|---|---|
| 关闭内置最新轮高亮 | disableActiveHighlight(默认 true) |
| 仅悬停高亮 | hoverHighlight(默认 true) |
| 静音后停动 | restoreOnSilence(默认 true) |
| 长度阈值闪动 | hotScale(默认 0.85,按可见长度 --pinpu-scale 比较) |
| 随机闪动 | spark(默认 1.5,每秒期望次数;静音不触发) |
| 无音频演示 | demo 用合成波形驱动刻度 |
两种「额外点亮」都是在已有刻度上改亮度,不新增 DOM;markBusy 与指针悬停优先级高于这些效果。
安装与启用¶
安装方式以仓库 README 为准,不要用未在文档出现的 CLI 拼写。
方式一:从 GitHub 安装(与 DSH 插件页流程一致)
在 DSH 的插件管理里,像安装其他 GitHub 插件一样添加仓库 sqslm/dsh-pinpu(也可从 SkillHub 目录页 跳转到同一来源)。
方式二:本地打包进 profile
在插件仓库根目录执行:
node tools/install-profile.mjs
脚本会 pnpm pack,再把包写入当前 profile 的 dsh.profile.bundles。卸载加 --uninstall,仅查看计划加 --dry-run。
首次安装后重启 DSH 一次:宿主侧(采集、路由)在进程启动时加载,浏览器侧随页面加载。
依赖方面:无需单独 npm install 插件依赖;原生采集模块随包分发,但需要可用的 CPython 3.12(由 DSH 提供)。package.json 要求 Node >=20。
典型用法与设置¶
设置入口¶
打开 Settings → 频谱律动。配置项分宿主(信号)与浏览器(呈现),均为 .volatile(),改完即生效;但 安装后首次仍建议重启一次 以加载宿主半部。
常用字段(默认值见 README 表格):
| 字段 | 侧 | 含义摘要 |
|---|---|---|
enabled |
host | 总开关;关闭则不启动采集进程 |
device |
host | 空=默认输出;否则指定 [Loopback] 设备 |
fftSize / smoothing / gain / autoGain / gate |
host | FFT 窗口、平滑、增益、按频带归一、静音门限 |
minHz / maxHz |
host | 频谱范围,默认 45 / 16000 |
minScale / maxScale |
browser | 刻度最短/最长(相对 20px 的比例) |
invert |
browser | 低频在轨顶部而非底部 |
colorMode / customColor / glow |
browser | 主题色、按频带着色、自定义色、亮度随电平 |
demo |
browser | 无采集时用合成波形预览律动 |
自测与验证(维护者脚本)¶
仓库提供面向开发者的校验命令,例如:
node tools/verify/rail-preview.mjs
预览页用已安装 dsh-client-ui-chat 里提取的真实样式类名,加载真实的 lib/client.js,仅 stub /api/dsh-pinpu/spectrum,用于核对刻度长度与悬停高亮是否符合预期。
适用场景与注意¶
适合谁
- 在 Windows 上用 DSH 长时间对话,希望界面有一点与系统播放同步的反馈,又不想改 transcript 布局的人。
- 想关掉「最新一轮常亮」、改成「只有鼠标指到才亮」的轮次轨交互的人。
务必知晓的限制与风险
- 平台:音频采集路径当前仅 Windows WASAPI loopback;在 Linux 上安装后无法获得同等采集能力。
- 权限与进程:插件以当前 DSH 进程权限运行,会启动 Python loopback 子进程并暴露宿主路由;安装前应在 GitHub 阅读源码与 THIRD-PARTY.md,确认许可证(MIT)与 vendored 组件可接受。
- 隐私:loopback 捕获的是本机默认输出上的混音(音乐、会议外放等),请只在可信环境启用
enabled。
结尾¶
dsh-pinpu 把 DSH 对话右侧原有的轮次轨变成音频反应式频谱条,并用悬停高亮替代内置的最新轮标记,宿主采集、浏览器呈现分工清楚。若要在本机试用,从插件页添加 sqslm/dsh-pinpu 或运行 node tools/install-profile.mjs,重启 DSH 后在「频谱律动」里选设备与样式即可。