dsh-pinpu:会话轮次轨随系统播放律动的 DSH 插件

前言

在 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 等)。插件 不读取 这些类名,而是:

  1. 在 [data-conversation-scroll] 内,按几何找一组兄弟 button:同一尺寸、同一右缘、固定垂直步长(约 10px),即认定为轮次轨。
  2. 给容器打 data-pinpu-rail,每条刻度自下而上编号 data-pinpu-tick="i"(最下方为 0)。
  3. 用一份带 !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 后在「频谱律动」里选设备与样式即可。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye