Nothree-code/voco-input-sh
DeepSeek Harness (dsh web) 语音输入插件:集成 VocoType 本地离线识别,识别结果自动插入聊天输入框(自动部署/防重复/持续输入)
Project Overview项目介绍
voco-input-sh is a persistent voice input plugin for DeepSeek Harness (dsh web). It adds a microphone button to the chat input toolbar, opening a recording panel that streams offline Chinese ASR via the local VocoType engine (Paraformer + FSMN-VAD + CT-Transformer) and auto-inserts transcribed text with deduplication. The plugin detects, launches, and even auto-deploys VocoType, closing the full loop from log polling to draft insertion. Caveat: first run downloads a ~25MB installer plus a 1.6GB model, and installation requires pnpm plus a full dsh web restart after copying into the profile's packages/ directory.
voco-input-sh 是 DeepSeek Harness(dsh web)的持久语音输入插件,在聊天框工具行提供麦克风按钮,弹出录音面板,通过本地 VocoType 引擎进行中文离线识别(Paraformer + FSMN-VAD + CT-Transformer),识别结果自动去重并插入输入框。插件自动检测、启动乃至部署 VocoType,完成"检测/启动/部署→读日志→去重→插入"闭环。首次使用会自动下载约 25MB 安装包及 1.6GB 模型。Host 与 Client 通过 token 校验路由通信,需配合 pnpm 安装到 dsh profile。
请帮我了解并安装插件:【voco-input-sh】【https://github.com/Nothree-code/voco-input-sh】
Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。
Or use CLI install (for developers)或使用命令行安装(适合开发者)
CLI Install命令行安装
dsh plugin --profile web add github:Nothree-code/voco-input-sh
把 Nothree-code/voco-input-sh 加入你的 DSH 配置(web profile)即可启用。
READMEREADME
voco-input-sh
DeepSeek Harness(dsh web)持久语音输入插件:在聊天输入框旁提供麦克风按钮,弹出录音面板,把本地语音识别软件 VocoType 的识别结果自动插入输入框。
基于 VocoType(开源离线语音输入,Paraformer 中文识别 + FSMN-VAD + CT-Transformer 标点),本插件负责「检测/启动/自动部署 VocoType → 读取识别日志 → 去重 → 自动插入输入框」的完整闭环。
功能特性
- 🎙 麦克风按钮:输入框工具行右侧,千问风格图标,hover 高亮、录音中红点呼吸
- 🪟 录音面板:输入框上方弹出,波形动画 + 状态提示 + 累计计数(已插入 N 条)
- 🚀 自动准备引擎:检测 VocoType 进程 → 未运行自动启动 → 未安装自动下载官方安装包(NSIS 静默安装到
%LOCALAPPDATA%\Programs\VocoType) - ✂️ 防重复插入:VocoType 会把文字粘贴到焦点窗口,插件插入前检查草稿是否已包含该文本,避免双份
- 🔁 持续输入:点一次按钮开始,连续说多句全部自动插入,再点按钮结束
- 🔧 错误重试:面板出错时提供「重试」按钮
- ⚡ mtime 优化轮询:日志文件无变化时不重复读取
- 🔄 日志轮转自适应:VocoType 重启或日志轮转后自动重设读取游标,不会出现「说了话却不再插入」
- 💾 路径动态探测:日志路径基于
%LOCALAPPDATA%,exe 探测 5 个常见安装位置,换机器可用
安装
将本包放入 dsh profile 的
packages/目录(例如C:\Users\<你>\.dsh\profiles\web\packages\voco-input-sh)在 profile 根目录安装:
cd <你的 profile 目录> # 例如 C:\Users\<你>\.dsh\profiles\web pnpm add "file:./packages/voco-input-sh"在
cordis.patch.yml添加挂载行:- insert: - id: voco-input-sh name: 'voco-input-sh'重启 dsh web,麦克风按钮自动出现在聊天输入框工具行。
依赖项:需要 pnpm。VocoType 会自动部署,无需预装(首次会自动下载约 25MB 安装包并静默安装,模型约 1.6GB 由 VocoType 首次启动时下载)。
使用
- 点击输入框右侧 🎙 按钮 → 弹出录音面板(波形动画 +「按住 AltRight 说话」)
- 按住
AltRight说话,松开 - 识别文字自动插入输入框(若 VocoType 已粘贴到输入框则自动去重)
- 连续说多句会全部按顺序插入;再点按钮(或面板 ✕)结束
工作原理
┌─────────────┐ 识别完成 ┌──────────────────┐ 写日志 ┌────────────────────────┐
│ VocoType │ ──────────► │ 剪贴板 + Ctrl+V │ ────────► │ %LOCALAPPDATA%\VocoType\│
│ (AltRight) │ │ (粘贴到焦点窗口) │ │ logs\VocoType.log │
└─────────────┘ └──────────────────┘ └───────────┬────────────┘
│ 轮询(600ms, mtime优化)
┌─────────────────────────┐ setDraft(草稿拼接) ┌────────────────────▼─────────┐
│ 输入框(React 受控) │ ◄──────────────────────│ 插件 Client(slot 面板) │
└─────────────────────────┘ │ 草稿包含→跳过(去重) │
│ 未包含→拼接插入 │
└─────────────┬───────────────┘
fetch /dsh-voco-*
┌─────────────▼───────────────┐
│ 插件 Host(webServer 路由) │
│ ensure / baseline / poll │
└────────────────────────────┘
- Host(
lib/index.js):Node ESM,webServer注册三条 HTTP 路由(/dsh-voco-ensure、/dsh-voco-baseline、/dsh-voco-poll),node:fs直读日志、child_process调 PowerShell 检查/启动/部署 VocoType - Client(
lib/client.js):__ModuleLoader__bundle,slots注册按钮(conversation.input.right)与面板(conversation.input.dock),fetch轮询路由,inputActions.setDraft()写入输入框
开发与同步
源码与运行副本(node_modules/voco-input-sh)需保持一致。修改 packages/voco-input-sh/ 下的 package.json、lib/index.js、lib/client.js 后,在包目录执行:
powershell -ExecutionPolicy Bypass -File sync.ps1
然后重启 dsh web 生效。
目录结构
voco-input-sh/
├── package.json # 包定义(dsh.client 声明)
├── lib/
│ ├── index.js # Host:HTTP 路由(ensure/baseline/poll)
│ └── client.js # Client:按钮 + 录音面板(slots)
├── sync.ps1 # 一键同步到 node_modules
├── CHANGELOG.md # 版本变更记录
└── README.md
DSH 兼容性
已验证宿主版本:dsh 0.1.5-rc.2。
本插件依赖的宿主契约及核对结果:
| 依赖面 | 契约 | 0.1.5-rc.2 |
|---|---|---|
| 清单 | dsh.client.platform = "web" + exports["./client"] |
未变 |
| 客户端 bundle | window.__ModuleLoader__.load({ id, factory }) |
未变 |
| 插槽 | conversation.input.right、conversation.input.dock |
仍存在 |
| 插槽 props | InputZone = { session, input }、InputState.draft、inputActions.setDraft(text) |
未变 |
| Host 路由 | webServer.register({ kind: 'exact', path, handler }) |
未变 |
客户端 inject |
插件对象必须声明 inject: ['slots', 'timer'] |
v0.2.2 修复 |
⚠️ 客户端必须声明
inject。若只导出apply,cordis 不会等待服务就绪就调用它,ctx.get('slots')会拿到undefined,插件便静默注册不出任何 UI(按钮消失,控制台也没有报错)。 v0.2.1 及更早版本正是踩了这个坑,v0.2.2 已修复。同机对照:dsh-prompt-enhancer声明了inject: ['timer'],所以不受影响。
已知行为边界:
- 输入框里的引用 chip 会降级为纯文本。DSH 0.1.5 的输入框会把
@文件引用渲染成 chip,而本插件通过inputActions.setDraft()整体替换草稿——这是当前唯一的公开写入路径,因此草稿里已有的 chip 会被写回成 它的文本形式。文字内容不会丢失,只失去 chip 外观。 - 语音插入依赖 VocoType 的日志格式(
session_id=… text=… 替换次数=N)。VocoType 升级若改动日志格式, 需要同步更新lib/index.js的parseEntries。
相关项目
- 233stone/vocotype-cli — VocoType 开源语音输入引擎
- DeepSeek Harness — 本插件的宿主环境
安全加固(v0.1.1 起)
本版本根据三模型安全评估修订:
- 部署操作改 POST + anti-CSRF token:
/dsh-voco-ensure从 GET 改为 POST,必须携带/dsh-voco-token下发的每进程令牌,封堵跨站<img>触发「下载+静默安装」。 - 供应链加固:下载链路移除
--ssl-no-revoke;安装包固定 SHA-256(5629de8a…02c5c2),下载后先校验、不匹配即删除并中止,杜绝篡改/替换安装包。 - Origin/Sec-Fetch-Site 守卫:全部 3 条路由拒绝跨站请求与外来 Origin。
- 去掉硬编码用户路径:日志路径完全基于
%LOCALAPPDATA%(回退homedir/AppData/Local),换机器可用,不再泄漏主机用户名。 - GBK 日志回退:日志按 UTF-8 读取失败时自动改用 GBK 解码,中文识别不再乱码。
- 执行超时:PowerShell 调用加 180s 超时,安装器卡住不再挂起路由;客户端 ensure 请求 120s 超时。
- 升级方式:同步
sync.ps1后完全重启 dsh web。
版本历史
见 CHANGELOG.md。当前版本 v0.2.2 —— 修复客户端漏声明 inject 导致的「麦克风按钮不显示」。
License
MIT
Devin-AXIS/iPolloWork
ysr666/dsh-vision-router
Anionex/dsh-vision-toolkit
zhaoolee/notes
runzhliu/deepseek-harness-docker
labring/sealos-skills
BlockRunAI/dsh-clawrouter
jiuge2467/dsh-studio