dsh-voice:DSH 本地语音听写与朗读

前言

在 DSH Web 界面里写长提示、改 slash 命令,键盘仍是主路径;若希望「点一下说话、把文字填进输入框」,或让助手回复用本地 TTS 读出来,通常要接云端 ASR/TTS,或自己写浏览器录音与后端转写。DeepSeek Harness 社区插件 dsh-voice(维护者 MathieuPortmann,GitHub 仓库 MathieuPortmann/dsh-voice)把听写、口语化命令和朗读收进同一套离线工具链:页面侧点按开麦,主机侧用 faster-whisper 与 Piper,运行时不再访问外网。下面介绍它做什么、如何安装,以及使用时需要注意的点。

这是什么

dsh-voice 是面向 DSH Web profile 的插件(分类:模型推理)。它在聊天页 Send 旁增加麦克风按钮,在每条回答下方增加 Read 按钮;录音转文字后只写入消息框,不会自动发送。无唤醒词、无常开麦克风:仅在用户两次点击麦克风之间向浏览器申请麦克风,录完即释放。界面随 DSH 语言在英文与法文间切换(client.js 顶部 en / fr 表)。维护状态为 best-effort,Issue 可能无人回复,欢迎 fork。

核心功能

听写(Dictation)

  1. 点击麦克风开始录音,再次点击结束(单次最长约 10 分钟,受 maxAudioMB 等配置约束)。
  2. 页面用 MediaRecorder 录制,再转为 16 kHz 单声道 WAV。
  3. 主机用 faster-whisper(默认 small,CPU、int8)转写,自动识别法语或英语,文本追加到输入框。

口语命令(Spoken commands)

以 command … 或 commande … 开头的听写,会映射为当前会话里已有的 slash 命令或 skill 名称,例如:

  • command web on → /web on
  • command science reading … → /science-reading …

未知名称保留为普通文本并给出提示。映射逻辑在 lib/commands.js,与 DSH 原生实现对照过大量生成用例。

朗读(Read aloud)

每条回答下的 Read 按钮调用本地 Piper 合成语音;根据文本猜测法语或英语音色。代码块会被跳过。

安装与启用

环境要求(来自 README Compatibility):Node.js ^22.19.0 || >=24.0.0;DSH >=0.2.0-rc.2 <0.3.0;Linux 上已测试;浏览器需支持 MediaRecorder 与 Web Audio(当前 Chromium、Firefox)。Python 工具在资料中于 Python 3.12、faster-whisper 1.2.1、piper-tts 1.8.0 下验证。

1. 安装插件

在 Web profile 下执行官方命令:

dsh plugin --profile web add github:MathieuPortmann/dsh-voice

包上架 npm 后,也可使用:

dsh plugin --profile web add dsh-voice

2. 一次性准备语音工具

默认目录为 ~/.dsh/tools/voice(即 <DSH_HOME>/tools/voice)。需要 Python 3.10 及以上;含模型约占用 1 GB 磁盘。下列命令会从 Hugging Face 下载模型,仅此阶段需要网络;之后 worker 离线运行。

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')"

3. 重启 profile

重启 DSH Web profile 后,首次听写时浏览器会请求麦克风权限。

配置

在 profile 的 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 转写时优先拼对的词
threads min(6, CPU threads) worker CPU 线程数
idleMinutes 10 空闲多久停止 worker(约释放 1~2 GB 内存)
maxAudioMB 20 接受的最大录音体积(约 10 分钟)
maxReadChars 8000 单次朗读最长字符数

典型用法

  1. 打开 DSH Web 聊天页,在 Send 旁点麦克风,口述内容后再次点击结束;确认转写出现在输入框,按需编辑再发送。
  2. 需要切换会话能力时,可说「command web on」等形式,让文本变为对应 /web on 等命令后再发送。
  3. 阅读长回答时,点该条下的 Read,本地 Piper 朗读正文(跳过代码块)。

架构与权限(简要)

  • client.js:绘制按钮、录音、WAV 转换、播放 TTS 音频。
  • index.js:注册 POST /voice-api/<stt|tts|to-command|warm>,经 ctx.connection.admit() 校验;启动长期 Python worker(Whisper 只加载一次),空闲 idleMinutes 后退出。
  • worker/voice_worker.py:按行读 JSON 请求、按行回 JSON(转写或合成);运行时设 HF_HUB_OFFLINE=1,不访问网络。

插件不新增模型侧 tool,也不会替用户发消息。子进程、临时 WAV、模型文件读写均在当前 DSH 进程权限下进行;安装前建议阅读仓库源码与 MIT 许可证。麦克风被拒时页面提示 “microphone blocked or missing”;Python 或模型缺失时听写/朗读会返回错误(如 “voice tools are not installed”)。按钮位置依赖 Send、Copy 的英/法标签,Web UI 改版后可能需要插件更新。

适用场景与注意

适合希望在本机离线完成听写与朗读、且主要使用 DSH Web 界面、内容以英法为主的开发者。不适合需要唤醒词、常开麦克风或运行时云端语音 API 的场景。

插件以 best-effort 维护;社区目录 skillhub.cn 上的 dsh-voice 页 与 GitHub 均为社区信息来源,与 DeepSeek / 幻方无官方从属关系。DSH 生态强调「一切皆插件」,安装第三方插件前请自行评估权限与依赖。

结尾

经过上面的步骤,你可以在 DSH Web 里用点击式听写填框、用口语前缀触发已有命令,并用 Piper 本地朗读回复——全程数据留在本机,运行时无出站网络。详情与 Issue 见 GitHub:MathieuPortmann/dsh-voice,目录入口见 SkillHub 插件页。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye