A → B/C → D 分阶段混合
- A:TTS Gateway 分块埋点 + FreeSWITCH ESL/CDR + Prometheus/日志/trace;
- B/C:HOMER/HEPipe 或 VoIPmonitor 增加逐跳 SIP/RTP/RTCP 证据;
- D:SIPp 主动呼入 + 异常 PCM/PCAP 抽样,补最终可听真值。
Inbound AI Contact Center · FreeSWITCH · MiniMax TTS
把“某一端卡顿”从主观投诉变成可定位的证据链:同一通话串联 TTS 分块、每个 FreeSWITCH call leg、逐跳 RTP/RTCP、播放缓冲和终端录音。
01 · Decision
平均 MOS、节点 CPU 或一份 CDR 都会丢失局部断续和因果顺序。最小正确方案是让每个观测点都能回答:上一跳什么时候产出、这一跳什么时候收到、缓冲是否归零、下一跳发出了什么。
conversation_id 串联 MiniMax trace_id/session_id、SIP Call-ID/X-cid、FS UUID、RTP SSRC/五元组和录音。桥接后 Call-ID 可能改变,不能靠单字段硬拼。
unlocalized,不要直接归因 MiniMax 或某台 FreeSWITCH。02 · Evidence boundary
WebSocket 返回音频、trace_id、session_id、is_final 与结束统计;公开 schema 没有逐块业务序号和生成时间轴,需客户端自建。
RTP 入/出 packet/bytes、skip、jitter packet 等是只读诊断变量;RTCP 可按配置启用。
前者侧重 HEP、呼叫流与可选 VQRTCP/SIPREC;后者把 RTP 质量、PCAP 和录音做得更一体化。
SIPp 可做周期合成呼入;mod_audio_stream 可从 media bug 旁路 L16 PCM,但必须控制背压和版本/edition 边界。
FreeSWITCH 邮件列表有人列出 XML CDR jitter 字段,同时明确说“不知道准确性如何”;需用当前版本与 PCAP 校准。
版本、codec、ptime、转码、SRTP、direct media、jitter buffer、MiniMax 协议和异常侧都仍需现场盘点。
03 · Reference architecture
媒体主链不被监控组件阻塞;所有观测异步进入统一关联层。O1–O5 的节点、字段和采集方式可按实际拓扑扩展。
Prometheus 聚合指标;日志/trace 存事件;短 TTL 对象存储保存异常 PCAP、双轨 WAV 和哈希。
conversation_id + leg_id + stream_id + window。把块时间线、call flow、RTP 序号与最终录音同屏展示。
先告警症状,再给疑似组件;证据不足时自动提升该通话的音频/PCAP 抽样。
完整架构图:独立页面采用 doc-wide 视图,标明参考重构与复杂度取舍。
打开全宽架构图 →04 · Metrics contract
first_audio · interarrival · decoded_audio_ms · buffer_ahead · underflowuuid · bridge · codec · ptime · rtp in/out · skip · jitter · RTCPseq gap · duplicate · reorder · timestamp · SSRC · burst lossnear silence · frozen frame · discontinuity · clipping · audible onset候选阈值只是校准起点,不是生产默认值。不同模型、区域、codec、ptime 和初始 buffer 会改变正常分布。
05 · GitHub and community options
TTS Gateway 埋点 + ESL/CDR + Prometheus/Grafana + 日志/trace。
FreeSWITCH 原生 HEP、X-cid 关联 B2BUA,HEPipe 把 ESL/RTCP 送入 HEP;HOMER 11 统一 ingest、DuckLake、API 与 UI。
通过 SPAN/TAP/ERSPAN/SBC 镜像采集 SIP/RTP/RTCP,提供 MOS、jitter、loss、PCAP;Web GUI 另行商业采购。
SIPp 周期呼入已知语料;异常通话用 `mod_audio_stream` 或 SIPREC 旁路 PCM。
| 工具 | 真正适用 | 不能单独证明 | 许可/边界 |
|---|---|---|---|
| Wireshark | 单次 PCAP 的 sequence/delta/jitter/skew、错误时间戳和插入静音取证 | 常驻告警与统一业务关联 | 官方工具 |
| prometheus-freeswitch-exporter | 节点、通道、网关、ESL 健康基线 | 可听卡顿和逐跳 RTP | Apache-2.0;活跃度现场评估 |
| NISQA | 录音/切片的 overall 与 discontinuity 等辅助分 | 卡顿发生在哪一跳 | 代码 MIT;预训练权重 CC BY-NC-SA |
| DNSMOS | 降噪/整体语音质量的补充分数 | TTS buffer 欠载和 RTP 序号缺口 | DNS Challenge 代码 MIT;当前集成文件复核 |
| Pipecat MiniMax adapter | 现有 TTFB/usage 与 frame 处理的埋点参考 | trace/session、块间隔、buffer underflow | 作为代码参考,不等于现网方案 |
06 · Executable runbooks
下面的命令用于隔离 POC 节点,不代表已在你的现网执行。每条路线都区分官方命令、本文参考配置和必须现场确认的边界;生产上线前仍要按你们的 FreeSWITCH 版本、网络与合规要求评审。
适合跨呼叫中心看 SIP ladder、B2BUA 两腿关联和 FreeSWITCH RTCP。HOMER 11 已是 ingest + DuckLake + API + UI 一体化,不应再照搬 HOMER 7/10 的旧栈教程。
每台 FS 的 mod_sofia 把 SIP 以 HEP3 发往 HOMER;本机 HEPipe 通过回环 ESL 8021 读取 RTCP event,再以 HEP UDP 发往 HOMER。仅允许已知 FS 源访问 9060;UI 8080 与 metrics 9090 只对管理/监控网开放。
FS-A mod_sofia --HEP3/SIP--┐ FS-A ESL:8021 -> HEPipe ---┼--UDP:9060--> HOMER 11 FS-B mod_sofia --HEP3/SIP--┤ ├─ UI :8080 FS-B ESL:8021 -> HEPipe ---┘ └─ metrics :9090
官方发布资产 AMD64 deb 的 SHA-256 来自 GitHub Release API;ARM64 包与 hash 见发布页。发行包只放置 homer.json.example,必须复制成真实配置后再启动。
curl -fLO https://github.com/sipcapture/homer/releases/download/11.0.336/homer-core_11.0.336_amd64.deb echo "ae08448285f31f860f4ed48f8339a79bc2c4ae9c1da9f3d9b74cb4dc4d7708b9 homer-core_11.0.336_amd64.deb" | sha256sum -c - sudo apt install ./homer-core_11.0.336_amd64.deb sudo install -m 0600 /usr/local/homer-core/etc/homer.json.example /usr/local/homer-core/etc/homer.json sudo install -d /data/homer/parquet /var/lib/homer /usr/local/homer-core/bin/homer version
官方 Docker quick start 约需 8 GB 内存且 Compose 引用 HOMER/RustFS latest 与示例 Token。若走 Docker,先锁镜像 digest、换凭据、限端口,不能直接作为生产清单。
本文参考配置 下列只是需要覆盖/核对的关键字段,不可直接替换官方完整 JSON。node token 与 coordinator node token 相同;JWT 使用另一随机值;对外访问用防火墙或反向代理。
"ingest": {
"udp": {"enable": true, "host": "0.0.0.0", "port": 9060},
"sip": {
"aleg_ids": ["X-CID", "X-Session-ID"],
"custom_headers": ["X-Trace-ID"],
"force_aleg_id": false
}
},
"node": {"flight_server": {
"host": "127.0.0.1", "port": 50051,
"auth_token": "REPLACE_WITH_RANDOM_NODE_TOKEN"
}},
"coordinator": {
"http_server": {"host": "127.0.0.1", "port": 8080},
"nodes": [{"name":"local", "host":"127.0.0.1", "port":50051,
"token":"REPLACE_WITH_THE_SAME_NODE_TOKEN", "priority":1}],
"jwt": {"secret":"REPLACE_WITH_DIFFERENT_RANDOM_JWT_SECRET", "expire_hours":24}
},
"prometheus": {"enable":true, "host":"127.0.0.1", "port":9090, "path":"/metrics"}
sudo systemctl daemon-reload sudo systemctl enable --now homer-core sudo systemctl status homer-core --no-pager sudo journalctl -u homer-core -b --no-pager | grep bootstrap_password curl -fsS http://127.0.0.1:9090/metrics | head
首次管理员密码是随机值,只在首次日志写入一次;首次登录后立即更换。不要把日志或 Token 放进报告、截图或前端。
HOMER Wiki 原始参数 FS-A 使用 capture_id=1001,FS-B 使用 1002;桥接前写 X-cid。配置先在 POC profile 重载,现网 profile 重启会影响通话,必须走维护窗口。
<!-- autoload_configs/sofia.conf.xml -->
<param name="capture-server"
value="udp:HOMER_MANAGEMENT_IP:9060;hep=3;capture_id=1001"/>
<!-- sip_profiles/internal.xml / external.xml -->
<param name="sip-capture" value="yes"/>
<!-- bridge 之前 -->
<action application="set" data="sip_h_X-cid=${sip_call_id}"/>
<action application="set" data="rtcp_audio_interval_msec=5000"/>
fs_cli -x "sofia global capture on" fs_cli -x "sofia global capture off" fs_cli -x "sofia profile internal capture on" fs_cli -x "sofia profile internal capture off"
HEPipe 固定配置 ESL 必须绑定 127.0.0.1:8021 并更换默认 ClueCon;HEP_ID 与该 FS 的 capture_id 一致。
git clone https://github.com/sipcapture/hepipe.js.git cd hepipe.js git checkout --detach 5895a6cb304733e07c518f91612db2181957decb
var config = {
hep_config: {debug:false, HEP_SERVER:'HOMER_MANAGEMENT_IP', HEP_PORT:9060},
esl_config: {
debug:false, ESL_SERVER:'127.0.0.1', ESL_PORT:8021,
ESL_PASS:'REPLACE_WITH_RANDOM_ESL_PASSWORD', HEP_ID:1001,
report_call_events:false, report_rtcp_events:true, report_qos_events:false
}
};
module.exports = config;
docker compose up -d --build docker compose ps docker compose logs --tail=100 hepipe
当前 HEPipe 会订阅 ESL ALL;即使只上报 RTCP,也会接收全部事件。HEP 输出为 UDP,无 TLS/确认/独立健康检查,先单节点小流量验证,并置于管理网或 VPN。
tcpdump -ni any udp port 9060 证明 HEP 到达。ESL ready,HOMER 同时收到 SIP 与 HEP type 5 RTCP。查 RTCP interval、对端是否真正产生 RTCP、ESL 密码/重连;无 RTCP 时不能凭 HOMER 推断卡顿。
查 B-leg INVITE 的 X-cid、HOMER aleg_ids;需要时再启用受限 Lua correlation,不盲开 force。
它订阅 ALL;只保留 RTCP flag、小流量、每 FS 单实例,并观测 CPU/RSS/ESL event rate。
先 profile/global capture off,再 stop HEPipe,最后停 HOMER;保留数据卷,不执行 down -v。
15 条已知测试通话 100% 找回正确两腿;SIP/RTCP 方向不串;采集器无可见 drop;关闭采集不影响媒体;至少一个实验室故障定位到正确 hop。
适合在中心边界被动计算 RTP/RTCP、MOS、jitter/loss 并保存取证头部。开源 sniffer 是 GPL-2.0;Web GUI 单独商业。GitHub 没有当前 Release,不能虚构“latest release”。
sensor-A / sensor-B 各自接专用 SPAN/TAP 接口并使用唯一 id_sensor。镜像必须含双方向 SIP 和实际 RTP/RTCP;direct media 绕路、单方向 SPAN 或 SRTP payload 加密都不会被工具自动补全。
FS-A/SBC ──SPAN/TAP──> sensor-A (id=101) ─┐
├─ MySQL / 商业 GUI(可选)
FS-B/SBC ──SPAN/TAP──> sensor-B (id=102) ─┘
仓库 Debian 指引 current-stable 静态包会漂移;可复现 POC 采用固定源码。先在 MySQL 建独立数据库与最小权限账号。
sudo apt-get update sudo apt-get install build-essential git libmysqlclient-dev libvorbis-dev libpcap-dev unixodbc-dev libsnappy-dev libcurl4-openssl-dev libssh-dev libjson-c-dev librrd-dev liblzo2-dev liblzma-dev libglib2.0-dev libxml2-dev libzstd-dev liblz4-dev git clone https://github.com/voipmonitor/sniffer.git cd sniffer git checkout --detach 9dfb2fc9aa0552a02152aca3ac9b6187dc333a2f ./configure make -j2 sudo make install command -v voipmonitor
本文 POC 参考配置 仓库样例当前实际启用 savertp=yes、savertcp=yes、savegraph=yes。这里改为 RTP header、无音频、无 graph;生产保留期再按合规与事故样本调整。
[general] interface = eth1 id_sensor = 101 name_sensor = fs-a-span managerip = 127.0.0.1 managerport = 5029 sipport = 5060 mysqlhost = 127.0.0.1 mysqlport = 3306 mysqlusername = voipmonitor mysqlpassword = REPLACE_WITH_RANDOM_DB_PASSWORD mysqldb = voipmonitor spooldir = /var/spool/voipmonitor savesip = yes savertp = header savertcp = yes saveaudio = no savegraph = no
savertp=header 仍可基于在线 RTP 计算 sequence/jitter/loss,但不把语音 payload 写入 PCAP。若数据库 sensor_conf 开启加载,它可能覆盖文件配置,验收要核对最终生效值。
README quick start 写 --config,但当前源码帮助、init 脚本与配置注释一致使用 --config-file;本手册采用后者。先在前台看到镜像流量和 DB 初始化成功,再启用 service。
sudo /usr/local/sbin/voipmonitor --config-file /etc/voipmonitor.conf -k -v 1
sudo install -m 0755 config/init.d/voipmonitor /etc/init.d/voipmonitor sudo install -m 0644 config/systemd/voipmonitor.service /etc/systemd/system/voipmonitor.service sudo systemctl daemon-reload sudo systemctl enable --now voipmonitor sudo systemctl status voipmonitor --no-pager
官方 systemd unit 实际调用 init 脚本,init 再调用 --config-file /etc/voipmonitor.conf;两份启动文件与配置必须一起纳入变更和回滚。
tcpdump -ni eth1 -c 200 'port 5060 or udp portrange 10000-40000',确认 VLAN、双方向和端口。SELECT id_sensor, calldate, callend, caller, called FROM voipmonitor.cdr ORDER BY calldate DESC LIMIT 10;
查 direct media、单向 SPAN、SDP/NAT 端口;“没抓到”不能等同于“对端没发”。
先查 NIC ring、sensor CPU、libpcap drop、镜像口 oversubscription,分离采集丢包与业务丢包。
查 savertp/savegraph/saveaudio、PCAP/tar 与 TTL;POC 默认 header/no-audio/no-graph。
stop + disable service,确认进程退出后由网络团队撤销明确 SPAN;默认保留 DB/spool,另审批清理。
15 条通话全部落到正确 sensor/Call-ID;双方向 RTP 与 PCAP 对上;一个实验室 burst loss 在正确窗口识别;sensor 自身 drop 可测;成本可外推;关闭 sensor 不影响媒体。
07 · First divergence
suspected_component。一个 MOS 下降不能直接变成“MiniMax 故障”。08 · Ablation study · 2026-09-05
固定同一批电话,逐层屏蔽证据;再以真实进程启停测成本。用配对结果回答 TTS 埋点、FreeSWITCH、HOMER/HEPipe、VoIPmonitor 和可听特征分别带来的增量。
完整组 + 6 个证据消融组 + 4 个产品组,覆盖 HEPipe 独立增量和 H/V 组合。
8 类故障候选 + 8 类健康/可见性对照;以终端金标确认实际是否受损。
POC 建议留出 320 通测试电话、3,520 条配对预测;同一通话仍只算一个样本。
| 家族 | 保留时可见 | 消融完整性检查 |
|---|---|---|
| T · TTS/播放 | chunk arrival、样本数、FIFO 水位、underflow | trace/log 中的复制值与 TTS 派生根因也屏蔽 |
| F · FS 内部 | ESL 生命周期、bridge、codec/ptime、调度 | 包计数归 N;RTCP、相关 MOS 归 R,不混入 F |
| R · RTCP | SR/RR/XR、接收端质量报告 | 同时去掉直接 ESL、HEPipe、VoIPmonitor 的 RTCP 副本 |
| N · RTP 头部 | 逐跳 sequence、timestamp、arrival、loss/jitter | FS 包计数、原始头部和依赖它们的派生值同时屏蔽 |
| A · 可听特征 | PCM gap/click/freeze、端侧 playout、声学评分 | 仅删除检测器输入;独立金标录音与盲审继续保留 |
| C · 跨源关联 | conversation↔TTS↔UUID↔Call-ID↔SSRC 映射 | 删除 join map、X-cid、全局文件名;按源保留局部匿名 ID |
每条事件带 family/source/derived_from/event_time/available_at/visibility。屏蔽任一父家族,其派生输出也屏蔽;缺数据标 unavailable。DROP_C 必须接收多通并发交错的独立源流,不能把已经按通话拼好的 bundle 交给“无关联”检测器。随机 case_id 只给事后评分器。
| 组 ID | 该组可见内容 | 主要检验 |
|---|---|---|
| FULL | T F R N A C,HOMER/HEPipe 与 VoIPmonitor 均采集 | 完整参考组,同时作为 H+V 产品组 |
| DROP_T | 完整组去掉所有 T | 缺料与 Gateway 消费停顿还能否区分 |
| DROP_F | 完整组去掉所有 F | FS 内部处理区间是否变成盲区 |
| DROP_R | 完整组去掉所有 R | RTP 头部可否替代接收端质量报告 |
| DROP_N | 完整组去掉所有 N | 短突发与 RTP timestamp 异常是否漏检 |
| DROP_A | 完整组去掉所有 A | RTP 连续时的毛刺/终端 freeze 是否可见 |
| DROP_C | 完整组去掉跨源 C | 多 FS、换腿、并发流是否串线或误定位 |
| P_BASE | T F A C;不消费 R/N/HEP | 自建低侵入 MVP 的覆盖范围 |
| P_H_SIP | P_BASE + 原生 HEP SIP + HOMER | SIP 关联的增量;关闭所有 RTCP 输入 |
| P_H | P_H_SIP + HEPipe RTCP,无 VoIPmonitor 输入 | 与 P_H_SIP 配对测 HEPipe 的增量 |
| P_V | P_BASE + VoIPmonitor SIP/RTP/RTCP,header/no-audio | VoIPmonitor 路线;不消费 HOMER/HEPipe 输入 |
FULL − P_V 衡量整个 HOMER/HEPipe 通路的边际价值;P_H − P_H_SIP 衡量没有替代 RTCP 副本时 HEPipe 的价值。所有组共享冻结的检测规则和基础可见性监测,产品原生 UI 的人工排障时间另测。
ΔL(去掉 X) = L(FULL) − L(DROP_X) H/V 交互 = L(FULL) − L(P_H) − L(P_V) + L(P_BASE) L = 正确区间定位通话数 / 全部真实故障通话数
边际贡献不具可加性。H/V 比较需相同 T/F/A/C 基础、采集位置与 available_at;会后 CDR 不能提前喂给实时告警。仅屏蔽字段无法测进程运行成本。
| 场景 | 单一变量 / 建议起点 | 独立真值和判定 |
|---|---|---|
| F01 · TTS 停供 | 稳定出话中暂停 chunk 释放 300/600 ms | 有实际可听故障才标阳性;定位 tts_path |
| F02 · buffer 消费 | 到料正常,Gateway consumer 暂停 100/300 ms | 比较入队与出帧;gateway_playout |
| F03 · 单向丢包 | 独立测试 RTP 出口短时 100% loss,目标 4/8 包 | 实际剂量由两侧 PCAP 确认;inter_center |
| F04 · 晚到/抖动 | 目标下行 delay 60±20 ms,固定接收 buffer | 核验 late 与可听缺口;inter_center |
| F05 · RTP 时钟 | 测试重放器插入 timestamp 跳变,seq 连续 | 按 codec 时钟核验;一批内固定注入位置 |
| F06 · FS 媒体 | 专用 FS 容器减少 CPU quota,语料/负载不变 | 对比入站和出站首次差异;fs_media |
| F07 · PCM 毛刺 | 实验分支重建 resampler / 重复样本,分开测试 | RTP 可能正常;gateway_playout |
| F08 · 终端 freeze | 可控终端 playout 暂停 200/500 ms | 独立端侧记录;外部区间 post_fs_path |
| C01 · 健康 | 同等时长、语料、并发,无注入 | 无媒体质量告警 |
| C02 · 合法停顿 | 自然静音,speech_expected=false | 停顿不应被当作 TTS 卡顿 |
| C03 · 用户打断 | 取消当前 generation、停止旧音频 | 取消后的空窗不应报 underflow |
| C04 · DTX/CNG | 协商正确的静音抑制 / 舒适噪声 | 合法 RTP 间隔不应机械判丢包 |
| C05 · 采集丢包 | 只降低观测支路容量,媒体链不动 | 告采集退化,不误报业务丢包 |
| C06 · 无 RTCP | 测试对端关闭 RTCP,媒体健康 | 报告 unavailable,不假填零丢包 |
| C07 · 录音损伤 | 只有一份监控录音重采样出错 | 另一份端侧记录正常;不能判用户卡顿 |
| C08 · 换腿/盲区 | 转接、re-INVITE、SRTP、direct media 分变体测试 | 保留可见性缺口,避免串线和误定 |
注入成功不等于可听故障成立:缓冲可能吸收 300 ms 的上游停供。A 的检测特征与 gold 必须独立标注;gold 录音始终保留。B2BUA 两侧 SSRC/seq 可能重建,应先按各流时钟对齐,不能直接相减序号。
SIPp 使用已经在测试 trunk 验证过的 INVITE/200/ACK/BYE 场景,媒体 action 调用 play_pcap_audio。播放异步执行,应保留足够 pause,并核验实际协商 codec 和终端录音;echo/发包成功不能证明听感。以下 namespace 与接口需预先建好,只承载单向测试 RTP。
<nop><action> <exec play_pcap_audio="fixtures/g711a.pcap"/> </action></nop> <!-- pause 需覆盖这份媒体的实际时长 --> <pause milliseconds="12000"/>
# 只读确认独立 namespace、测试接口与队列;不覆盖已有根队列 ip netns list ip -n vq-ablation link show rtp-out ip netns exec vq-ablation tc qdisc show dev rtp-out # F04 建议起点,tc 版本需支持 seed ip netns exec vq-ablation tc qdisc add dev rtp-out root handle 7a10: \ netem delay 60ms 20ms distribution normal seed 20260905 ip netns exec vq-ablation tc -s qdisc show dev rtp-out # 完成本条测试后撤销本次队列并验证恢复 ip netns exec vq-ablation tc qdisc del dev rtp-out root handle 7a10: ip netns exec vq-ablation tc qdisc show dev rtp-out
F03 可在独立测试接口短时使用 netem loss 100%;80 ms 不保证精确丢 4 包,必须记录实际启停时间和两侧 PCAP。F01/F02/F05/F07 的测试钩子需要接入 Gateway/重放器,当前文档未提供现成注入 CLI。
| 指标 | 计算口径 | 限制 |
|---|---|---|
| 发现召回 | onset 到 deadline 内有媒体告警 / 全部可听故障通话 | 建议 deadline=onset+5 s;注入类别不直接充当 gold |
| 定位召回 L | 第一条有效告警区间正确 / 全部故障通话 | 错误、未定位、漏检均不是成功;后续纠正另报 |
| 误报与可用性 | 健康通话有告警 / 全部健康通话 | 另报 collector_error、健康告警/失败并集,防止停采换低误报 |
| 发现时延 | 命中子集 p95 + 漏检取 5 s 的 capped mean/p95 | 提前/逾期告警单列;capped 不是无限检测时间的估计 |
| 配对增量 | FULL − 对照的 L;2,000 次 paired block percentile bootstrap | 95% CI 探索性、未多重比较校正;样本不足时继续采集 |
| 运行开销 | core-seconds/call、RSS、bytes/call、disk/day、queue/drop、媒体帧延迟 | 真实进程启停测量,计入外置 sensor 与数据库 |
统一通话观察时长,按 call 配对、按线路/时段/语料依赖 block 重采样。所有条件的预测冻结后才读取 gold。post_fs_path 可以是正确区间,不能因此断言线路商 transcoder 根因。
确认性决策预注册 1–2 个主比较;全部十项显著性判断需另做多重比较校正。480 通不代表功效充分。零误报的独立样本近似 95% 上界约 3/N,要支持低于 1%,至少约 300 通独立健康样本且零误报,相关样本需要更多。
工作区 voice-quality-ablation/score.py 使用 Python 3.9+ 标准库。已实现完整配对矩阵检查、漏检与失败计入分母、首次误定位、分场景统计和 block CI;采集、注入、特征屏蔽与检测适配器仍需在实验环境接入。
cd voice-quality-ablation PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -v python3 score.py --gold /lab/gold/test.csv \ --predictions /lab/predictions/test.jsonl \ --data-kind lab --seed 20260905 --resamples 2000 \ --output /lab/results/ablation-001.json
gold CSV 列:case_id, block_id, scenario, affected, onset_ms, deadline_ms, obs_end_ms, gold_hop。预测每通每组一行,仅含 case_id/group/status/alerts;alerts 是 {at_ms,hop} 数组。未定位填 unlocalized;失败写 timeout/collector_error、空数组,不能删行。输出文件排他创建并记录输入 SHA-256。
仅给接口/统计自测的 fixture 不填入实验结果表。该评分器没有算物理开销、probe 覆盖或事件级 precision;详细契约在同目录 README 与 Markdown 母本第十四章。
| 组 | 召回 / L / 误报 | ΔL 与 CI | capped TTD / 错误率 | 运行成本 |
|---|---|---|---|---|
| FULL | 待实测 | 参考组 | 待实测 | 待在线实测 |
| DROP_T / F / R | 各组待实测 | 各组待实测 | 各组待实测 | 另做物理启停 |
| DROP_N / A / C | 各组待实测 | 各组待实测 | 各组待实测 | 另做物理启停 |
| P_BASE / H_SIP / H / V | 各组待实测 | 按预注册对照 | 各组待实测 | 同条件实测 |
O0 媒体+独立金标;O1 加 T/F/A/C;O2 加 HOMER SIP;O3 再加 HEPipe;O4 为 O1+VoIPmonitor;O5 全开。10%/50%/100% 测试负载,预热 5 min、测 15 min,每档至少三个 block、随机组顺序。先 drain 再切组,外置采集器成本也计入。
PASSIVE、+5 min、+15 min。分别测试 0.2–3 s 短故障与 15 min 持续故障,随机发生时刻。从 incident_start 算至首个覆盖受影响路由的有效 probe 和告警;未覆盖保留漏发现/删失,另报额外电话数。
示例主门槛:定位增益至少 5 个百分点且 CI 支持收益,或覆盖关键盲区。减配需预注册 2 个百分点非劣界并排除更大劣化;“不显著”不是可删除的证明。误报、可用性与真实开销同时达标。
己方 FS 出口正常、终端异常时保留 post_fs_path。用固定语料、PCMA/PCMU、预编码、本地闭环和不同终端重复验证;没有线路商双侧证据,不填写具体内部转码金标。
09 · Delivery path
画清 B2BUA/转码/SBC/录音点;收集 10 条正常 + 5 条卡顿的 UUID、Call-ID、日志、PCAP 和录音。
统一 conversation/X-cid;补 TTS 块与 buffer;接 ESL/CDR;建立逐通话时间线和四条差分规则。
单链路 POC HOMER 或 VoIPmonitor;验证 SRTP/direct media 可见性、抓包丢包和存储成本。
SIPp 关键地区定时呼入;异常通话旁路 PCM;事故回灌回归样本与发布门禁。
| 问题 | 为什么影响方案 | 证据 |
|---|---|---|
| FreeSWITCH 版本与节点拓扑 | 决定 HEP/ESL 字段、B2BUA 关联与采集点 | 版本输出、dialplan、SIP ladder |
| codec / ptime / 转码关系 | 决定包频率、timestamp、CPU 和正常 gap 基线 | SDP、实际 codec 变量、PCAP |
| SRTP / direct media | 决定被动 sniffer 能否看到明文媒体 | SIP/SDP、媒体五元组、SBC 配置 |
| MiniMax HTTP/WSS/Bidi | 决定 chunk schema、重连和埋点位置 | Gateway 代码与请求日志 |
| 录音点与通道映射 | 决定最终录音能证明哪一段、AI/用户轨是否可信 | 录音配置、人工抽听、已知语料 |
10 · Safety and operations
bounded queue、超限丢弃、熔断;监控 WebSocket 慢时先丢观测,不拖住 RTP。
正常通话保留聚合指标;异常窗口才保存短 PCAP/WAV,控制成本与隐私暴露。
手机号、转写和原始音频不进入 Prometheus label 或 trace baggage。
对象级最小权限、访问审计、自动过期;密钥和 ESL 密码不出现在前端。
packet drop、queue drop、clock skew、CPU/RSS 和 event-loop lag 都要显式上报。
NISQA/DNSMOS 不能覆盖确定性 chunk、RTP sequence、buffer underflow 与最终录音。
11 · Sources
组件资料截点 2026-09-02;消融实验方法资料核验于 2026-09-05。runbook 配置链接到固定 release/tag/commit;仓库自述与社区线索不自动等于独立复现。Markdown 母本另保留转码毛刺与抓包专项来源。
audio、trace_id、session_id、is_final、extra_info 与官方示例。
WebSocket 流式接入说明。
TCP 接口、实时事件订阅、inbound/outbound 模式。
每流 RTP 收发计数、skip/jitter 指标、RTCP 配置与 jitter buffer。
每个 call leg 在挂断后生成一条 CDR。
HEP、可选 VQRTCP/SIPREC;当前仓库许可证为 AGPL-3.0。
FreeSWITCH 原生 HEP 与桥接前设置 X-cid 的 B2BUA 关联方法。
ESL、RTCP/QoS 事件与 HEP 转换配置。
SIP/RTP/RTCP、RTCP-XR、MOS、jitter/loss、PCAP/录音;sniffer GPL-2.0、GUI 商业。
sequence、delta、jitter、skew、丢包和波形错误标记。
从 FreeSWITCH/ESL 暴露 Prometheus 指标;Apache-2.0。
SIP 流量生成、场景、PCAP 媒体播放;GPLv3。
media bug、L16、mono/mixed/stereo、默认 20 ms 分块;版本/商业 edition 现场核验。
overall、noisiness、coloration、discontinuity、loudness;代码 MIT,权重 CC BY-NC-SA。
DNSMOS 与降噪质量资料;代码 MIT。
流式 frame 与 TTFB/usage 机制的埋点改造参考。
sequence、timestamp、SSRC 与 RTCP 基本统计。
扩展质量报告。
XML CDR jitter 字段与准确性不确定的社区提醒。
跨服务 trace 传播基础;不应把完整 PII 放入 baggage。
2026-08-28 正式版;AMD64/ARM64 deb、rpm、二进制资产及 SHA-256。
all-in-one HEP ingest、DuckLake、API/UI 架构与 CLI。
9060/8080/9090、aleg_ids、Token、存储与保留期字段。
官方 quick start、约 8 GB RAM、首次随机管理员密码与端口。
latest 镜像、RustFS、示例 Token、环境变量和暴露端口的原文。
JWT、bootstrap admin、node query Token 与回环绑定。
aleg_ids、custom_headers、force_aleg_id 与多 leg 关联语义。
固定源码中的 capture-server(L4543)与 sip-capture(L4750)解析路径。
2026-02-09 HEPv3 兼容修复后的完整快照。
HEP/ESL 地址、密码、HEP_ID 和上报 flags。
host network、只读配置挂载与启动命令。
订阅 ALL、RTCP event 过滤、重连与 HEP 构造实现。
HEPipe.js 的许可证原文。
提交标题 release 2026.07.1;不是 GitHub Release 或 tag。
sniffer 能力、静态/源码 quick start 与商业 GUI 边界。
依赖、configure/make/install 与 init 安装步骤。
interface、sensor、DB、manager、SIP/RTP/RTCP、spool、audio 与 graph 字段。
--config-file、PID file 与启停逻辑的实际来源。
unit 通过 /etc/init.d/voipmonitor 间接启动。
开源 sniffer 的许可证原文。
官方 sniffer 配置与运维入口。
官方 Debian 12 安装说明。
官方 Ubuntu 24.04 LTS 安装说明。
官方常见问题;仓库 README 的 /doc/Configuration 本次检查返回 404,未采用。
2026-09-05 核验:delay/loss/seed、qdisc 与内核定时限制。
2026-09-05 核验:play_pcap_audio 异步播放与 pause 的准确语义。
2026-09-05 核验:用区组控制线路、语料、负载与时段干扰,区组内随机化。
2026-09-05 核验:配对重采样与置信区间;本地评分器为标准库 percentile block 实现,不调用 SciPy/BCa。