← 返回列表
未验证
为 DSH Web GUI 的输入框添加语音输入:点击麦克风说话,识别出的文字会自动追加到草稿末尾。
尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/9 · 已提供中文文档
DSH Web 编辑器的语音输入:浏览器 Web Speech,并以 Windows 离线(System.Speech)作为回退方案。
综合分
29.9
GitHub 分
29.9
用户评分
—
★ Stars
1
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add ManTou-kaya/dsh-voice-input该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/18(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
dsh-voice-input
为 DSH Web GUI 的输入框添加语音输入:点击麦克风说话,识别出的文字会自动追加到草稿末尾。
- 双引擎:默认使用浏览器内置的 Web Speech(Chrome / Edge);当不可用或报网络错误时,自动回退到本机 Windows 离线识别(System.Speech,零密钥、可离线)
- 零构建安装:lib/client.js 已提交,克隆或 pnpm add github:... 之后直接可用,不需要安装 esbuild
- 浮层面板可切换语言与引擎,完成 / 撤销 / Esc,选择会持久化
- 不改动任何已发布的 @deepseek-ai/ 包,可单独卸载
安装(另一台电脑)
让 AI 助手安装:把仓库地址丢给那台机器上的 Agent,再加一句「按 AGENTS.md 安装」即可。AGENTS.md 是给模型阅读的逐步安装 / 验证 / 排错说明(含每条命令的预期输出)。
前提:那台机器已经装好 DSH 与 pnpm(dsh web 至少运行过一次,profile 才会存在)。
git clone https://github.com/ManTou-kaya/dsh-voice-input.git
cd dsh-voice-input
powershell -ExecutionPolicy Bypass -File .\install.ps1
脚本做两件事:
1. pnpm add -w github:ManTou-kaya/dsh-voice-input(安装到 %USERPROFILE%\.dsh\profiles\web)
2. 把 loader 行写入该 profile 的 cordis.patch.yml
然后刷新浏览器页面(F5),输入框工具行就会出现麦克风按钮。若没有出现,重启一次 dsh web。
手动安装(不用脚本)
cd $env:USERPROFILE\.dsh\profiles\web
pnpm add -w github:ManTou-kaya/dsh-voice-input
再编辑 cordis.patch.yml(该文件是 YAML 数组,热生效):
- insert:
- id: dsh-voice-input
name: 'dsh-voice-input'
包故意不声明 dsh.bundle:这样 dsh plugin add 不会把包名同时写入 dsh.profile.bundles,避免同一个 id 被插入两次。dsh plugin --profile web add github:ManTou-kaya/dsh-voice-input 也能安装,只是会打印一条 “declares no dsh.bundle” 的提示,属正常现象。
卸载
1) 删掉 cordis.patch.yml 里的 - insert: 那一行(热生效)
2) 删依赖
cd $env:USERPROFILE\.dsh\profiles\web
pnpm remove -w dsh-voice-input
用法
输入框工具行(模型选择器左侧、发送按钮之前)的麦克风按钮:
| 操作 | 效果 |
| --- | --- |
| 点击麦克风 | 开始识别;再次点击 = 停止并保留文字 |
| 浮层 完成 | 同上 |
| 浮层 撤销 | 只删除本次语音追加的文字(录音期间手打的字不动) |
| Esc | 停止并保留 |
| 语言下拉 | zh-CN / en-US(本机离线引擎只支持已安装的语言) |
| 引擎下拉 | 自动 / 浏览器 / 本机离线 |
识别文字按段追加到草稿末尾;浮层实时显示临时结果。录音期间手动输入的内容不会被覆盖,但可能与识别结果交错。
设置持久化在 localStorage['dsh-voice-input'] = { engine, lang }。
引擎
| 引擎 | 位置 | 依赖 | 说明 |
| --- | --- | --- | --- |
| browser | 浏览器内 Web Speech API | Chrome / Edge;能访问厂商语音服务 | 准确率最好;Chrome 需要能访问 Google 服务 |
| local | 宿主机 Windows System.Speech | Windows + 已安装听写识别器(如 zh-CN) | 完全离线、无密钥;听写准确率一般 |
auto(默认):有 Web Speech 就用它;API 不存在或报 network / language-not-supported 时自动切换到本机离线引擎,面板会提示已切换。
实现
lib/index.js 宿主端:/voice-input/transcribe、/voice-input/status、启动全局、常驻 PowerShell 子进程
lib/recognize.ps1 System.Speech 常驻 worker(stdin/stdout 行式 JSON、UTF-8、空闲回收)
lib/client.js 浏览器端构建产物(__ModuleLoader__ 工厂信封,外部依赖只有 react / react-jsx-runtime / dsh-client-ui-primitives)
src/client/ 源码:slot 注册、麦克风按钮、浮层面板、引擎编排、Web Speech、本机录音+WAV、草稿追加/撤销
build.mjs esbuild 打包成宿主可服务的工厂信封
数据流:
[麦克风按钮 conversation.input.right] ─┐
[浮层面板 conversation.input.overlay] ─┤ 模块级 store
├─ browser: SpeechRecognition onresult → 追加草稿
└─ local: getUserMedia → AudioWorklet(16k)
→ VAD 分段 → WAV → POST /voice-input/transcribe
→ 宿主 powershell.exe (System.Speech) → 文本
→ inputActions.setDraft(实时草稿 + 新段)
- 宿主路由只接受 loopback 对端 + 每进程随机 token(x-dsh-voice-token),body ≤ 4 MiB,20s 超时,临时文件用后即删。
- 草稿写入只能走宿主公开的 InputActions.setDraft()(整体替换),所以采用「追加到实时草稿」而不是「基准草稿 + 累计」,这样录音期间手打的字不会被抹掉。
- System.Speech 的同步 Recognize() 在第一句之后会清空音频输入(多句音频会丢后半段),因此 worker 用 RecognizeAsync(Multiple) + SpeechRecognized / RecognizeCompleted 事件收集全部句子。
开发
powershell
pnpm install # 装 esbuild
node build.mjs # 重写 lib/client.js
只改 src/client/* 时,改完跑 node build.mjs 即可;client-hmr 会轮询该文件并在浏览器里热重载插件行,不用重启 dsh web。改 lib/index.js / lib/recognize.ps1 需要重启 dsh web。
调试本机识别 worker:
powershell
$env:DSH_VOICE_DEBUG='1' # worker 把请求/结果写到 stderr
限制
- 麦克风需要安全上下文:http://127.0.0.1 / localhost 或 HTTPS。用局域网 IP 打开时浏览器会禁用麦克风,面板会明确提示。
- 本机离线引擎仅 Windows,且只能用系统已安装的识别器语言;听写准确率一般(实测示例句会有错字),面板上有引擎徽标可手动切回浏览器引擎。
- setDraft() 是整体替换,识别结果与录音期间的手动输入可能交错。
License
MIT扫码进群