dsh-voice-chat-mode: Add an always-on microphone voice chat mode to DSH

前言

DSH 的语音能力分散在内置实验语音栈里,用起来需要自己拼:开麦录音、调转写、把结果塞进会话、再把回复念出来。开发智能体交互的人通常只想要一个能跑的闭环,而不是四个半成品。

beepflyer/dsh-voice-chat-mode 就是把这条链路接顺的客户端插件。它由 BeepFlyer 维护,走 SkillHub 社区目录的「客户端」分类,当前星标 0、版本 0.7.9。它的思路不是自建 ASR/TTS 服务,而是复用 DSH 内置语音栈做识别,额外加一层很薄的 Host 路由(Edge TTS 与模型控制工具)。下面介绍它的能力、安装方式和适用边界。

这是什么

一句话定位:给 DeepSeek Harness(DSH)加一个语音聊天模式,说话自动触发录音、自动转写、自动提交,助手回复用 Edge TTS 或系统语音念出来。

它做了什么取舍:同类插件里 dsh-voice-mode 功能最全,dsh-voice 偏朗读,dsh-voice-chat / dsh-voice-talk 偏对话式。这个插件的取舍是不重复造 ASR/TTS 服务,只把 DSH 内置语音栈接到最顺的交互上。代价是它要求 DSH 内置的实验语音 bundle 可用,也不提供唤醒词、流式字幕、音色克隆这些专项能力。

许可证 MIT,源码在 GitHub,目录页在 SkillHub。

核心功能

常驻监听用 VAD(RMS 门限 + 最短语音时长)自动开始和结束录音,不需要点按钮。自动提交走会话的 beginSubmission + prompt,默认走 queue,长按开关 500ms 可以把下一次说话标记为 steer(插话)。

播报有两种引擎,设置页可切:edge(默认,Edge TTS 神经语音,8 个中文音色,默认 zh-CN-XiaoyiNeural +10% 语速)和 system(本机 speechSynthesis,离线但音色旧)。字段级细节:请求失败自动回退系统语音,断网也有声。

模型可以通过 voice_mode 工具主动控制:enable 在当前打开的会话里开麦、disable 停麦停播放锁、speak 用当前 TTS 引擎念一段文本(≤500 字)、status 取最近一次状态(state / speaking / sessionId / detail)。机制上是工具把命令放进 Host 内存队列,浏览器插件每 1.5s 轮询 GET /api/voice-mode.control 取走执行再回报,所以返回的是「已入队」,不是同步结果。

口播稿协议值得单独说。语音输入时(用户消息以 [语音] 开头),助手可以在回复的不同阶段插入多段 [voice-note]: <…>,插件按出现顺序逐段朗读;完全没有口播稿时回退到念正文前 3 句。尖括号是 Markdown 链接引用定义的合法目标,渲染时会被吃掉,聊天里不可见。

状态归属:会话级开关,切走会话停麦、切回自动恢复;刷新/重载回 OFF。硬关闭路径明确,短按开关、Esc、切标签、刷新都行。切换会话只停麦,不打断正在播的回复。多窗口用 navigator.locks 按会话加锁,另一个窗口占用时置灰并说明。

轻量性:无运行时 npm 依赖,不额外分发模型(模型由 DSH 语音 bundle 管理)。Host 侧只有一条 /api Fetch 路由 + 一个工具。vendor/python/ 内置 edge-tts 7.3.1 及依赖(约 3.7 MB),合成时加进 PYTHONPATH,优先用自带依赖,不碰系统 site-packages;缺失时 Host 会自动跑一次 pip install edge-tts --target vendor/python。

安装与启用

这是「替换内置语音行」的 proof-of-concept,会覆盖 @deepseek-ai/dsh-experimental-client-ui-voice-input 对应的 Loader 行,因此不要同时启用两支麦克风。

前置条件两条:

  1. DSH Desktop(或 Web)profile 已启用内置语音包 @deepseek-ai/dsh-experimental-voice-input-bundle,它提供 Host 侧 speechToText、SenseVoice provider、Remote 和模型;
  2. 首次使用前在「插件」页完成语音模型的「下载并准备」。

在创造模式对话里,或手动执行:

plugin_manager action=install_bundle target=<本目录绝对路径>

插件的 cordis.patch.yml 会把内置 ui-voice-input 行置为 disabled: true,并插入指向本包的 ui-voice-mode 行。

卸载用:

plugin_manager action=remove_bundle target=dsh-voice-chat-mode

关于播报引擎,Edge TTS 依赖 DSH 自带 Python 里的 edge-tts。README 给的安装命令是:

$py = 'C:\Users\Lenovo\.dsh\dsh-runtimes\dsh-primary-runtime\dependencies\python\python.exe'
& $py -m pip install edge-tts -q -i https://pypi.tuna.tsinghua.edu.cn/simple
& $py -m edge_tts --list-voices   # 能跑通即正常

注意这是 Windows 路径示例,换机器时要替换 $py。从 v0.7.0 起插件自带 edge-tts,通常不需要手动这一步。

典型用法

装好后不需要读 README,agent 也能按约定工作,靠三个模型可见面:

  1. 系统提示词节 plugin:voice-chat-mode(order 3200):说明 [语音] 开头的用户消息是口述转写、回复可以用 [voice-note]: <…> 块控制朗读、不要给打字消息加口播稿;
  2. 动态状态上下文 plugin:voice-chat-mode(order 215):每一步注入一行 state=LISTENING, speaking=no 之类的当前状态;
  3. 客户端顶栏:麦克风开关(输入独立入口)和「朗读/静音」键(只控制助手回复自动朗读,立即生效并持久化,工具 speak 不受它影响)。

播报中点顶栏或 Esc 只停当前这一句。打断判定有一层保护:播报中被声音触发时先记下剩余内容再停播,如果转写结果为空或纯语气词就恢复播报,只有有效发言才真正打断并提交。

如果想让不同会话的 agent 都遵守口播稿约定,建议把约定写进工作区 AGENTS.md。

适用场景与注意

适合想在 DSH 里做「边说边答」体验、且已经能跑通 DSH 内置实验语音 bundle 的开发者和智能体应用作者。不适合需要唤醒词、流式字幕、音色克隆,或不愿启用实验 bundle 的场景。

几点需要注意:

  • voice_mode 的 enable 会让模型主动开麦,只在明确需要时使用;
  • 命令队列上限 10 条,超过丢最旧的;
  • enable 需要窗口里有一个打开的会话(header 已挂载),否则会被忽略并在诊断里记一条;
  • Edge TTS 是微软 Edge 朗读用的端点,属非官方接口,可能变更或失效,speechSynthesis 回退是安全带,仅供本机个人使用;
  • 本插件以当前 DSH 进程权限运行,安装前应检查源码与 MIT 许可证。

小结

这个插件的价值在「不重复造轮子」:识别交给 DSH 内置 SenseVoice,播报用 Edge TTS 或系统语音,插件自己只做常驻监听、自动提交、口播稿协议和模型工具这四件事,Host 侧只有一条路由和一个工具。如果你已经在用 DSH,缺的只是一条顺的语音链路,它是值得看的一个方案。

目录页:https://www.skillhub.cn/plugins/BeepFlyer/dsh-voice-chat-mode
GitHub:https://github.com/BeepFlyer/dsh-voice-chat-mode

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

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

Xiaoye