fix(voice): recover dialogue after abandoned message recordings
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
# 留言状态与后续 AI 对话恢复
|
||||
|
||||
留言目标只属于一次录音和一个 WebSocket 连接。目标设置后默认空闲有效期为
|
||||
120 秒,可用 `VOICE_TARGET_TIMEOUT_SECONDS` 调整;录音开始及有效留言音频会刷新
|
||||
空闲期限。每次访问均检查过期状态,后台会定期回收过期目标及缓存。
|
||||
|
||||
开始包统一返回一次 `START_ACK`。存在留言目标时,根据首个音频包选择流程:
|
||||
类型 `0` 清除待处理留言目标并完成 AI 初始化,原始首包随后正常送入 ASR;
|
||||
类型 `4` 写入本次留言的独立缓存。录音开始传输音频后不允许切换类型。
|
||||
|
||||
结束、取消、异常、空音频、超时和连接断开均会释放对应目标及音频缓存。
|
||||
结束时先消费本次目标,再处理上传和通知,避免旧处理完成时清除新设置的目标。
|
||||
旧连接断开只清理该连接的会话和任务,不影响替换它的新连接。
|
||||
音频缓存键按发送设备及本次目标独立生成,多个发送方对同一接收方留言时互不覆盖。
|
||||
|
||||
本次修复保留既有数据包类型、鉴权及设备协议。家长留言的上传、会话保存和通知流程
|
||||
沿用原实现。
|
||||
|
||||
## 本地验证(2026-10-28)
|
||||
|
||||
- 全量后端回归 243/243,包括新增的 28 项留言状态与恢复测试。
|
||||
- 本机隔离 MySQL、原有 `/ws` 路由和真实 ASR/LLM/TTS:正常对话及静音 10/10,
|
||||
中断及恢复 4/4;包含两个角色在待处理、过期、取消家长留言后的 AI 对话。
|
||||
- 实际 WebSocket 家长留言取消 2 次,均收到取消确认及处理完成通知,随后 AI 对话成功。
|
||||
- 共 52 段音频通过 HTTP 200、Range 206、完整 MP3 解码及非零 PCM 检查。
|
||||
- 正常留言的上传、保存、通知和失败分支使用本地替身测试,未向真实家长发送通知。
|
||||
- 没有访问或部署生产服务,未验证实物设备的麦克风、扬声器及播放中打断。
|
||||
|
||||
覆盖边界:留言取消、空音频、处理异常、过期及未结束录音后的 AI 恢复已有回归;
|
||||
AI 中断后再次 AI 对话已有真实服务验证。留言取消后再次留言验证了录音隔离,
|
||||
AI 中断后留言验证了启动、收音及取消,尚未串联验证这两种情况下第二条留言完整发送。
|
||||
正常家长留言处理的成功、空音频和上传异常分支已用模拟外部接口验证。
|
||||
|
||||
状态测试:`.venv/bin/python -m pytest tests/test_voice_target_lifecycle.py -q`
|
||||
|
||||
完整结果:[本地测试汇总](../output/voice-target-recovery-20261028/summary.json)。
|
||||
Reference in New Issue
Block a user