dsh-space-ptt:给 DSH 语音输入加一个对讲机键

前言

在 DeepSeek Harness(DSH)里用语音输入,常规流程是:点一下输入框、点麦克风、说完、点插入、点发送。步骤多,桌面端打字和说话来回切换时尤其别扭。dsh-space-ptt 把这套流程压成一次长按:按住空格说话,松手后自动识别并发送。下面介绍这个插件的定位、安装、配置和实现方式。

插件由 wuyou0423 维护,归类为客户端插件,托管在 GitHub,源码仓库自带一个插件市场索引,也可以直接挂到索引源里安装。

这是什么

一句话定位:给 DSH 的语音输入加一个 push-to-talk(PTT)键,全局接管空格,实现「按住说话 → 松手自动发送」。

它不替代官方语音输入功能,而是叠在官方 Bundle 之上。前置条件是先用官方 Bundle @deepseek-ai/dsh-experimental-voice-input-bundle,并在设置里把语音模型下载准备好(麦克风按钮能点开)。插件还依赖官方 UI 的无障碍标签来定位按钮,属于外部契约,宿主大版本升级后需要回归一次。

核心功能

  1. 全局模式:焦点不在输入框时按空格,自动聚焦输入框开始录音,不用先点输入框。
  2. 松手即发:松手后停止识别、插入文字、发送,一气呵成。
  3. 安全旁路:输入框有草稿、有弹窗打开、按住不足 250ms、中文输入法选词中,插件都不接管,空格照常工作。
  4. 录音态易退:录音中按 Esc 取消,切走窗口(Alt+Tab)自动取消,不会卡在录音态。
  5. 空结果与超时不发送:识别结果为空不发;超过 30s 未返回结果,转写留在草稿里不发。
  6. 可关闭自动发送:改一个常量就能只把转写放进草稿,交由用户手动发送。

安装与启用

从 GitHub 安装

不需要 npm,直接用官方插件命令加 GitHub 源:

dsh plugin --profile desktop add "github:wuyou0423/dsh-space-ptt"

# 或者指定分支
dsh plugin --profile desktop add "github:wuyou0423/dsh-space-ptt#main"

装完要重启 DSH,Host 端是空壳,重启主要是让客户端 bundle 生效。

从 npm 安装

插件市场靠 npm 收录,发布到 npm 后可用:

dsh plugin --profile <你的 profile> add dsh-space-ptt

从本地目录开发

改代码时用 link 指向本地仓库:

dsh plugin --profile desktop add "link:/path/to/dsh-space-ptt"

启用前置条件

  1. 启用官方 Bundle 语音输入:@deepseek-ai/dsh-experimental-voice-input-bundle。
  2. 在设置里把语音模型「下载并准备」好,确认麦克风按钮能点开。

不满足时插件完全不接管空格,空格照常是空格,属于保守的降级行为。

典型用法

打开 DSH 窗口,焦点在哪都行,流程如下:

打开 DSH(焦点在哪都行)
  ↓ 按住空格
开始录音(输入框自动获得焦点)
  ↓ 松手
停止识别 → 自动插入文字 → 自动发送

不接管的边界

场景 行为
焦点不在输入框,按空格 自动聚焦输入框,开始录音(全局模式)
输入框里有草稿 不接管,空格照常输入
有弹窗 / 对话框打开 不接管
按住不到 250ms 就松手 当误触,取消录音,不发送
录音中按 Esc 取消本次录音
录音中切走窗口(Alt+Tab) 自动取消
识别结果为空 不发送
识别超时 30s 不发送,转写留在草稿里
中文输入法选词时按空格 不接管(检测 isComposing)

配置

改 lib/client.js 顶部的常量,然后刷新页面即可生效,不需要重新打包:

const AUTO_SEND = true;        // false = 只把转写放进草稿,不自动发送
const MIN_HOLD_MS = 250;       // 最短按住时长,短于此当误触
const STOP_TIMEOUT_MS = 30000; // 等待识别结果的上限
const GLOBAL_SPACE = true;     // false = 恢复成「必须先点进输入框」
const POLL_MS = 120;           // 轮询识别状态的间隔

不喜欢全局空格的,把 GLOBAL_SPACE 设成 false 即可,牺牲一点方便度换取更安全的输入行为。

它怎么实现的

插件不 import 宿主内部模块,而是通过官方 UI 上的无障碍标签找到按钮并点击。这样升级宿主时大概率不会碎,官方改文案时只改 SEL_* 常量即可。

目标 aria-label 来源包
开始录音 / 停止并识别 / 取消 同名 @deepseek-ai/dsh-experimental-client-ui-voice-input
插入文字 插入文字 / Insert text 同上
发送消息 发送消息 / Send message @deepseek-ai/dsh-client-ui-conversation

两个已踩过的坑

  1. 按住时的键盘重复事件。只拦第一个 keydown 不够,浏览器会持续发 repeat 事件,空格会灌进输入框。一旦草稿被改动,语音插件就不肯自动插入,只能手动点「插入文字」。所以录音期间必须持续 preventDefault。
  2. 识别完不一定自动插入。语音插件检测到草稿被改过时,会改成保留结果并让用户点「插入文字」。插件会替用户点这个按钮兜底。

这两个坑解释了为什么需要 POLL_MS 轮询识别状态,以及为什么要知道「插入文字」按钮的 aria-label。

适用场景与注意

适合「桌面端为主、语音输入高频使用」的 DSH 开发者或重度用户:想用按住说话的交互、又不想改宿主代码的人。

注意几点:

  • 插件只在 Web / 桌面端 Web UI 生效,配置里声明 dsh.client.platform: web。
  • 全局空格意味着焦点在空白处按空格会启动录音,需要时就把 GLOBAL_SPACE 关掉。
  • 依赖官方 UI 的 aria-label,属外部契约,宿主大版本升级后要回归一次「按住说话 → 插入 → 发送」的完整链路。
  • 插件以当前 dsh 进程权限运行,安装前建议先检查源码与许可证(仓库为 MIT)。
  • 从第三方源安装插件时,请确认源码内容与打包产物一致,不要直接在生产环境运行未经审阅的代码。

版本与运行环境:0.2.0,要求 dsh >=0.2.1-rc.2 <0.3.0、node >=20,License 为 MIT。

插件市场索引

仓库自带一个 DSH 插件市场索引(format 1,git 源),不经过 npm 也能在「插件 → 发现」里浏览安装:

https://raw.githubusercontent.com/wuyou0423/dsh-space-ptt/main/market/index.json

在 DSH 里:插件 → 发现 → 添加索引源,粘贴上面的 URL,刷新后即可看到「按住空格说话(对讲机)」。索引文件在 market/index.json,格式由 @deepseek-ai/dsh-plugin-market-index 校验。

小结

dsh-space-ptt 的价值在于把 DSH 语音输入的入口从一连串点击变成一次空格长按,同时保留了草稿、弹窗、输入法等场景下的克制行为。代价是引入了一层对官方 UI aria-label 的依赖,升级宿主时要记得回归。如果你的日常就是边打字边说话,值得装一个试试。

  • 目录页:https://www.skillhub.cn/plugins/wuyou0423/dsh-space-ptt
  • GitHub:https://github.com/wuyou0423/dsh-space-ptt
羽毛球分组比赛记分
小程序二维码

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

小夜