前言¶
在 DeepSeek Harness 的插件生态中,Web profile 的语音输入往往需要调用外部 API 或依赖云端服务。dsh-hold-to-talk 插件提供了一个无需密钥、完全离线的语音输入方案。它复用了微信桌面版“长按说话”的交互逻辑:在输入框按住鼠标,说话,松开将文本写入草稿。识别完全在本地运行,音频不会离开机器。
是什么¶
这是一个为 DeepSeek Harness Web composer 提供本地语音输入能力的客户端插件。由 wangzhanchao883 维护。它通过 sherpa-onnx 调用 SenseVoice 模型,在浏览器端完成实时语音识别。
核心功能¶
- 长按说话交互:在输入框上按住鼠标静止 ≥400ms 开始录音,松开将文本插入草稿。
- 本地识别:使用 sherpa-onnx 运行 SenseVoice 模型,无需 API 密钥,离线运行,音频不离开机器。
- 实时预览:录音时浮层显示实时转录文本,仅作为预览,不写入草稿。
- 取消机制:录音过程中上滑或按 Esc 键可取消。
- 自动完成:按住超过 60 秒自动完成录音并插入。
- 线程优化:解码运行在 Web Worker 线程中,避免阻塞主线程。
安装与配置¶
安装¶
确保已安装 DeepSeek Harness 并运行 Web profile(dsh web),执行以下命令:
dsh plugin --profile web add dsh-hold-to-talk
安装后重启 dsh web 并刷新页面(Ctrl+Shift+R)。
配置¶
插件的默认配置位于 profile 的 cordis.patch.yml 文件中。在 dsh-hold-to-talk 项下添加 config 字段即可覆盖默认值:
- id: dsh-hold-to-talk
name: dsh-hold-to-talk
config:
holdThresholdMs: 400 # 长按触发阈值
cancelSlidePx: 60 # 上滑取消距离
interimIntervalMs: 1500 # 实时预览间隔
maxWindowSec: 6 # 预览解码窗口
minHoldMs: 250 # 最小触发时间(防误触)
maxHoldMs: 60000 # 最大自动完成时间
autoSend: false # 是否自动发送(默认仅插入)
language: auto # 语言模式
useItn: true # 是否启用逆文本归一化
numThreads: 2 # 引擎线程数
典型用法¶
- 开始录音:在 DSH Web 的输入框上按住鼠标,保持静止 ≥400ms。此时会弹出一个浮层,显示“松开发送 · 上滑取消”。
- 说话与预览:说话过程中,浮层实时显示转录文本(预览)。文本不会立即写入输入框。
- 插入文本:松开鼠标,浮层中的完整文本会被插入到输入框的草稿中。
- 取消录音:录音过程中上滑 >60px,或按 Esc 键,可取消本次录音。
- 自动完成:按住超过 60 秒,录音自动完成并插入文本。
- 预取模型:首次使用会自动下载模型(约 230MB)。若需提前下载,可在插件目录执行:
npm run model:fetch
注意事项¶
- 环境要求:DeepSeek Harness 必须运行在 Web profile 下(
dsh web)。宿主机器需安装 Node.js >=22.19 或 >=24。 - 浏览器兼容:需要 Chromium 内核浏览器(Chrome/Edge),并允许麦克风权限。
- 磁盘占用:首次运行需下载模型文件,占用约 230 MB 磁盘空间。
- 预览与草稿:浮层显示的“实时转录”仅为预览,不会写入草稿。只有松开鼠标后的完整音频解码结果才会被插入。
- 重采样机制:音频重采样总是从样本 0 开始,不支持增量式重采样。
总结¶
dsh-hold-to-talk 通过本地化 ASR 和 Web Worker 解码,为 DSH Web 提供了轻量级、隐私友好的语音输入能力。对于需要在本地处理敏感数据或离线工作的场景,该插件提供了可行的解决方案。
插件目录:https://www.skillhub.cn/plugins/wangzhanchao883/dsh-hold-to-talk
GitHub:https://github.com/wangzhanchao883/dsh-hold-to-talk