前言¶
在 DeepSeek Harness (DSH) 的开发中,为智能体添加语音交互能力通常需要自行处理 TTS/ASR 引擎的对接以及浏览器端的录音/播放 UI。dsh-voice 插件专为面试 preset 场景设计,提供了回合制语音通道。它通过抽象 Agent 工具屏蔽底层引擎细节,让面试流程在语音层面形成闭环。
插件定位¶
dsh-voice 是一个回合制语音通道插件,支持 TTS/ASR 引擎抽象。它为面试场景提供语音交互能力,所有者维护,许可证为 MIT。
核心功能¶
插件通过三个 Agent 工具提供语音能力,浏览器端自动配合录音与播放:
voice_speak:Agent 输出语音,浏览器自动播放。voice_listen:人声输入录音,自动转写回传给 Agent。voice_status:引擎健康检查,检查 TTS/ASR 可用性、队列及录音状态。
引擎抽象¶
插件支持 TTS 与 ASR 各自独立选择引擎,auto 模式按 qwen → mimo → local 顺序探测可用者。
- qwen:使用 DashScope 原生接口,依赖环境变量
DASHSCOPE_API_KEY。 - mimo:使用 MiMo-V2.5 接口,依赖环境变量
MIMO_API_KEY,支持配置 baseUrl。 - local:支持 sherpa-onnx、whisper.cpp、piper 等本地二进制与模型。
本地 ASR(sherpa-onnx)已验证闭环,支持从 macOS say 合成中文并转写。音频默认落盘至 ~/.dsh/voice。
安装与配置¶
在对应的 profile 下执行安装命令:
dsh plugin --profile web add @harness-flow/dsh-voice
安装后重启 profile 生效。插件行的默认配置是中性值,需要在 profile 的 cordis.patch.yml 中按行 id dsh-voice 覆盖。
示例配置如下:
- id: dsh-voice
config:
asr:
engine: auto
language: zh
tts:
engine: auto
voice: Cherry
audioDir: ~/.dsh/voice
listenTimeoutSec: 120
- 云引擎密钥仅通过环境变量读取,配置中只写变量名。
- 本地引擎(如 sherpa-onnx)需要 profile 安装
sherpa-onnx-node并配置模型目录。 - 本地 MiMo 网关可通过配置
baseUrl指向本机地址复用同一实现。
面试官预设用法¶
插件负责语音链路(host 侧服务 + 浏览器 UI),preset 只负责「面试官」这个角色与流程。
建议在 preset 中定义面试官 Persona,要求其一次只提一个问题,使用 voice_speak 朗读后立即调用 voice_listen 等待作答。以下是一个示例配置片段:
- id: persona
name: '@deepseek-ai/dsh-persona'
config:
text: >-
你是一位专业的面试官,正在通过语音进行一场结构化面试。
一次只提一个问题:用 voice_speak 朗读问题,随后立刻调用 voice_listen
等待候选人作答;根据 transcript 追问或进入下一题。
流程:开场寒暄 → 自我介绍 → 技术/项目深挖 → 行为面 →
候选人提问 → 结束语与后续安排。全程专业、中立、鼓励,不做主观臆断;
面试结束后输出评分表(各维度 1–5 分 + 一句话依据)与录用建议。
版本说明与限制¶
当前版本为 v0.1,存在以下设计取舍:
- 回合制优先:
voice_speak阻塞到合成完成,保证顺序;全双工打断(barge-in)待后续版本。 - 单客户端桥接:仅支持单客户端桥接,内存中管理 listen 会话,页面关闭后队列自动丢弃。
- 无会话持久化:不持久化
voice/*会话事件,仅聊天记录保留文本转写。 - 失败局部化:引擎探测失败只影响该引擎;浏览器播放被拦截时等待用户手势重试。
总结¶
dsh-voice 解决了 DeepSeek Harness 中构建语音面试场景的引擎集成与交互逻辑问题。它提供了清晰的 Agent 工具接口与可配置的 TTS/ASR 引擎抽象,适合需要构建语音交互面试流程的开发者使用。