Bundle
dsh-listener
安全版本地语音输入插件 for DeepSeek Harness:输入框右侧麦克风按钮,录音后经同源宿主代理转写(本地 SenseVoice-Small INT8 ONNX,音频不出网)。后端仅绑定 127.0.0.1 + 随机 token,无 CORS,模型 sha256 校验。
- Source
- Lanzgale
- License
- MIT
- Updated
- Updated 5 days ago
Readme
# dsh-listener — 本地安全语音输入插件
在 DSH 对话输入框右侧添加麦克风按钮:录音 → 本地 SenseVoice-Small INT8 ONNX 转写 → 文本填入输入框。**音频全程本地处理,不出网。**
fork/参考:@opensquad/dsh-voice-input(MIT,已克隆 `~/file/dsh/plugin/dsh-voice-input`),重写为安全架构,详见下方「与原版的差异」。
## 架构
```
浏览器(输入框 conversation.input.right)
└─ 同源 POST /plugins/dsh-listener/*(宿主代理,无 CORS)
└─ 宿主:生命周期管理 + 20MB 上限 + 语言头透传
└─ Python 后端(单进程,仅 127.0.0.1:7103 + 随机 token)
├─ /health /download /download/status /start
└─ /v1/audio/transcriptions(SenseVoice-Small INT8 ONNX)
```
## 目录
- `lib/index.js` — 宿主:路由代理、后端生命周期(懒启动/崩溃重启/dispose 清理)、依赖检查与安装(钉版本)
- `lib/client.js` — 浏览器:麦克风按钮、录音(120s 上限)、进度/错误弹窗、`inputActions.setDraft` 追加填入
- `backend/server.py` — 合并后端(下载网关 + 推理服务单进程)
- `backend/lib/inference.py` — SenseVoice ONNX 推理(MIT 复用,未改动)
- `backend/lib/model_store.py` — 模型下载 + sha256 落盘校验
- `backend/requirements.txt` — 钉版本依赖(onnxruntime==1.29.0 等)
## 存储
| 数据 | 位置 |
|---|---|
| 模型(4 文件,~240MB) | `~/.local/share/dsh-listener/model/`(环境变量 `DSH_LISTENER_MODEL_DIR` 可改) |
| sha256 清单 | 同目录 `.sha256.json`(首次下载建立信任锚点,启动时校验,损坏自动重下) |
| Python 依赖 | `~/.local/lib/python3.14/site-packages/`(`--user --break-system-packages`,PEP 668) |
| token | 每进程随机,命令行注入,不落盘 |
| 后端日志 | `backend/server.log` |
## 与原版的差异(安全修复清单)
| 原版 | dsh-listener |
|---|---|
| 浏览器直连 127.0.0.1:7101/7102 + CORS 全开 | 浏览器只访问同源宿主路由;后端无 CORS |
| 后端绑 0.0.0.0、零鉴权 | 只绑 127.0.0.1 + 回环来源校验 + 随机 token |
| 网关 + 推理两进程 | 合并单进程,生命周期一条清理链 |
| `/uninstall` 可远程删模型 | 删除该端点 |
| 无大小/时长限制 | 20MB / 120s 上限(宿主+后端双重) |
| 自动 pip 装未钉版本 | 钉版本 + 首次安装前 UI 确认 |
| 模型无校验 | sha256 落盘 + 启动校验 + 损坏自动重下 |
| 无 dispose 清理 | 宿主 dispose / 进程退出统一 kill |
## 使用
1. 首次点击麦克风:确认后自动安装依赖(约 250MB)+ 下载模型(约 230MB),进度条显示
2. 就绪后:点击开始录音,再点停止 → 转写 → 填入输入框(已有内容则追加)
3. 输入框已有草稿时追加在末尾;识别失败显示角标 `!`
## 开发
- client 改动:Ctrl+Shift+R 刷新即可(`curl http://127.0.0.1:3080/plugins/dsh-listener/client.js` 验证服务端已更新)
- host / 后端改动:重启 DSH
- 模型重下:`rm -rf ~/.local/share/dsh-listener/model` 后重新走下载流程
Install
dsh plugin --profile web add github:Lanzgale/dsh-listener
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-listener from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.