VOICE QA / RESEARCH 2026
← 调研中心

AI Voice Quality Assurance · Special Research

用户有声,AI 无声:会话录音批量质检

从波形症状走到可运营的“应答机会”检测:工程规则负责计时与召回,ASR / 大模型负责语义排误报,链路日志负责根因。

信息截点 2026-08-31研究范围 GitHub / 社区 / 官方文档交付 本地单页 HTML
证据边界

仅凭录音可以发现“疑似无声症状”,不能证明根因在 EOU、ASR、LLM、工具、TTS、RTP、播放器还是录音器。根因确认需要组件与播放侧事件。

01 · Executive decision

先做确定性漏斗,再让大模型处理歧义

本轮没有找到一个成熟、通用、可直接端到端判定该缺陷的开源仓库。可靠组件分别解决分轨、VAD、ASR、说话人分离、标注和运行时观测;最终需要组装业务状态机。

01 / UNIT

质检单位是应答机会

用户完成有效发言,业务状态要求 AI 回答,但观察窗内没有可听 AI 语音。不是泛化的“静音片段”。

02 / DATA

先确认三件事

录音是否分轨、通道映射是否可信、是否能取得 Agent / TTS / RTP / 播放日志。它们决定准确率和归因上限。

03 / STACK

推荐混合架构

VAD / 规则全量初筛,ASR + 文本 LLM 语义复核,音频 LLM 只看疑难短片段,人工负责金标与边界。

按数据条件直接选路

最优

双轨 + 日志

规则为主,LLM 只复核歧义;可检测并大概率定位根因。

可生产

双轨、无日志

VAD + ASR + 文本 LLM 可高质量发现症状,但根因只能标为未知。

需弃权机制

单轨混录

Diarization + 角色映射 + ASR + 规则;必须允许 role_uncertain,不能强制二选一。

02 · Detection contract

“无声故障”必须先定义成状态机

用户有效语音结束 U1排除噪声、极短触发和未完成话轮
EOU / 状态确认语义或状态机确认用户话轮已结束
expected = true业务上本轮确实应由 AI 回复
观察 AI 起音 A0直到下次用户开口、挂机或最大窗口
延迟或无声A0 过晚 → delayed;A0 缺失 → suspected silent
response_gap_ms = first_ai_audible_speech_ms - user_turn_end_ms
若 AI 从未出声,保存观察窗时长并标记 right_censored = true;不能把失败样本从延迟分母删除。

推荐标签体系

confirmed_silent_failure日志确认系统应答,但播放侧/录音中没有 AI 可听语音。
suspected_silent_failure用户有效话轮后,观察窗内没有检测到 AI 语音;仅代表症状。
delayed_ai_responseAI 最终出声,但超过当前业务阶段阈值。
valid_no_response告别挂机、转人工、显式等待、取消或无需回答。
user_incomplete_or_backchannel用户未说完,或只是“嗯 / 啊”等附和。
non_speech_trigger咳嗽、键盘、铃声、音乐、底噪触发能量或 VAD。
role_uncertain单轨分离后无法稳定判断用户 / AI;应弃权或送人工。
recording_or_channel_defect整段 AI 轨缺失、全零、错映射、截断或编码异常。

不要混用三层概念

音量静音

样本幅度低于阈值;FFmpeg silencedetect 属于这一层,背景噪声会干扰。[S1]

无人说话

VAD 判断没有人声;Silero VAD 不区分用户与 AI,也不判断语义。[S2]

Dead air / 无进展

用户合理期待流程继续,但没有可听回复或有用进展,是话轮级产品故障。[S10][S11]

03 · Five viable routes

五种方案不是互斥选项,而是成本递增的漏斗

数据形态决定可得结论与主要风险
现有数据推荐方案能达到的结论主要风险
用户 / AI 双轨 + 全链路日志分轨 VAD + 状态机 + 日志瀑布检测并大概率定位根因时钟不同步、播放起音未埋点
双轨、无日志分轨 VAD + ASR + 语义规则高质量症状检测无法区分 LLM / TTS / RTP 根因
单轨 + 固定 AI 音色参考Diarization + speaker verification + ASR映射角色后检测回声、串音、变声、多人用户
单轨、无音色参考Diarization + 结构映射 + LLM带置信度候选speaker 标签翻转、重叠、短句
仅有转写文本 LLM 判断是否应答发现流程 / 语义异常不能证明 AI 是否真的出声
A · 首版推荐

双轨工程脚本基线

FFprobe / FFmpeg 体检与分轨 → Silero VAD → 合并短间隙 → 用户话轮后搜索 AI 首个人声 → JSONL + 复核片段。CPU 可批跑、可解释、隐私最好;但只能报症状。

B · 单轨

Diarization + ASR + 规则

pyannote.audio、WhisperX 或 FunASR 生成匿名 speaker 时间线;再用固定音色、开场白或元数据映射角色。无法稳定映射就输出 role_uncertain。[S4][S5][S6]

C · 语义复核

ASR + 文本大模型

LLM 只判断完整问题、告别、附和、转人工、显式等待等“是否应答”语义,输出固定枚举;不让它生成波形时间、speaker 真值或媒体根因。

D · 疑难裁判

音频原生大模型

只发送用户开口前 1 秒到结束后 5–10 秒的候选窗口。OpenAI gpt-audio-1.5 或本地 Qwen3-Omni 可判断人话 / 提示音 / 预期回复,但不替代 VAD 和通道真值。[S7][S8]

E · 生产终态

混合生产方案

规则保召回和复算,ASR / 文本 LLM 降低语义误报,音频 LLM / 人工解决歧义,T0–T10 日志负责根因与 owner 路由。

阈值提示:Hamming 的“用户结束后 >2 秒进入调查、活跃话轮 >3 秒形成 QA 事件”只能作为 starter threshold,不是通用 SLA;必须按业务阶段与本方金标校准。[S10]

04 · Recommended production architecture

把每类工具放在它最擅长的位置

入口体检格式 / 通道 / 全零 / 截断 / 时长
双轨用户轨、AI 轨分别 VAD
话轮时间线确定性角色真值
阶段化 gap 规则低成本全量召回
单轨入口混音录音 + 可选音色参考
Diarizationspeaker 分离 + overlap
角色映射音色 / 开场白 / 元数据
置信度与弃权保留 role_uncertain
两路汇合:用户话轮 / AI 话轮 + 观察窗 + 原始证据
ASR + 文本 LLM判断是否应该回答
音频 LLM / 人工只审困难与高风险候选
T0–T10 日志对齐定位 EOU / ASR / LLM / TTS / RTP
QA 闭环根因队列 / 金标 / 趋势 / 回归

若能重新导出数据,优先争取:用户与 AI 分轨、单调时钟时间戳、Agent 生成与播放事件、通道定义、固定 AI 音色的 2–10 秒干净参考片段。OpenAI 当前 diarized transcription 可用已知说话人参考,但仍要在本方样本验证角色与切段。[S9]

05 · GitHub stack & implementation

开源组件可拼装,但没有端到端成品

GitHub / 工具选型表
组件用途与价值不能替代什么
FFmpeg [S1]分轨、重采样、全零 / RMS / 静音与格式体检不是人声、角色或语义检测
Silero VAD [S2]8k / 16k 人声区间,CPU 全量初筛,MIT不分 speaker,不判断完整话轮
faster-whisper [S3]离线多语种 ASR、词时间戳、量化与 VAD不自带可靠业务角色
WhisperX [S4]ASR + 强制对齐 + pyannote diarization重叠语音和 diarization 有公开限制
pyannote.audio [S5]speaker change / overlap / embedding / diarizationspeaker ID 不等于用户 / AI
FunASR [S6]中文 ASR、FSMN-VAD、标点、CAM++ speaker模型权重许可证需逐项核查
TEN VAD [S14]16k、ONNX / C / Python / WASM,可做对照项目方结果需独立复测
whisper.cpp [S15]Apple Silicon / 低依赖离线批处理仍只是 ASR / VAD 组件
librosa split [S16]快速非静音能量基线不是人声 VAD
Qwen3-Omni [S7]本地音频理解与疑难候选解释部署重,不是确定性计时器
OpenAI Audio / diarize [S8][S9]云端音频理解、speaker-labeled 转写数据出域、成本与供应商依赖
Label Studio [S17]候选片段、speaker 与 ASR 人工标注不是自动检测器

工程脚本最小算法

查看输入 Manifest 示例
schema_version: 1
call_id: c_20260831_00017
recording_path: recordings/c_00017.wav
recording_sha256: ...
channel_layout: stereo
user_channel: 0
agent_channel: 1
call_start_epoch_ms: 1788140000000
locale: zh-CN
workflow: after_sales_refund
agent_voice_ref: refs/agent_voice.wav
trace_path: traces/c_00017.jsonl

未知字段留空,不能用默认值伪造真值;每批先抽样确认左右通道映射。

查看时间线规则伪代码
for user_turn in merge_user_vad_segments(user_segments, config):
    if not acoustic_user_qualified(user_turn):
        continue
    observation_end = min(
        next_user_turn_start(user_turn) or call_end,
        hangup_time or call_end,
        user_turn.end + config.max_observation_ms,
    )
    first_agent = first_agent_speech(
        start=user_turn.end + config.post_user_guard_ms,
        end=observation_end,
    )
    gap_ms = (first_agent.start if first_agent else observation_end) - user_turn.end
    if gap_ms >= phase_threshold(call_state):
        emit_for_asr_and_semantic_review(...)

生产实现还需合并极短 VAD 间隙、单独处理 barge-in、保存用户重复开口证据、区分提示音 / hold music / 真人接管,并把阈值配置版本化。

查看推荐输出事件
{
  "event_type": "voice_agent.suspected_silent_failure",
  "call_id": "c_20260831_00017",
  "turn_id": "t_06",
  "phase": "after_user_speech",
  "user_end_ms": 42180,
  "observation_end_ms": 45940,
  "first_agent_speech_ms": null,
  "gap_ms": 3760,
  "expected_ai_response": true,
  "acoustic_confidence": 0.97,
  "role_confidence": 1.0,
  "semantic_confidence": 0.88,
  "reason_codes": ["complete_user_question", "no_agent_vad", "next_user_reprompt"],
  "detector_version": "dead-air-v0.1.0",
  "review_status": "pending"
}

不建议的捷径

只用 RMS == 0:底噪、压缩噪声和舒适噪声会让 dead air 非零。

只看整通静音比例:关键话轮会被平均值淹没。

只看转写是否为空:ASR 空文本不等于用户没说话。

把 speaker_0 固定为 AI:编号无业务语义且会跨文件翻转。

整通丢给音频 LLM:成本高、时间定位不稳、难复算。

AI 轨有能量就算回答:提示音、音乐、回声也会误通过。

06 · Community evidence & root cause

社区案例说明:同一个“无声”症状,故障点完全不同

以下 GitHub issues 是单个用户报告或维护者讨论,只能证明失败模式存在,不能当作发生率或模型排名。

个案 · 声学

VAD 假阳性与电话域漂移

气流被判为 voice;8k 窄带电话在安静背景误触发、强噪声漏检。保存能量、VAD、ASR 三组独立证据。[S18][S25]

个案 · ASR

ASR 幻觉不等于真实人声

faster-whisper 与 Whisper 讨论了 VAD / 静音附近的 hallucination;文字产出不能覆盖声学真值。[S19][S20]

个案 · EOU

话轮迟迟不提交

背景噪声和长静音配置可能让 STT commit 延迟 10–15 秒;应先查 TURN_NOT_COMMITTED。[S23][S24]

个案 · 角色

重叠与快速轮换污染 speaker

重叠检出和按整句多数 speaker 分配会退化;barge-in 与 fast turns 必须单独分桶。[S21][S29]

个案 · 生成

LLM 成功不等于可听回复

请求正常结束、有 token,却没有 text frame、TTS 和最终音频;最终指标必须落到 audible onset。[S26]

个案 · 通道

只保留一轨会制造假异常

多声道处理误留一轨,会让人声概率异常低;缺轨 / 换轨应进入回归测试。[S28]

T0–T10 组件时间瀑布

日志缺失或过慢时的初步归因
时间点事件初步归因
T0user_acoustic_end声学起点真值
T1vad_speech_stoppedVAD / 噪声 / 阈值
T2eou_commitendpointing / 状态机
T3asr_finalASR final / 连接
T4llm_request编排是否启动
T5llm_first_token模型 / 限流 / Prompt
T6tool_endCRM / API / 重试 / 超时
T7tts_first_audioTTS 供应商 / 连接
T8downstream_first_rtp媒体网关 / 编码
T9playout_or_audible_onset播放队列 / 静音 / 设备
T10录音 AI 轨首次人声录音器与最终可见证据

本地路线

FFmpeg + Silero VAD 成本最低、隐私最好;ASR / diarization 只对候选或按需全量。工具许可证不自动覆盖模型权重与 gated 条款;pyannote 遥测配置应纳入审计。

云端路线

录音可能含声纹与 PII。优先上传脱敏短候选,使用短时对象权限;保存模型快照、提示词、结构化输出和失败状态,并按当日合同核对区域、留存与训练使用。

07 · Gold set, metrics & rollout

上线门槛要衡量主任务,不只看 VAD 或 ASR 分数

金标单位同样是“应答机会”。随机正常通话、规则候选、困难负样本、真实事故和投诉要同时进入抽样;开发 / 校准 / 隐藏集按完整 call_id 切分。

Precision / Recall / F1主任务准确度;同时看正类召回与人工误报成本。
每千应答机会故障数固定在真正 eligible turns 的分母上。
EOS → audible tailP50 / P90 / P95 / P99 与尾部率,避免平均值掩盖长无声。
Coverage / Abstention单轨角色不确定时,不强迫模型猜。
角色混淆与切片指标8k / 16k、语言、线路、噪声、重叠、短句、阶段。
人工分钟 / 100 calls衡量队列能否运营,而不是只看离线模型分数。
完整指标与阈值校准

补充报告:calls with ≥1 failure、false positives / 100 calls 或 / audio hour、delayed-response 检出率、gap 时间误差、仅在有日志真值时的 root-cause accuracy、RTF、CPU/GPU 小时、云 API 成本 / 音频小时。

  1. 开发集按阶段画正常 gap 分布;
  2. 用人工标签计算 PR 曲线;
  3. 关键流程与等待 / 查询流程分开设阈值;
  4. 隐藏集锁定后只运行一次;
  5. 上线后监控漂移,不在测试集反复调参。

四阶段 POC

数据体检

  • 格式 / 通道 / 采样率 / 截断
  • 人工确认 20–50 通
  • 确认日志可得性
  • 固定标签规范

规则基线

  • FFmpeg 统一音频
  • Silero VAD;单轨试 diarization
  • 2 / 3 秒仅作召回初值
  • 输出 JSONL + 候选 WAV

语义降误报

  • faster-whisper / FunASR
  • 文本 LLM 判 expected response
  • 音频 LLM 只看冲突样本
  • 比较四条路线增量价值

生产闭环

  • 对齐 T0–T10
  • 生成 owner / reason code
  • 事故转回归样本
  • 按版本 / 线路 / provider 看趋势

发布门禁

  • 结果可从 manifest + 配置 + 模型版本 + raw event 重算
  • 通道映射、采样率与录音完整性检查通过
  • 关键切片不被总体平均掩盖
  • LLM Judge 已与盲化人工标签校准
  • role_uncertain 和解析失败不从分母消失
  • 每个候选能播放上下文并看到规则理由
  • 未接日志只标症状候选,不宣称根因
  • 至少两位标注员独立标边界样本并仲裁
第一阶段成功标准:高召回找到真实“用户有声、AI 无声”;把自然停顿、告别和角色不确定样本控制在可运营队列内;每条结果可播放、复算、解释;有日志时能路由到正确组件。
实时链路延伸:如果问题是 MiniMax TTS 经多个 FreeSWITCH 桥接后出现某一端卡顿,请继续看 多 FreeSWITCH 语音质量监控专题;它用相邻 hop 差分把录音症状推进到 TTS、buffer、RTP/RTCP 和终端定位。

08 · Sources

30 条官方、仓库与社区证据

官方能力、项目自报与社区个案分层呈现;社区 issue 不代表发生率。

  1. S1
    FFmpeg Filters — silencedetect

    按音量阈值与持续时间检测静音,支持逐通道元数据。

  2. S2
    snakers4/silero-vad

    MIT;8k / 16k、PyTorch / ONNX 与人声时间戳。

  3. S3
    SYSTRAN/faster-whisper

    CTranslate2 Whisper、批处理、词级时间戳与 Silero VAD。

  4. S4
    m-bain/whisperX

    强制对齐、词时间戳、pyannote diarization 及公开限制。

  5. S5
    pyannote/pyannote-audio

    说话人分离、重叠、embedding、DER benchmark 与遥测配置。

  6. S6
    modelscope/FunASR

    ASR / VAD / 标点 / speaker pipeline 与中文相关模型。

  7. S7
    QwenLM/Qwen3-Omni

    音频输入、理解、描述与混合音频分析。

  8. S8
    OpenAI Docs — Audio and speech

    音频输入 / 输出与 Realtime 架构。

  9. S9
    OpenAI Docs — Speaker diarization

    Diarized JSON、已知说话人参考与长录音分块。

  10. S30
    OpenAI Docs — Transcription capability selection

    普通转写、speaker labels、词时间戳和字幕的模型分工。

  11. S11
    Twilio Voice Insights — Call Summary

    Silence Detected 的缺 RTP / 一方全静音定义。

  12. S12
    LiveKit Agents — Turns overview

    VAD、STT endpointing 与语义 / 声学话轮检测。

  13. S13
    Deepgram — End of Speech Detection

    噪声对 VAD endpointing 的影响与启发式边界。

  14. S14
    TEN-framework/ten-vad

    16k VAD 与 ONNX / C / Python / WASM 接口。

  15. S15
    ggml-org/whisper.cpp

    C / C++ Whisper、Apple Silicon 加速、量化与 VAD。

  16. S16
    librosa effects.split

    按相对峰值阈值返回非静音区间。

  17. S17
    Label Studio — Speaker Segmentation

    音频区域、说话人和转写人工标注模板。

  18. S22
    gong-io/gecko

    已标注 deprecated / no longer maintained,仅作历史参考。

  19. S10
    Hamming AI — Voice Agent Dead Air Detection

    2026-06-27;话轮定义、starter threshold、根因矩阵与事件 schema,属厂商实践。

  20. S18
    Silero VAD issue #430

    吹气 / 麦克风气流触发 VAD 的用户报告。

  21. S19
    faster-whisper issue #843

    VAD / ASR 与 hallucination 边界讨论。

  22. S20
    openai/whisper PR #1838

    跳过疑似幻觉附近静音的改动与讨论。

  23. S21
    pyannote.audio issue #1987

    重叠说话检出的用户报告。

  24. S23
    LiveKit Agents issue #3701

    号码 / 邮箱场景中的 endpoint delay 与误切权衡。

  25. S24
    LiveKit Agents issue #4087

    用户停说后 turn 迟迟不提交与双 VAD 权衡。

  26. S25
    Silero VAD issue #606

    8k 窄带电话误触发 / 漏检及版本跟进。

  27. S26
    Pipecat issue #4850

    LLM 请求结束却无 text / TTS / 可听回复的日志个案。

  28. S27
    AgentClash issue #754

    确定性 validator 先于 LLM Judge 的项目设计提案。

  29. S28
    Silero VAD issue #657

    多声道只保留一轨导致检测异常的用户自查。

  30. S29
    pyannote.audio issue #1143

    快速话轮按整句多数 speaker 分配退化的用户报告。