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-voicenpm 源 · @goodandready/dsh-voice 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · model
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 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🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 语音听写输入
- 语音消息
- 多服务商回退链
最近更新
在 GitHub 查看全部 →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预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
GooDAnDReaDY/dsh-voice
DeepSeek Harness 语音输入:听写和语音消息,支持多服务商 STT 回退链
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个插件,给…
★ 814已汉化DSH
68.8
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 385已汉化DSH
67.9
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1