前言¶
在 DeepSeek Harness(DSH)里用语音输入,常规流程是:点一下输入框、点麦克风、说完、点插入、点发送。步骤多,桌面端打字和说话来回切换时尤其别扭。dsh-space-ptt 把这套流程压成一次长按:按住空格说话,松手后自动识别并发送。下面介绍这个插件的定位、安装、配置和实现方式。
插件由 wuyou0423 维护,归类为客户端插件,托管在 GitHub,源码仓库自带一个插件市场索引,也可以直接挂到索引源里安装。
这是什么¶
一句话定位:给 DSH 的语音输入加一个 push-to-talk(PTT)键,全局接管空格,实现「按住说话 → 松手自动发送」。
它不替代官方语音输入功能,而是叠在官方 Bundle 之上。前置条件是先用官方 Bundle @deepseek-ai/dsh-experimental-voice-input-bundle,并在设置里把语音模型下载准备好(麦克风按钮能点开)。插件还依赖官方 UI 的无障碍标签来定位按钮,属于外部契约,宿主大版本升级后需要回归一次。
核心功能¶
- 全局模式:焦点不在输入框时按空格,自动聚焦输入框开始录音,不用先点输入框。
- 松手即发:松手后停止识别、插入文字、发送,一气呵成。
- 安全旁路:输入框有草稿、有弹窗打开、按住不足 250ms、中文输入法选词中,插件都不接管,空格照常工作。
- 录音态易退:录音中按 Esc 取消,切走窗口(Alt+Tab)自动取消,不会卡在录音态。
- 空结果与超时不发送:识别结果为空不发;超过 30s 未返回结果,转写留在草稿里不发。
- 可关闭自动发送:改一个常量就能只把转写放进草稿,交由用户手动发送。
安装与启用¶
从 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"
启用前置条件¶
- 启用官方 Bundle 语音输入:
@deepseek-ai/dsh-experimental-voice-input-bundle。 - 在设置里把语音模型「下载并准备」好,确认麦克风按钮能点开。
不满足时插件完全不接管空格,空格照常是空格,属于保守的降级行为。
典型用法¶
打开 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 |
两个已踩过的坑¶
- 按住时的键盘重复事件。只拦第一个 keydown 不够,浏览器会持续发 repeat 事件,空格会灌进输入框。一旦草稿被改动,语音插件就不肯自动插入,只能手动点「插入文字」。所以录音期间必须持续
preventDefault。 - 识别完不一定自动插入。语音插件检测到草稿被改过时,会改成保留结果并让用户点「插入文字」。插件会替用户点这个按钮兜底。
这两个坑解释了为什么需要 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