点击麦克风口述消息,朗读回答,全程离线
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/26 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/MathieuPortmann/dsh-voice.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 6 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 10 处,展示前 10 条)
- 读取本地文件index.js:57
if (!existsSync(config.python)) return Promise.reject(new Error(`voice tools are not installed (${config.python} is missing)`)); - 执行外部命令来自配置/变量index.js:61
proc = spawn(config.python, ['-I', WORKER, config.modelsDir, config.whisperModel, config.hotwords, voices], { - 删除本地文件递归index.js:80
rmSync(cwd, { recursive: true, force: true }); - 写入本地文件index.js:117
mkdirSync(tmp, { recursive: true }); - 写入本地文件index.js:131
writeFileSync(file, body); - 删除本地文件index.js:133
finally { rmSync(file, { force: true }); } - 读取本地文件index.js:141
try { await worker.call({ op: 'tts', text: clean, lang: lang === 'en' || lang === 'fr' ? lang : guessLang(clean), out: file }); return { wav: readFile - 删除本地文件index.js:142
finally { rmSync(file, { force: true }); } - 删除本地文件递归index.js:179
ctx.effect(() => () => rmSync(tmp, { recursive: true, force: true }), 'dsh-voice: temporary files'); - 发起网络请求client.js:86
const post = (path, body, type) => fetch(`${CHANNEL}/${path}`, { method: 'POST', headers: { 'content-type': type ?? 'application/json' }, body });
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DSH 插件:本地语音——点击说话听写(faster-whisper)、语音指令和朗读(Piper),完全离线
README
由 DeepSeek 最新模型翻译生成dsh-voice
为 DeepSeek Harness(DSH)提供本地语音:口述消息,朗读回答,全程都在你自己的电脑上完成。
维护状态:尽力而为。 Issue 可能无人回复;欢迎 fork。
新增功能
- 听写:Send 旁边多一个麦克风按钮。点一下开始说话,再点一下停止(最长 10 分钟)。页面把录音转成 16 kHz WAV,由宿主用 faster-whisper 转写(small 模型,CPU,int8;自动识别法语或英语),文字填入消息框。绝不会自动发送。
- 语音命令:听写内容以「command …」/「commande …」开头时,转成会话中对应的斜杠命令或技能(「command web on」→ /web on,「command science reading …」→ /science-reading …)。无法识别的名称保留为文本,并给出提示。
- 朗读:每条回答下方有 Read 按钮,用本地 Piper 语音朗读(法语或英语,根据文本猜测)。代码块跳过。
- 没有唤醒词,也不会一直开着麦克风:浏览器只在你点击时打开麦克风,录音结束就释放。
界面为英文;DSH 语言设为法语时显示法语(对照表 en 和 fr 位于 client.js 顶部)。
展开完整文档(README 剩余 1 节)
dsh-voice
为 DeepSeek Harness(DSH)提供本地语音:口述消息,朗读回答,全程都在你自己的电脑上完成。
维护状态:尽力而为。 Issue 可能无人回复;欢迎 fork。
新增功能
- 听写:Send 旁边多一个麦克风按钮。点一下开始说话,再点一下停止(最长 10 分钟)。页面把录音转成 16 kHz WAV,由宿主用 faster-whisper 转写(small 模型,CPU,int8;自动识别法语或英语),文字填入消息框。绝不会自动发送。
- 语音命令:听写内容以「command …」/「commande …」开头时,转成会话中对应的斜杠命令或技能(「command web on」→ /web on,「command science reading …」→ /science-reading …)。无法识别的名称保留为文本,并给出提示。
- 朗读:每条回答下方有 Read 按钮,用本地 Piper 语音朗读(法语或英语,根据文本猜测)。代码块跳过。
- 没有唤醒词,也不会一直开着麦克风:浏览器只在你点击时打开麦克风,录音结束就释放。
界面为英文;DSH 语言设为法语时显示法语(对照表 en 和 fr 位于 client.js 顶部)。
安装
1. 安装插件:
dsh plugin --profile web add github:MathieuPortmann/dsh-voice
需要 Node ^22.19.0 || >=24 和 DSH >=0.2.0-rc.2 <0.3.0(见兼容性)。包发布到 npm 后,dsh plugin --profile web add dsh-voice 同样可用。
2. 安装语音工具,只需一次(Python 3.10 或更高版本,含模型约占 1 GB 磁盘空间)。默认目录是 ~/.dsh/tools/voice(<DSH_HOME>/tools/voice):
python3 -m venv ~/.dsh/tools/voice
~/.dsh/tools/voice/bin/pip install faster-whisper piper-tts
~/.dsh/tools/voice/bin/python -m piper.download_voices --download-dir ~/.dsh/tools/voice/models/piper fr_FR-siwis-medium en_US-lessac-medium
~/.dsh/tools/voice/bin/python -c "from faster_whisper import WhisperModel; WhisperModel('small', device='cpu', compute_type='int8', download_root='$HOME/.dsh/tools/voice/models/whisper')"
最后两条命令从互联网(Hugging Face)下载模型;这是唯一需要联网下载的步骤。之后 worker 离线运行。
3. 重启配置档。首次听写时浏览器会请求麦克风权限。
配置
所有选项都有默认值;在配置档的 voice 行上设置:
| 选项 | 默认值 | 含义 |
| python | <DSH_HOME>/tools/voice/bin/python | 语音虚拟环境的 Python |
| modelsDir | <DSH_HOME>/tools/voice/models | 存放 whisper/ 和 piper/ 的目录 |
| whisperModel | small | faster-whisper 模型大小(多语言:base、small、medium…) |
| voiceFr、voiceEn | fr_FR-siwis-medium、en_US-lessac-medium | Piper 音色(<modelsDir>/piper/<voice>.onnx) |
| hotwords | commande command DeepSeek DSH Ollama Piper Whisper | Whisper 应当拼写正确的词(人名、术语) |
| threads | min(6, CPU threads) | worker 使用的 CPU 线程数 |
| idleMinutes | 10 | worker 空闲这么久后停止(释放 1 到 2 GB 内存) |
| maxAudioMB | 20 | 允许接收的最大录音(约 10 分钟) |
| maxReadChars | 8000 | 一次朗读的最长文本 |
听写和朗读只支持法语和英语。
工作原理
- client.js(页面侧)绘制麦克风按钮和 Read 按钮,用浏览器的 MediaRecorder 录音,转成 16 kHz 单声道 WAV,再播放回答音频。
- index.js(宿主侧)在 /voice-api/<stt|tts|to-command|warm> 提供一个小的通道,并运行一个长期存活的 Python worker(Whisper 模型只加载一次),空闲 idleMinutes 后停止。
- worker/voice_worker.py 每行读一个 JSON 请求,回一行 JSON:转写(faster-whisper;它自己读 WAV,不用 PyAV)或语音合成(Piper)。
- lib/commands.js 把「command <name> …」转成 /name …,名称取自会话的命令和技能。它是纯 JavaScript,移植自原生代码,并在 200,000 个生成用例上与原版对比,结果完全一致。
兼容性
| 组件 | 支持范围 |
| Node.js | ^22.19.0 \|\| >=24.0.0(engines.node) |
| DSH | >=0.2.0-rc.2 <0.3.0;声明为 @deepseek-ai/schemastery 的可选 peerDependency,这是宿主侧唯一导入的 DSH 包 |
| 平台 | Linux(已测试);插件本身是纯 JavaScript,worker 是 Python |
| Python 工具 | 用 Python 3.12、faster-whisper 1.2.1、piper-tts 1.8.0 测试过 |
| 浏览器 | 支持 MediaRecorder 和 Web Audio 的浏览器(当前版本的 Chromium 和 Firefox) |
| 页面 | DSH Web UI 的聊天页面;按钮放在 Send 和 Copy 按钮旁边(按英文或法文标签查找),页面改版后可能需要更新 |
权限与外部服务
插件能接触的一切,以及失败时的表现:
| 能力 | 位置 | 用途 | 失败时 |
| 麦克风 | client.js(getUserMedia) | 只在你两次点击麦克风按钮之间使用;随后立即释放 | 页面显示「microphone blocked or missing」 |
| 命令 | index.js(child_process.spawn) | 在临时文件夹里以最小环境(PATH、HOME、Hugging Face 离线标志、线程数)启动 python -I worker/voice_worker.py;空闲或 DSH 停止时结束 | 听写和朗读显示错误(缺少 Python 时显示「voice tools are not installed」) |
| 文件 | index.js、worker | 把每段录音和每个语音回答写成 WAV 文件,存到临时文件夹,用完即删;从 modelsDir 读取模型 | 请求失败,返回错误信息 |
| 网络 | 运行时无 | worker 以 HF_HUB_OFFLINE=1 和 local_files_only 运行;只有上面的一次性安装命令会下载模型 | 不适用 |
| HTTP 路由 | index.js(ctx.webServer.register) | 页面用 POST /voice-api/<method>,位于 ctx.connection.admit() 之后(DSH 的 Host/Origin 防护和 token);音频受 maxAudioMB 限制,JSON 请求体限制为 1 MiB | 未获准的请求返回 401/403;其他错误以 JSON 返回 |
| 会话数据 | index.js(ctx.commands、ctx.skills、ctx.agents) | 读取会话的命令名和技能名,用来识别语音命令;不写入任何内容 | 听写保持纯文本 |
| 动态模块加载 | index.js(importFromDsh) | 从运行插件的 DSH 安装中加载 @deepseek-ai/schemastery(配置 schema)。不下载任何内容,也不从文本求值代码(不使用 eval / new Function) | 插件加载失败 |
| 界面 | client.js | 麦克风按钮、状态行、Read 按钮;向 DSH 的 locale 服务注册法语词典和语言条目 | 没有按钮 |
插件不为模型添加任何工具,也从不自行发送消息。
验证
在一次性配置档上验证(DSH_HOME 指向临时文件夹,因此不会碰到真实配置档):
npm pack
dsh plugin --profile t add file:$PWD/dsh-voice-0.1.0.tgz # install
dsh t --port 3095 --no-open # start: plugin loads, no error
dsh plugin --profile t remove dsh-voice # uninstall
npm test 运行 7 个 lib/commands.js 的独立测试,无需安装 DSH。
开发
npm test
许可证
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
MathieuPortmann/dsh-voice
点击麦克风口述消息,朗读回答,全程离线
相关插件 · 其他
模型破甲清洗YuJunZhiXue/dsh-purge
⚔️ DeepSeek Harness 网络安全红队工具dsh-purge
★ 14,822已汉化DeepSeek 客户端
73
逆向分析桥接Fanqi89/dsh-rea
REA(Reverse Engineer Anything)MCP 桥接,用来把 REA 逆向工具接入 DSH 插件
★ 51已汉化DSH
72
红队越狱测试套件Minglink/dsh-infinite-gen-5
DeepSeek v4.1 flash 逆向工具无限五代 求 Star 收藏 ⭐欢迎大家提交项目的改进
★ 3,759已汉化DSH
71.4
语音女友beiyege-01/dsh-voice-ai-girlfriend
语音 AI 女友Voice AI girlfriend for DeepSeek Harness:Whisper…
★ 718已汉化DSH
71.2
协同办公空间dream-num/univer-workspace
一个让人类与 AI Agent 共同创作、协作和审阅的开源 Office 工作空间。
★ 2,261已汉化DSH
70.7
破甲评测WoYun520/dsh-purge
在本机分离宿主拦截与模型拒绝,做受控红队评测
★ 199已汉化DSH
69.7