[全双工自测]:完成Agent自我测试体系,包含回声、打断、记忆和工具场景

This commit is contained in:
mkbk
2026-06-19 12:43:44 +08:00
parent 81c949a7ec
commit 98ae711971
7 changed files with 309 additions and 13 deletions
+26 -8
View File
@@ -8,7 +8,10 @@
- `owner_voice_pet run-live`:真实常驻语音循环。
- `owner_voice_pet run-live --once`:只跑一轮,便于验收。
- `owner_voice_pet run-agent-live --check-config`:全双工 Agent 入口的配置检查。当前用于迁移期验收,真实运行仍走 `run-live`
- `owner_voice_pet run-agent-live`完整全双工 Agent 入口,启动后直接 listening,播放中可被有效用户语音打断
- `owner_voice_pet run-agent-live --check-config`:只检查全双工 Agent 配置和 APM 就绪状态,不打开麦克风。
- `owner_voice_pet agent-self-test --profile full-duplex --turns 3`:无人值守自测 STT、LLM、TTS、打断、记忆和工具路由。
- `owner_voice_pet audio-self-test --duration 10 --check-echo`:检查设备、WebRTC APM、回声抑制和打断延迟。
- `.env` 直接读取配置,不要求导出 shell 环境变量。
- 唤醒词检测使用本地 `sherpa-onnx` KWS 模型,不走云端 ASR。
- `OWNER_SPEECH_PROVIDER=local`:默认除 LLM 外全用本地语音链路;`cloud` 仅作为显式兼容选项。
@@ -97,11 +100,11 @@ OWNER_INTERRUPT_TARGET_LATENCY_MS=200
OWNER_STREAMING_STT_PROVIDER=faster_whisper
OWNER_STREAMING_STT_PRODUCT_CANDIDATE=sensevoice
OWNER_STREAMING_TTS_PROVIDER=cosyvoice
OWNER_MEMORY_ENABLED=0
OWNER_MEMORY_ENABLED=1
OWNER_MEMORY_PROVIDER=faiss_sqlite
OWNER_MEMORY_TOP_K=5
OWNER_MEMORY_AUTO_SAVE_SENSITIVE=0
OWNER_TOOL_ROUTER_ENABLED=0
OWNER_TOOL_ROUTER_ENABLED=1
OWNER_TOOL_MAX_CALLS_PER_TURN=5
OWNER_TOOL_TIMEOUT_MS=30000
OWNER_OPENINTERPRETER_ENABLED=0
@@ -130,7 +133,7 @@ OWNER_COMPUTER_CONTROL_ENABLED=0
.venv/bin/python -m owner_voice_pet run-agent-live
```
`run-agent-live` 不需要先说唤醒词,启动后会直接进入 listening。你可以直接说问题;助手播放回复时,后台麦克风仍在监听。如果你插话,runtime 会用 VAD + 软件 render reference/音色门控判断是不是用户声音;确认后会在下一个播放 chunk 边界停止播报,把打断音频接入下一轮 STT,并继续对话
`run-agent-live` 不需要先说唤醒词,启动后会直接进入 listening。完整模式默认要求 `OWNER_AUDIO_APM_PROVIDER=webrtc``OWNER_AUDIO_APM_REQUIRED=1`,麦克风 capture 必须经过 WebRTC APM 的 AEC/NS/AGC 后再进入 VAD、STT 和打断检测;播放 PCM 会同步写入 render reference。若本机没有真实 WebRTC APM provider,入口会以 `AUDIO_APM_UNAVAILABLE` 明确失败,不再回退到旧 `run-live` 或伪全双工
只检查全双工配置、不打开麦克风:
@@ -144,14 +147,29 @@ OWNER_COMPUTER_CONTROL_ENABLED=0
.venv/bin/python -m owner_voice_pet run-live
```
全双工 Agent 第一版使用软件回声抑制,不强制新增 WebRTC APM 重依赖:播放 PCM 会作为 render reference 供打断门控使用,只有助手回放时不应触发打断,用户声音叠加回放时应停止播报。`OWNER_AUDIO_APM_PROVIDER=webrtc` 仍代表后续目标音频底座,`OWNER_LLM_STREAMING_ENABLED=1` 控制 LLM 以流式响应供句子级 TTS 消费,旧变量 `OWNER_LLM_STREAM` 仍兼容;`OWNER_STREAMING_STT_PROVIDER=faster_whisper``OWNER_STREAMING_TTS_PROVIDER=cosyvoice`后续 provider 目标;`OWNER_MEMORY_ENABLED=0``OWNER_TOOL_ROUTER_ENABLED=0``OWNER_OPENINTERPRETER_ENABLED=0``OWNER_BROWSER_PLAYWRIGHT_ENABLED=0``OWNER_COMPUTER_CONTROL_ENABLED=0` 默认关闭,避免尚未完成安全边界前执行长期记忆或工具任务
全双工 Agent 当前架构使用单一 `AudioHub` 拥有麦克风输入,VAD、STT、InterruptController 和诊断订阅各自独立的 processed capture cursor,不再抢读同一个 Transport 队列。打断不等待 STT partial:在 `thinking/speaking/tool_running` 中,只要 processed capture 上的有效用户语音达到阈值,就取消当前 LLM/TTS/playback/tool 子图,并把已确认的用户音频缓存给下一轮输入。`OWNER_LLM_STREAMING_ENABLED=1` 控制 LLM 以流式响应供句子级 TTS 消费,旧变量 `OWNER_LLM_STREAM` 仍兼容;`OWNER_STREAMING_STT_PROVIDER=faster_whisper``OWNER_STREAMING_TTS_PROVIDER=cosyvoice` 是 provider 目标;`OWNER_MEMORY_ENABLED=1``OWNER_TOOL_ROUTER_ENABLED=1` 默认开启,`OWNER_OPENINTERPRETER_ENABLED=0``OWNER_BROWSER_PLAYWRIGHT_ENABLED=0``OWNER_COMPUTER_CONTROL_ENABLED=0` 默认关闭,避免未确认的外部控制自动执行
无人值守 Agent 自测:
```bash
.venv/bin/python -m owner_voice_pet agent-self-test --profile full-duplex --turns 3
```
音频/APM 诊断:
```bash
.venv/bin/python -m owner_voice_pet audio-self-test --duration 10 --check-echo
```
如果当前机器没有真实 WebRTC APM binding`audio-self-test` 会返回 `success=false``AUDIO_APM_UNAVAILABLE`;这表示完整全双工音频底座尚未满足,不应把 fake APM 结果当成人工验收通过。需要做确定性开发自测时,可以临时使用 `OWNER_AUDIO_APM_PROVIDER=fake`
当前已落地的全双工基础模块:
- `full_duplex_audio`音频帧 fixture、capture/render ring buffer、fake WebRTC APM、APM 探针和 fallback 决策。
- `full_duplex_audio`AudioHub、多消费者 capture/render ring buffer、fake WebRTC APM、APM 探针和 required startup 决策。
- `full_duplex_control`:全双工状态机、事件诊断字段、取消 token graph 和恢复协调器。
- `full_duplex_speech`VAD provider contract、Silero VAD 边界、Streaming STT contract、fake STT 和 interruption detector。
- `full_duplex_response`LLM streaming contract、句子切分、TTS 文本净化、fake Streaming TTS 和可中断播放队列。
- `full_duplex_speech`VAD provider contract、Silero VAD 边界、Streaming STT worker、fake STT、InterruptionDetector 和 InterruptController
- `full_duplex_response`LLM streaming contract、句子切分、TTS 文本净化、Streaming TTS wrapper、fake Streaming TTS 和可中断播放队列。
- `full_duplex_runtime`:新 `run-agent-live` runtime 边界,串联 AudioHub、取消图、流式回复、长期记忆和 ToolRouter。
- `agent_memory`SQLite memory schema、FAISS index manifest 校验、fake/disabled memory manager、敏感写入策略和 memory recall 注入。
- `tool_router`:结构化工具调用、风险分类、预算防循环、审计脱敏、`memory.search``memory.save``shell.readonly`
- `external_adapters`Open Interpreter、Playwright 和 Computer Control 的默认关闭边界。