前言¶
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 行,因此不要同时启用两支麦克风。
前置条件两条:
- DSH Desktop(或 Web)profile 已启用内置语音包
@deepseek-ai/dsh-experimental-voice-input-bundle,它提供 Host 侧speechToText、SenseVoice provider、Remote 和模型; - 首次使用前在「插件」页完成语音模型的「下载并准备」。
在创造模式对话里,或手动执行:
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 也能按约定工作,靠三个模型可见面:
- 系统提示词节
plugin:voice-chat-mode(order 3200):说明[语音]开头的用户消息是口述转写、回复可以用[voice-note]: <…>块控制朗读、不要给打字消息加口播稿; - 动态状态上下文
plugin:voice-chat-mode(order 215):每一步注入一行state=LISTENING, speaking=no之类的当前状态; - 客户端顶栏:麦克风开关(输入独立入口)和「朗读/静音」键(只控制助手回复自动朗读,立即生效并持久化,工具
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