Files
banban/docs/voice_diagnostics.md
T
chenjintao db6109172c feat: add device diagnostics for missing voice replies
Track microphone levels, short reads and PCM buffer drops. Report audio
queue admission separately from TLS writes, expose server replies and
ACKs before filtering, and capture per-round counters before timeouts.

Add diagnostic regression coverage and support POSIX hosts in WSS tests.
2026-10-26 18:35:24 +08:00

4.3 KiB

对话无回复诊断日志

设备端新增四类日志,按 round、session、单调运行时间关联。诊断不调整对话协议、VAD 阈值或回复等待时限。

标记 内容 可以缩小的范围
MIC-DIAG 录音打开结果及句柄、读取返回值/字节数、全零帧、峰值/平均绝对幅值、录音事件、PCM 缓冲写入丢失 区分未取得 PCM、全零输入、已有音频但没有通过 VAD、音频交给编码器前丢失
VOICE-TX 认证消息入队结果;START/END 的序号、类型、字节数、返回值和入队耗时;音频入队失败 区分请求未入队、内存分配失败、正常提交发送队列
WSS-IO 实际 TLS 写入结果、累计写入次数和字节;TLS 错误码、部分写入进度和重试;实际接收字节;关闭时的累计收发及未消费接收字节 区分入队后未完成写入、对端关闭、收到字节但应用层未获得完整消息
VOICE-RX 接收文本长度、前 192 字节、当前会话、是否通过会话准入检查;二进制消息计数 显示 START_ACK/END_ACK、未知回复、被准入检查丢弃的消息。二进制消息仍沿用原有忽略行为
VOICE-DIAG START/END 入队后的摘要、超时断开前和断开回调时的摘要 汇总入队成功/失败数、音频载荷字节、文本/二进制消息数、ACK 次数、末次收包距今时长和回复等待时长

拾音统计按一次录音累计,每秒及停止时输出。peak/mean_abs 是 16 位有符号 PCM 的绝对幅值,不是分贝;zero 统计有效读取长度内全部为零的帧。short 包括零长度以及所有非 640 字节的读取。PCM 写入不足或失败计入 ring_drops,同时记录丢失字节数。录音 tick 回调不打印,其他重复事件限频。

VOICE-TX ret=0 只代表入队成功。queue_bytes 只计成功入队的音频载荷,不含自定义包头、WebSocket 帧头、认证和控制消息。WSS-IO tx_bytes 是传给传输层并成功返回的明文字节数,含握手/帧头,不能与 queue_bytes 直接比较;TLS 失败时已写出的部分字节由 tls_write_failed/tls_write_timeout 的 sent 单独报告。正常写入首条和每 50 次打印一次,实际接收前 20 次及每 50 次打印,断开时输出累计值。tick/elapsed_ticks 使用 RTOS tick,其他带 ms 的字段使用单调毫秒。

start_ack/end_ack 按收到的文本子串统计,包含被准入检查拒绝的消息;它们不是对当前 session 的服务端确认保证。应结合 VOICE-RX 原文中的会话标识判断归属。若服务端协议不发送 ACK,ACK 为零本身不代表失败。accepted=1 表示通过外层会话准入检查,后续仍可能因 OTA、打断状态、URL 或 session 校验而未播放。文本仅保留前 192 字节,原有错误消息完整分块日志继续保留。

复现时保留开机到失败后第二次对话结束的完整串口日志。推荐按以下顺序判断:

  1. MIC-DIAG 检查读取长度、返回值和电平,结合既有 FVAD 语音确认日志判断拾音与 VAD。
  2. VOICE-TX 检查 START、音频、END 入队;queue_fail 和 ring_drops 应为零。
  3. WSS-IO 检查实际写入是否失败,关闭时是否有接收字节和残留未消费数据。
  4. VOICE-RX 检查 ACK、未知错误文本、被拒绝的回复或二进制数据。
  5. timeout-before-disconnect 检查 wait_ms。wait=2 是等待回复,wait=1 是无语音,wait=3 是 END 入队失败。response 表示现有业务逻辑已接收可用音频 URL,不等同于收到任意文本或 TTS_START。

即使 TLS 写入成功,也不能证明服务器应用收到完整录音。若已经看到归属正确的 END_ACK,却没有后续 TTS,优先按 session 查服务端识别和生成链路;若没有 ACK,也需要结合服务端接收记录判断。设备单侧日志不能完全区分服务端未处理、网络中断和回复延迟。

本机验证:python3 tools/test_voice_diag.py、python3 tools/test_conversation_timeout.py、python3 tools/test_wss_io.py、python3 tools/test_wss_receive.py。诊断测试直接编译实际函数并注入录音、缓冲区、队列及收包结果;不替代目标固件构建及设备实测。