🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

桌面语音模式 NutshellLee/dsh-voice-mode-desktop

DeepSeek 客户端
NutshellLee25 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

说话即成稿,回复按句朗读,开口即打断

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 安装
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 25 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
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。
预览分享卡片长什么样 ↓NutshellLee/dsh-voice-mode-desktop
分享 · DeepSeek Harness Hub
NutshellLee/dsh-voice-mode-desktop

说话即成稿,回复按句朗读,开口即打断

回到顶部