说话即成稿,回复按句朗读,开口即打断
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/9 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/NutshellLee/dsh-voice-mode-desktop.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 25 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 67 处,展示前 33 条)
- 读取本地文件lib/index.js:213
if ((await stat(localPath).catch(() => null))?.isFile()) { - 删除本地文件lib/index.js:216
await unlink(localPath).catch(() => void 0); - 写入本地文件lib/index.js:218
await mkdir(join(repoDir, spec.file.includes("/") ? spec.file.slice(0, spec.file.lastIndexOf("/")) : ""), { - 读取本地文件lib/index.js:237
const partSt = await stat(partPath).catch(() => null); - 发起网络请求lib/index.js:241
const res = await fetch(url, { headers, redirect: "follow" }); - 写入本地文件lib/index.js:245
await rename(partPath, localPath); - 删除本地文件lib/index.js:248
await unlink(partPath).catch(() => void 0); - 写入本地文件lib/index.js:256
const sink = createWriteStream(partPath, resume > 0 ? { flags: "a" } : {}); - 删除本地文件lib/index.js:287
await unlink(partPath).catch(() => void 0); - 写入本地文件lib/index.js:290
await rename(partPath, localPath); - 写入本地文件lib/index.js:297
await mkdir(subRoot, { recursive: true }).catch(() => void 0); - 发起网络请求lib/index.js:301
const res = await fetch(host + "/api/models/" + repo + "?blobs=true", { headers: { "user-agent": "dsh-voice-mode" } }); - 读取本地文件lib/index.js:320
if ((await stat(localPath).catch(() => null))?.isFile() && (await stat(localPath)).size > 0) { - 写入本地文件lib/index.js:324
await mkdir(join(repoDir, rel.slice(0, rel.lastIndexOf("/"))), { recursive: true }).catch(() => void 0); - 发起网络请求lib/index.js:329
const res = await fetch(url, { headers: { "user-agent": "dsh-voice-mode" }, redirect: "follow" }); - 读取本地文件lib/index.js:744
if (!existsSync(join2(nanoCpuDir, fl))) return null; - 读取本地文件lib/index.js:746
if (!existsSync(join2(nanoTokDir, "tokenizer.json"))) return null; - 读取本地文件lib/index.js:843
if (!existsSync(join2(nanoHfDir, "model.safetensors"))) { - 执行外部命令来自配置/变量lib/index.js:859
const child = spawn(py, ["-u", workerPath, "--model-dir", nanoHfDir, "--keywords", nanoKeywords().join(",")], { - 发起网络请求lib/index.js:925
if (!await client.request("create")) { - 发起网络请求lib/index.js:958
return await worker.request("decode", buf); - 执行外部命令来自配置/变量lib/index.js:2276
child = fork(workerPath, [], { - 执行外部命令来自配置/变量lib/index.js:3021
child = spawn(st.python, [ - 删除本地文件递归lib/index.js:3753
void rm(dir, { recursive: true, force: true }).then(() => { - 发起网络请求lib/client.js:560
let res = await fetch(asrUrl(false, from, epoch), { - 发起网络请求lib/client.js:570
const r2 = await fetch(asrUrl(false, from, epoch), { - 发起网络请求lib/client.js:588
res = await fetch(asrUrl(false, 0, epoch), { - 发起网络请求lib/client.js:646
const res = await fetch(asrUrl(false, detectSent, epoch) + "&vadOnly=1", { - 发起网络请求lib/client.js:681
await fetch(`${asrUrl(false)}&reset=1`, { method: "POST", signal: AbortSignal.timeout(5e3) }); - 发起网络请求lib/client.js:772
res = await fetch(asrUrl(true, off, epochSnapshot), { - 执行外部命令固定命令lib/edge-tts.js:74
const out = execFileSync("reg", ["query", "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"], { - 发起网络请求lib/edge-tts.js:199
const response = await fetch(`${VOICES_URL}?trustedclienttoken=${TRUSTED_CLIENT_TOKEN}&Sec-MS-GEC=${await secMsGec()}&Sec-MS-GEC-Version=${GEC_VERSION - 发起网络请求lib/proxy-agent.js:19
const req = http.request({
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 流式识别入草稿
- 按句朗读与字幕
- 开口即打断
DSH 0.2 桌面版语音插件,是 dsh-voice-mode 的非官方兼容分支:流式识别直接写入草稿,按句朗读并配实时字幕,开口即打断,另带本地 ASR 纠错词表和整段丢字修复。
README
由 DeepSeek 最新模型翻译生成dsh-voice-mode-desktop
为 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 上验证。其他版本未测。
能做什么
- 语音输入:按住说话或持续聆听,识别结果实时进入可编辑的草稿,停顿后自动发送。
展开完整文档(README 剩余 1 节)
dsh-voice-mode-desktop
为 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 上的 dsh-voice-mode@0.7.15(其本身源自 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/ 是上游的构建输出加本分叉的改动,并非从源码重新构建;请对照 dsh-voice-mode@0.7.15 看差异,不要期待可读的源码结构。
- 默认使用云端合成: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。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
NutshellLee/dsh-voice-mode-desktop
说话即成稿,回复按句朗读,开口即打断
相关插件 · 桌面端
Codex 任务面板chuspeeism/dashi-taskboard
现代化可灵活嵌入的任务面板,支持 Codex、DeepSeek Harness
★ 3,409已汉化DSH
71.7
多智能体自进化开发平台Prism-Shadow/penguin-harness
统一、稳定的 Agent 自进化框架全自动优化:任意模型 · 任意算法 · 任意 Benchmark
★ 3,111已汉化DSH
71.1
桌面宠物PC2005-cloud/dsh-pet
DSH 桌面宠物:一行命令装好即用的透明动画小桌宠,支持多开、大小位置随心配置;还内置 DIY 素材链,能用 AI…
★ 5,341已汉化DSH
71
多端 Agent 工作台GCWing/OpenBitFun
OpenBitFun 是一个高度可定制的开源 Agent 工作台,让任务按你的方式持续推进。
★ 3,449已汉化DSH
70.8
DSH Desktopanywhere-labs/dsh-desktop
为 DeepSeek Harness DSH 插件生态打造的现代化桌面端解决方案。万物皆「插件」,桌面本身也是「插件」。
★ 34,532已汉化DSH
70.7
桌面宠物伴侣OpenPetsHQ/openpets
桌面伴侣平台,带宠物、插件,还能选配本地智能体集成。
★ 1,353已汉化DSH
70.2