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

本地语音 MathieuPortmann/dsh-voice

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

点击麦克风口述消息,朗读回答,全程离线

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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 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
预览分享卡片长什么样 ↓MathieuPortmann/dsh-voice
分享 · DeepSeek Harness Hub
MathieuPortmann/dsh-voice

点击麦克风口述消息,朗读回答,全程离线

回到顶部