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

语音听写 GooDAnDReaDY/dsh-voice

DeepSeek Harnessv0.9.51
GooDAnDReaDY3 天前有提交已提供中文文档扫描:含敏感能力

DeepSeek Harness 语音输入:听写和语音消息,支持多服务商 STT 回退链

41.7/100
综合分
12
GitHub 星标
2,388
npm 周下载
—/5
用户评分

数据截至 2026/10/31 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @goodandready/dsh-voice
npm 源 · @goodandready/dsh-voice 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · model
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功(非静态推断);本次验证针对插件 v0.9.46,当前版本为 v0.9.51
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包@goodandready/dsh-voice @ 0.9.51
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 00:46:16

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 49 处,展示前 34 条)
  • 发起网络请求
    lib/client.js:355
    return fetch('/dsh-voice/status', { cache: 'no-store', ...opts })
  • 发起网络请求
    lib/client.js:358
    return fetch('/dsh-voice/config', { cache: 'no-store' })
  • 发起网络请求
    lib/client.js:361
    return fetch('/dsh-voice/config', {
  • 发起网络请求
    lib/client.js:368
    return fetch('/dsh-voice/transcribe', {
  • 发起网络请求
    lib/client.js:376
    return fetch('/dsh-voice/polish', {
  • 发起网络请求
    lib/client.js:383
    return fetch('/dsh-voice/sensevoice-installer')
  • 发起网络请求
    lib/server-tools.js:23
    export function createServerPipeline({ ctx, live, statsTracker, fetchImpl = (...args) => fetch(...args) }) {
  • 发起网络请求
    lib/local-daemon.js:23
    const res = await fetch(base + '/', { signal: AbortSignal.timeout(2000) })
  • 发起网络请求
    lib/local-daemon.js:206
    const res = await fetch(base + '/', { signal: AbortSignal.timeout(2000) })
  • 执行外部命令来自配置/变量
    lib/wav.js:20
    const proc = spawn(ffmpegBin, [
  • 读取本地文件
    lib/tool.js:46
    const info = await stat(real).catch(() => null)
  • 读取本地文件
    lib/tool.js:52
    const bytes = await readFile(real)
  • 发起网络请求
    lib/host-routes.js:193
    const r = await fetch(url, { method: 'POST', body: form, signal: AbortSignal.timeout(10000) })
  • 读取本地文件
    lib/updater.js:144
    if (!existsSync(entry)) return undefined;
  • 读取本地文件
    lib/updater.js:147
    if (existsSync(manifestPath)) {
  • 读取本地文件
    lib/updater.js:149
    const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
  • 发起网络请求
    lib/updater.js:221
    const response = await fetch(`${registry.replace(/ $/, '')}/${encodeURIComponent(packageName)}/latest`, {
  • 读取本地文件
    lib/updater.js:235
    const value = JSON.parse(await readFile(manifestUrl, 'utf8'));
  • 读取本地文件
    lib/updater.js:255
    if (!existsSync(lockPath)) return null;
  • 读取本地文件
    lib/updater.js:257
    const raw = readFileSync(lockPath, 'utf8').trim();
  • 执行外部命令来自配置/变量
    lib/updater.js:313
    const child = spawn(process.execPath, [
  • 读取本地文件
    lib/sensevoice-installer.js:33
    const stream = createReadStream(filePath)
  • 读取本地文件
    lib/sensevoice-installer.js:65
    if (!dir || !existsSync(dir)) return null
  • 读取本地文件
    lib/sensevoice-installer.js:67
    const entries = readdirSync(dir, { recursive: true, withFileTypes: true })
  • 读取本地文件
    lib/sensevoice-installer.js:93
    if (!dir || !existsSync(dir)) return null
  • 读取本地文件
    lib/sensevoice-installer.js:95
    const entries = readdirSync(dir, { recursive: true, withFileTypes: true })
  • 读取本地文件
    lib/sensevoice-installer.js:117
    if (!dir || !existsSync(dir)) return null
  • 发起网络请求
    lib/sensevoice-installer.js:182
    const res = await fetch(url, { signal: AbortSignal.timeout(600_000) })
  • 写入本地文件
    lib/sensevoice-installer.js:198
    await pipeline(Readable.fromWeb(res.body), progress, createWriteStream(destPath))
  • 执行外部命令固定命令
    lib/sensevoice-installer.js:203
    const child = spawn('tar', ['--no-same-owner', '-xjf', archivePath, '-C', targetDir], { windowsHide: true })
  • 写入本地文件
    lib/sensevoice-installer.js:238
    await mkdir(modelDir, { recursive: true })
  • 删除本地文件
    lib/sensevoice-installer.js:270
    await unlink(archivePath).catch(() => {})
  • 删除本地文件
    lib/sensevoice-installer.js:300
    await unlink(archivePath).catch(() => {})
  • 读取本地文件
    lib/audio-guard.js:62
    real = await realpath(resolved)
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-tools@deepseek-ai/dsh-credentials@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-llm@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 语音听写输入
  • 语音消息
  • 多服务商回退链
v0.9.452026-10-27
· 变更内容 · 修复 · Windows 11 与桌面端麦克风诊断及权限指引(#15、#300):改进 FirstRunWizard(lib/client-src/72-wizard.js)和录音初始化(lib/client-src/40-recording.js)在 Windows 11 上运行于 DeepSeek Desktop(dsh-desktop、dsh-app://)时的诊断与用户反馈。向导不再显示笼统的 Permission denied 和误导性的「浏览器弹窗」提示,而是识别 Windows 桌面环境,给出可操作提示,引导用户前往 Windows 设置 → 隐私和安全性 → 麦克风 →「允许桌面应用访问你的麦克风」,并附一键按钮打开 ms-settings:privacy-microphone。指定 deviceId 获取失败时,设备约束回退为 { audio: true }。感谢 @most-silence 反馈(GitHub #15)。 · 安装与更新 dsh plugin --profile web add @goodandready/dsh-voice@0.9.45 --config.minimumReleaseAge=0
v0.9.442026-10-27
· 变更内容 · 修复 · 输入框插入时的听写分块分隔符(#13、#297):修复了在 DSH 0.2.1-rc.3+ 中使用 token 区间插入或 actions.insertText 时,连续听写分块会粘在一起、中间没有空格的问题(例如 hello + world -> helloworld)。lib/client-src/30-core.js 里的 insertDraftText 现在会按上下文补一个分隔空格:当前草稿结尾不是空白或左括号,且新分块开头不是空白或标点时,就补上空格。感谢 @masteor 提交 PR #13! · 新增 · 可配置的低音量阈值(#14、#298):lib/schema.js 和 GET /dsh-voice/status 新增 lowVolumeThreshold 选项(范围 0..1,默认 0.08)。lib/client-src/40-recording.js 里安静音量指示器改为读取 voice.settings.lowVolumeThreshold,不再写死 0.08,耳机或内置麦克风音量偏小的用户可以自行调整灵敏度,或设为 0 关闭提示。感谢 @masteor 提交 PR #14! · 安装与更新 dsh plugin --profile web add @goodandready/dsh-voice@0.9.44 --config.minimumReleaseAge=0
v0.9.432026-10-26
· 修复 · 桌面外壳与回环来源兼容(#12):修复了从 DeepSeek Desktop(Electron、Tauri、dsh-app://app)、沙箱桌面视图(Origin: null)或回环主机名别名(localhost:3080 与 127.0.0.1:3080)录制音频时,在 lib/http-util.js 中出现的 403 拒绝问题。现在,非 HTTP 桌面应用协议以及带 dsh-auth- cookie 的已认证 DSH 会话会被识别为可信调用方,同时保留严格的跨站失败关闭(Sec-Fetch-Site: cross-site)和局域网反向桥接防护。感谢 @StatedFast 报告。 · npm · 已发布:@goodandready/dsh-voice@0.9.43
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
📦 @goodandready/dsh-voice DeepSeek Harness 零延迟流式语音听写与多服务商对讲输入插件 🇬🇧 English • 🇷🇺 Русский • 🇨🇳 中文说明 ⭐ 如果您喜欢这个插件,请在 GitHub 上为它点亮 Star — 这能让我知道插件对您有用,并鼓励我继续开发和维护它。 🐛 如果您发现 Bug 或希望增加功能,请使用任意语言在 GitHub 上提交 Issue — 我会评估您的建议,并在后续版本中实现有价值的改进。 运行要求 浏览器麦克风与安全上下文 (Secure Context)\n现代浏览器要求在安全上下文(https:// 或 http://localhost / http://127.0.0.1)下才允许调用麦克风接口(navigator.mediaDevices.getUserMedia)。当通过局域网以普通 HTTP 访问 DSH(如使用 dsh-lanmode 访问 http://192.168.1.x:3080)时,浏览器默认会阻止录音。在局域网环境下,请配置 HTTPS 反向代理,或在浏览器中启用标志(chrome://flags/#unsafely-treat-insecure-origin-as-secure)。
展开完整文档(README 剩余 1 节)
📦 @goodandready/dsh-voice

DeepSeek Harness 零延迟流式语音听写与多服务商对讲输入插件

🇬🇧 English •
🇷🇺 Русский •
🇨🇳 中文说明

⭐ 如果您喜欢这个插件,请在 GitHub 上为它点亮 Star — 这能让我知道插件对您有用,并鼓励我继续开发和维护它。

🐛 如果您发现 Bug 或希望增加功能,请使用任意语言在 GitHub 上提交 Issue — 我会评估您的建议,并在后续版本中实现有价值的改进。

运行要求

浏览器麦克风与安全上下文 (Secure Context)\n现代浏览器要求在安全上下文(https:// 或 http://localhost / http://127.0.0.1)下才允许调用麦克风接口(navigator.mediaDevices.getUserMedia)。当通过局域网以普通 HTTP 访问 DSH(如使用 dsh-lanmode 访问 http://192.168.1.x:3080)时,浏览器默认会阻止录音。在局域网环境下,请配置 HTTPS 反向代理,或在浏览器中启用标志(chrome://flags/#unsafely-treat-insecure-origin-as-secure)。\n

⚡ 插件概览

dsh-voice 为 DeepSeek Harness Web 界面带来极速语音交互体验。无论是按自然停顿切分的流式听写,还是带撤回保护的语音消息以及键盘/鼠标 Push-to-Talk 对讲,dsh-voice 凭借多服务商自动故障转移备用链确保您的录音万无一失。

graph LR
subgraph Client [前端 Web 浏览器]
Mic[🎙️ 听写麦克风] -->|VAD 停顿切分| Stream[音频数据切片]
Wave[🌊 语音消息] -->|长按 / 松开| PTT[Push-to-Talk]
end

subgraph Host [DSH 服务端 Host]
Stream --> FFMPEG[ffmpeg 16kHz 转码器]
PTT --> FFMPEG
FFMPEG --> Chain{备用链轮询}

Chain -->|首选优先级| P1[Deepgram / Nova-2]
Chain -.->|遭遇限流 / 429| P2[Groq / Whisper Turbo] Chain -.->|异常故障时| P3[本地 whisper.cpp / 离线] end

subgraph Output [输出目标]
P1 --> Composer[💬 聊天输入框]
P2 --> Composer
P3 --> Composer
end

style Client fill:#1e1e2e,stroke:#89b4fa,stroke-width:2px,color:#cdd6f4
style Host fill:#181825,stroke:#cba6f7,stroke-width:2px,color:#cdd6f4
style Output fill:#11111b,stroke:#a6e3a1,stroke-width:2px,color:#cdd6f4

✨ 核心亮点

- 🎙️ 4 种听写后处理模式 (#264):逐字直录(0 次 LLM 调用)、清爽文本(整理标点符号与语气词)、智能体任务(结构化问题、目标与验收标准)、便签备忘(要点与行动项)。支持自定义提示词模板与一键重置。
- ⚡ 动态会话上下文词汇增强 (#167):自动提取输入框草稿、会话消息与代码块中的专业术语,透传给 Deepgram、Groq、local-whisper 与 SenseVoice 识别引擎。
- 🎯 语音动作宏指令 (#167):语音短语(如“做代码审查”、“运行测试”)自动展开为带有 {text} 参数替换的结构化提示词模板。

* 🎙️ VAD 智能流式听写:说话停顿自动切句(vadSilenceMs,默认 700ms),文字实时追加至输入框。
* 🌊 带撤回窗口的语音消息:录制完整语音,转写后在倒计时(autoSendMs,默认 4000ms)结束后自动发送。
* 🎮 沉浸式 Push-to-Talk 对讲:
* 鼠标操作:按住声波按钮开始录音,松开发送,拖离按钮取消。
* 键盘操作:按住 Ctrl 无需鼠标即刻说话,按 Esc 放弃本次录音。
* ⚡ 浏览器实时同声字幕 (browser):Web Speech API 实时语音识别与浮动同声字幕(注意:Chrome 等标准浏览器通常将音频发送至服务商云端解析;若需 100% 本地离线隐私保护,请使用本地 whisper 或 sensevoice)。
* 🛡️ 多服务商自动容灾切换:首选 API 额度耗尽或遭遇 429 限流时,毫秒级顺位切换备用引擎。
* 🧠 上下文术语注入 (Context Glossary):自动从输入草稿中提取代码变量名与专业术语,引导 STT 模型精准转写专业词汇。
* 🎵 内嵌音频播放器:在输入框与录音浮层中随时试听和回放刚刚录制的原始音频片段。
* 🔇 硬件降噪切换开关:在插件设置中自由开关浏览器级降噪、回声消除与自动增益控制。
* 📊 服务商延迟与健康监控看板:在设置界面实时掌握每个语音引擎的延迟(毫秒)、成功率与调用状态。
* 🔒 API 密钥安全隔离:密钥由服务端 ctx.credentials 统一解析,绝不向浏览器前端泄漏。
* 🖥️ 本地 whisper.cpp 服务端直连:自动管理 whisper-server 进程,结合 ffmpeg 实现实时音频转码。
* ⚡ SenseVoice-ONNX / Sherpa-ONNX (0.8.11):超快速(~50–100ms)非自回归本地语音识别引擎,自动清除情绪/事件标签。支持 Sherpa-ONNX HTTP 和 OpenAI 兼容端点。
* 🌊 Liquid Wave 与 Dynamic Orb 动态可视化 (0.8.12):录音面板内的生动波形动态可视化,实时响应麦克风音量。可选平滑流动波浪、发光脉冲球体、经典频条或关闭。

📝 0.8.19 更新说明

v0.8.18 质量审查后的修复批次(Gitea #79–#87,PR #88):

- 设置占位提示在渲染时通过 locale 解析,不再冻结为 i18n key(#79)
- whisperModel / sensevoiceModel 使用模型路径提示(#82)
- 可视化器改用 DSH 主题 token,不再硬编码颜色(#80)
- 样式标签使用 data-dsh-plugin="dsh-voice",避免邻居插件 HMR 清理误删(#81)
- 源码语言统一为英文;界面不再内置完整 ru 词典(#85)
- 浏览器端源码拆分为 lib/client-src/.js,由 npm run build:client 构建(#87)

[!IMPORTANT]
v0.8.19 语言说明: 未安装 translation 插件时,Web UI 保持英文。

🎮 四种语音输入方式

| 交互模式 | 触发手势 | 行为效果 |
| 流式听写 | 单击 🎙️ 麦克风 | 按停顿切分语音 (vadSilenceMs),文本实时录入输入框 |
| 语音消息 | 单击 🌊 声波 | 持续录音至手动停止,转写后进入撤回倒计时 (autoSendMs) |
| 鼠标对讲 | 长按 🌊 声波 | 按住录音;松开发送,光标拖出按钮区域取消 |
| 键盘对讲 | 按住 Ctrl | 免鼠标快捷 Push-to-Talk 录音;按 Esc 取消 |

🛠️ 服务商矩阵

| 服务商标识 | 对应引擎 | 默认模型 | 环境变量凭据 | 特性说明 |
| browser | Web Speech API | 浏览器原生引擎 | 无需密钥* | 零延迟同声字幕输出(依赖浏览器厂商云端解析;非离线本地) |
| deepgram | Deepgram API | nova-2 | DEEPGRAM_API_KEY | 极速高精云端转写 |
| groq | Groq Whisper | whisper-large-v3-turbo | GROQ_API_KEY | 毫秒级极速推理 |
| hf | HuggingFace Inference | openai/whisper-large-v3 | HF_TOKEN | 经典高精度开源模型 |
| local-whisper | 本地 whisper.cpp | 启动参数指定 | 无需密钥 | 100% 离线私密运行 |
| sensevoice | SenseVoice-ONNX / Sherpa-ONNX | SenseVoiceSmall | 无需密钥 | 超快速(~50ms)本地非自回归 STT |

🤖 智能体工具与 HTTP 端点

智能体工具 (transcribe_audio)

在 ctx.tools 中注册 transcribe_audio(file_path, language?),允许智能体直接读取和转写本地音频文件。包含严格的目录边界检查(allowedAudioDirs、~/.dsh、tmpdir、cwd)、符号链接越界防护以及音频特征码(magic bytes)校验。

内部 HTTP 端点

* POST /dsh-voice/transcribe — 音频转写:{ dataBase64, mimeType, mode } → { ok, text, provider, tookMs }
* POST /dsh-voice/polish — 文本模型润色:{ text } → { ok, text }
* GET /dsh-voice/status — 查询后端状态、服务商健康度、SenseVoice 及 effectiveSensevoiceProvider
* GET /dsh-voice/config — 获取插件运行时配置快照
* PUT /dsh-voice/config — 跨网络安全持久化更新插件配置
* GET/POST /dsh-voice/sensevoice-installer — SenseVoice 一键模型安装状态与触发接口(受 isTrustedCaller 保护,绝对路径脱敏)
* POST /api/dsh-voice/update — 触发插件自动更新至 npm 最新兼容版本(受本地调用与锁校验保护)
* GET /api/dsh-voice/update — 获取更新检查状态与版本信息

🔒 配置文件锁与受控操作员恢复机制

在安装或更新插件时,DeepSeek Harness 使用 <profile-dir>/package.json.lock(例如 ~/.dsh/profiles/<profile>/package.json.lock)协调并发操作。
* 规范竞争者策略: 竞争者进程绝不删除现有的锁定文件。禁止竞争者自动清理残留锁,以杜绝 TOCTOU 竞态条件并避免破坏配置文件状态。
* 诊断信息: 若存在 lock 文件,更新请求将返回 409 Conflict 并附带诊断说明:
- 若由活跃进程持有,则报告其 PID。
- 若遭遇文件系统访问错误(EACCES、EIO),则安全失败(fail-closed)并保留错误码。文件系统错误需要检查磁盘健康度、目录权限或挂载选项——请勿因 EACCES/EIO 错误而删除锁文件。
* 受控操作员恢复流程: 若先前安装进程异常终止(如 OOM 终止或系统断电)留下僵死锁,必须由操作员按以下受控流程进行清理:
1. 建立独占维护窗口: 确保目标配置文件当前没有正在运行或计划启动的并发安装任务(CLI 命令 dsh plugin add、Web UI 交互或自动更新器)。
2. 确认静止状态与无活跃属主: 通过 pgrep、ps、fuser 或 lsof 确认目标配置文件目录下确实没有正在执行包操作的活跃进程。仅凭锁文件存在时间较长或 PID 未能解析不足以作为删除依据,前提必须是彻底排除其他进程启动的可能。若无法确认静止状态,切勿删除。
3. 安全删除已确认的孤立锁: 只有在完全确认锁文件已孤立且处于维护窗口期时,才允许由操作员手动删除该特定锁文件(严禁使用递归或 force 标志):
rm ~/.dsh/profiles/<profile>/package.json.lock

4. 恢复正常运行: 重新开启安装通道并重试插件更新。

📦 安装指南

dsh plugin --profile web add @goodandready/dsh-voice

📄 开源协议

MIT © GooDAnDReaDY
预览分享卡片长什么样 ↓GooDAnDReaDY/dsh-voice
分享 · DeepSeek Harness Hub
GooDAnDReaDY/dsh-voice

DeepSeek Harness 语音输入:听写和语音消息,支持多服务商 STT 回退链

回到顶部