dsh-voice-mode-desktop
Đã xác minh@nutshelllee/dsh-voice-mode-desktop · v0.1.5 · MIT · Giao diện web
Full-duplex voice mode for DeepSeek Harness 0.2 desktop: streaming ASR to draft, sentence read-aloud, barge-in, live captions, plus an in-app settings page. An unofficial compatibility fork of dsh-voice-mode 0.7.15.
Cài đặt
dsh plugin add @nutshelllee/dsh-voice-mode-desktop Xác nhận layer đã áp bằng dsh --profile default --dump-config — xem hướng dẫn cài plugin.
Mã nguồn
Thẻ
Tác giả
Readme
dsh-voice-mode-desktop
English | 中文
为 DeepSeek Harness 0.2 桌面版提供的全双工语音模式:说话时文字实时流入草稿,停顿后自动发送,回复按句朗读,朗读期间再次开口会立刻打断。附带一个应用内设置页,可调朗读语速、录音方式与字幕显示。
本项目是 dsh-voice-mode 0.7.15 的适配分叉(它又源自 haoku123/dsh-voice)。三者均为 MIT 许可,见 LICENSE。
这个分叉做了什么: 让上述插件能在 DSH 0.2 桌面版上运行——适配它依赖的客户端接口、补一个应用内设置页、把云端朗读的第三方依赖换成仓库内自带的实现。识别、打断、本地朗读这些引擎都是上游原样代码,未作改动。
- 上游声明的兼容范围到 DSH 0.1.7-rc.1,代码按 0.1 的客户端接口编写。
- 本分叉面向 DSH 0.2.0-rc.2(DSH NEXT 桌面版
2.0.17-next随附的版本):该版本移除了客户端服务settingsScope,插件配置表单也只渲染标了volatile的字段。 - 已在 Windows、DSH NEXT 桌面版
2.0.17-next、@deepseek-ai/* 0.2.0-rc.2上验证。其他版本未测。
能做什么
- 语音输入:按住说话或持续聆听,识别结果实时进入可编辑的草稿,停顿后自动发送。
- 语音输出:按句朗读(默认走 Edge 云端合成,可选本地 VITS / Kokoro),带实时字幕。
- 全双工:朗读期间开口即打断播放并取消当前回合。
- 设置页:朗读语速(0.5–2.0)、录音方式(按住说话 / 持续聆听)、字幕显隐,以及一键试听自检。入口在侧栏「插件」页里的「语音模式」一项。自检特意把合成与播放分开,听不到声音时能判断是引擎的问题还是输出设备的问题。
与上游 dsh-voice-mode 0.7.15 的差异
| 方面 | 改动 | 原因 |
|---|---|---|
| 客户端半体 | inject 不再声明 settingsScope,对该服务的访问用 try/catch 兜住 |
settingsScope 已从 DSH 客户端接口移除;宿主把"有 entry 未激活"当作致命错误,桌面版会直接进恢复模式 |
| 配置 schema | rate 与 mode 标为 volatile,并在所有读取点解包 |
DSH 0.2 的插件表单只渲染 volatile 字段;把包装对象直接交给合成引擎会让朗读静默失败 |
| 设置界面 | 新增应用内设置页(侧栏插件 → 语音模式)与宿主接口 POST /voice-mode/settings;排版对齐宿主官方设置页,颜色使用宿主主题变量 |
上游的设置卡片依赖已移除的客户端接口;渲染插件配置表单的宿主页面在这个桌面部署里没有挂载 |
| 字幕 | 增加显示 / 隐藏开关,字幕最大宽度收紧(默认档 420 像素) | 字幕是可选项,原先的默认宽度会占满大半个窗口 |
| 状态条 | 宽度按内容收缩、居中、上限 480 像素 | 原先会铺满整个输入区 |
| 诊断 | 当模型流因语音会话不匹配而被跳过时输出一行日志 | 让"没有朗读"这类静默问题可以从日志复现 |
| 打包 | 重命名包;挂载补丁用包内相对路径引用本包 | 让适配变成一个可安装的包,而不是一堆本地改动;同时绕开宿主对 profile 级第三方插件的裸包名解析 |
| 云端合成 | 用仓库内的 Edge 朗读客户端(lib/edge-tts.js)替代 msedge-tts 依赖 |
msedge-tts 里的 require("buffer/index") 在 DSH 桌面宿主上解析失败,导致插件整体无法加载。自带这个约一百八十行的客户端后,安装是一步到位,不需要再给依赖打补丁 |
其余部分——识别、合成引擎、打断、唤醒词、让位语义、模型校验——都是上游代码,未改。
改动范围
基线:npm 上的 [email protected](其本身源自 haoku123/dsh-voice)。本分叉触及的文件:
| 文件 | 改动性质 |
|---|---|
lib/index.js |
宿主半体:schema 的 volatile 字段、POST /voice-mode/settings、一行诊断日志;Edge 引擎改为调用仓库内的客户端 |
lib/client.js |
客户端半体:inject 列表、settingsScope 守卫、设置页、字幕显隐与宽度、状态条宽度 |
lib/edge-tts.js |
本分叉新增 |
cordis.patch.yml、package.json |
挂载点与打包信息(重命名包、不含安装脚本) |
scripts/verify-compat.mjs、scripts/check-tts.mjs |
本分叉新增 |
lib/sense-worker.mjs 与 lib/tts-vits-worker.cjs 为上游文件,逐字节一致。上游项目保有自己的提交历史、测试与构建流程;本仓库是兼容适配,不是重写。
安装
这是一个 DSH bundle,装进某个 profile:
# 从 npm 仓库安装
dsh plugin add @nutshelllee/dsh-voice-mode-desktop
# 或从本地检出安装
dsh plugin add link:/path/to/dsh-voice-mode-desktop
# 或不经过包仓库,直接用仓库地址:
# dependency: "@nutshelllee/dsh-voice-mode-desktop": "git+https://github.com/NutshellLee/dsh-voice-mode-desktop.git"
然后在 profile 清单(dsh.profile.bundles)里启用它,需要的话在 profile 补丁里覆盖默认值:
- id: voice-mode
config:
enabled: true
voice: zh-CN-XiaoxiaoNeural
rate: 1.1
mode: hold # hold = 按住说话,toggle = 持续聆听
ttsEngine: edge # edge | vits | kokoro
bargeInMode: detect
silenceMs: 1500
autoSend: true
spokenFormat: true
首次安装后重启应用,然后打开「插件 → 语音模式」调整设置,或在一段对话里按 Ctrl+Shift+V。
云端朗读
Edge 引擎由 lib/edge-tts.js 直接与微软的朗读接口通信(WebSocket 握手、SSML 请求、接收 MP3 分片),不涉及任何第三方合成封装,因此安装不需要安装脚本,也不需要给依赖打补丁。想确认这台机器上是否可用:
node scripts/check-tts.mjs
自检
node scripts/verify-compat.mjs [DSH 应用目录]
检查本分叉依赖的几项契约:DSH 应用存在、九个客户端注入目标齐全、宿主不再提供 settingsScope、插件客户端半体没有声明缺失的服务、rate/mode 能作为可编辑字段投影出来。退出码为 0 表示全部通过。
模型
仓库内不含模型文件。插件在第一次用到某项能力时自行下载,之后复用本地副本。
| 能力 | 何时下载 | 来源仓库 |
|---|---|---|
| 流式识别(默认) | 首次语音输入 | csukuangfj/sherpa-onnx-streaming-zipformer-zh-int8-2025-06-30(encoder / decoder / joiner / tokens) |
| 静音检测 | 首次语音输入 | Silero VAD(silero_vad.onnx) |
SenseVoice 识别(senseVoice: true) |
首次语音输入 | SenseVoice int8(model.int8.onnx 与词表) |
本地 VITS 朗读(ttsEngine: vits) |
首次用该引擎朗读 | csukuangfj/sherpa-onnx-vits-zh-ll |
本地 Kokoro 朗读(ttsEngine: kokoro) |
首次用该引擎朗读 | Kokoro int8 模型集 |
- 下载源:优先
huggingface.co,失败时用hf-mirror.com。除非在 profile 补丁里设置allowCustomHost: true,否则只接受这两个域名(含hf.co)。可以用modelHost固定某个镜像。 - 缓存目录:Windows 上是
%LOCALAPPDATA%\dsh-voice-mode\models,其他系统是~/.cache/dsh-voice-mode/models。 - 校验:每个文件在使用前都会比对固定的 SHA-256;未完成的下载先写成临时文件,校验通过后才改名。
- 进度:下载与加载进度显示在语音状态条上;失败会在对话里提示,而不是静默忽略。
- 离线:识别需要模型文件,
ttsEngine: edge每次朗读都需要联网。要完全离线,请预先填充缓存目录并改用vits/kokoro。
已知限制
- 编译产物:
lib/是上游的构建输出加本分叉的改动,并非从源码重新构建;请对照[email protected]看差异,不要期待可读的源码结构。 - 默认使用云端合成:
ttsEngine: edge会把朗读文本发送给微软。需要完全本地合成请改用vits或kokoro。 - 外放时的打断依赖浏览器的回声消除;在 Windows 上,按住说话或戴耳机最可靠。
- 设置持久化只覆盖
rate与mode这两个volatile字段;其他选项在启动时从 profile 补丁读取。 - 诊断会写本机日志:为了定位"说过的话整段丢失",插件把每段识别结果(最多 400 字)和一组链路事件写进 DSH 的应用日志(
desktop-next.log)。日志只落在本机,诊断接口只监听回环地址(POST /voice-mode/diag,同时校验同源);但它记录的就是你的口述原文,介意的话请定期清理日志,也别把它装在共享账号的机器上。 - 语音纠错词表是本地文件:词条保存在
~/.dsh/voice-dict.json(可用环境变量DSH_VOICE_DICT覆盖),不随本包发布;仓库里只有匹配逻辑,不含任何人的词条。
兼容矩阵
DSH(@deepseek-ai/*) |
桌面壳 | 状态 |
|---|---|---|
| 0.2.0-rc.2 | DSH NEXT 2.0.17-next(Windows) |
已验证(加载、设置、合成、识别) |
| 0.1.7-rc.1 及更早 | — | 请用上游 dsh-voice-mode |
| 其他 | — | 未测 |
许可与归属
MIT。上游项目的版权声明保留在 LICENSE 中。本分叉为非官方适配,未获上游作者背书;包名与上游不同是刻意为之。
完整的适配记录——按顺序记录了什么失败、每次改动如何验证——见 docs/CHANGELOG.md。