AIAI 学习 · 专题库

评测与工程

排查“用户有声,AI 无声”

从录音体检和应答机会入手,用日志判断无声发生在哪一层。

资料复核:2026-09-082 份直接来源含操作步骤与记录模板
先做什么

“录音里 AI 没声音”可能是未生成、未播放、未送达或录音没录到。先判断该轮是否真的应该回答,再沿事件链找断点。

理解这条链路

录音体检角色确认用户话轮应答机会AI 声音候选日志关联人工复核
参考流程:根据公开能力整理的操作顺序;分支、重试和回退以正文说明为准,不代表厂商内部实现。

按录音条件选择流程

可靠双轨优先分别分析用户与 AI;双声道先通过受控通话验证角色;单轨混音只能先提取疑似无声窗口,必要时结合分离与转写并人工确认。把用户说完、系统需要回答的事件定义为应答机会;用户在思考、挂机或仅附和不必自动算作 AI 漏答。

故障位置由事件差异决定

有 turn_commit、无 model_start:检查编排;有模型输出、无 TTS 首块:检查合成;有 TTS 首块、无发送或缓冲证据:检查媒体对接;已送出、有播放回执但录音无声:检查录音路径。缺少下游回执时只报告已知的最后一层,不能越级定责。

Spring Boot 集成边界

离线质检让任务服务负责幂等、文件位置、超时和回执,由独立音频 Worker 负责解码、分轨和 VAD。实时 PCM 使用每路独立的有状态会话、固定帧格式和有界队列;先确认 Python 路径的事件正确,再比较 Java ONNX 的预处理和状态张量一致性。

按这个顺序操作

  1. 用 ffprobe 确认声道、编码、时长和空文件;保留文件摘要与原始录音。
  2. 在开发样本上校准静音和 VAD 阈值,输出声学候选,避免直接判罚。
  3. 将候选与 turn_id、generation_id、TTS、RTP 和播放日志对齐。
  4. 人工复核真假无声及角色错误,按应答机会计算查准率与召回率。
配套本地工具

以下工具位于 AI 学习工作区。先阅读对应说明,确认所需数据与依赖;本轮未重新运行这些实验。

  • practice-hub/ffmpeg-silero-vad/README.md

可直接复用的记录模板

ffprobe -v error -show_streams -show_format -of json call.wav
# 以下阈值仅供开发试验,mono=1 表示逐声道检测;不会改写输入录音。
ffmpeg -hide_banner -i call.wav -af silencedetect=noise=-40dB:d=1:mono=1 -f null -

候选记录:call_id / turn_id / role_confidence / window_start / window_end
最后已确认事件 / 缺失证据 / 原因候选 / 人工结论

做到什么程度才算通过

  • 角色映射有实测依据。
  • 检测单元是应答机会。
  • 单轨候选不冒充双轨确定结论。
  • 有模型输出与用户可听到分别验证。
当前证据的限制

本轮未处理新的用户录音;阈值是待校准的示例。已有本机实验的成功记录不等于业务定责已验证。

本轮确认的事实与来源

以下为公开资料支持的具体结论;操作流程和验收建议属于工程推导。仓库说明或厂商效果表述不等于独立实测。

[1] FFmpeg · 音频滤镜文档

FFmpeg silencedetect 按音量阈值与持续时间检测静音,可分别评估声道;它检测的是声学条件,并不知道哪个角色应该回应。

资料日期:页面未统一标注;以复核日期为准 · 复核:2026-09-08

阅读原始来源 ↗
[2] Silero VAD · 官方仓库

Silero VAD 官方说明支持 8kHz 和 16kHz,提供 PyTorch 与 ONNX 路径。它给出语音活动信息,不直接判断客服漏答。

资料日期:页面未统一标注;以复核日期为准 · 复核:2026-09-08

阅读原始来源 ↗

这次更新了什么

合并无声质检与 FFmpeg/Silero 实战;保留 Spring Boot 集成分工,撤下把 VAD 人声比例直接当漏答率的可能误读。

合并前的内容入口

以下旧地址仍可访问,并会带你来到本篇。完整重构前材料已留存本地备份。

  • research-hub/ai-conversation-silent-failure-qa.html
  • practice-hub/ffmpeg-silero-vad-practice.html

接着解决下一个问题