新增 Mimi 与仅用户 VAP 对比并统一流式评测

This commit is contained in:
Xin Wang
2026-10-28 22:44:36 +08:00
parent 19d4e3c767
commit 6785e3a07b
55 changed files with 6160 additions and 31 deletions
@@ -0,0 +1,87 @@
# MaAI Mimi ch_kyoto:标准版与降噪版双声道评测
## 当前主评测口径:流式场景(2026-10-28)
本场景以 VAP 连续流式推理为主:从录音开始持续维护编码器和 VAP 状态,在每个当前标注 `decision_ms`,取可用时间不晚于它的最后一个分数。判断点不重置模型、不插值、不使用未来音频。分数为 `1 - p_now[user]`,预测规则为严格 `> 0.5`;这是活动预测到可接话的映射,不是原生校准 EOT 概率。
前端圆点、悬停分数和准确率统一使用这份连续输出。时间戳包括流式重采样缓冲;没有输出或分数年龄超过两倍标称更新间隔时记为不可用,单独计数,不填 0。保存新增或移动的标注后,用已有真实连续记录重新取点,无需重跑模型:
```bash
cd experiments/maai-ch-kyoto
uv run --locked python evaluate_streaming.py all
```
| 配置 | 当前主结果目录 | 正确数 / 有效点 | 准确率 | FP / FN |
| --- | --- | --- | --- | --- |
| CPC 降噪双声道 | `results/streaming/cpc-stereo/` | 30 / 44 | 68.18% | 7 / 7 |
| CPC 降噪机器人静音 | `results/streaming/cpc-user-only/` | 24 / 44 | 54.55% | 18 / 2 |
| Mimi 标准双声道 | `results/streaming/mimi-standard/` | 31 / 44 | 70.45% | 5 / 8 |
| Mimi 降噪双声道 | `results/streaming/mimi-mc/` | 34 / 44 | 77.27% | 5 / 5 |
本次 44 点均有可用输出,来自同六通录音、22 个可接话与 22 个不可接话标签。每个目录包含 `predictions.csv`、`summary.json` 和前端 `score-timeline.json`;CSV 记录判断时间、实际评分时间及分数年龄,JSON 保留源记录、标签和评估代码的哈希。总表为 `results/streaming/comparison-summary.json`,文字说明为 `results/streaming/对比分析.txt`。
本次复用已有真实连续推理记录,没有新做模型推理或计算延迟实验。它仍是选定判断点上的分类评估,不等同于 LiveKit 的静音区间误抢话与结束延迟策略评估,也不代表完整在线系统的响应延迟。原始独立窗口结果保留作为历史诊断,不能与本表混用。重新运行原推理入口的 `all` 模式(CPC 双声道为 `export_timeline.py`)后会自动刷新对应流式目录;四配置对比统一用上述命令更新。
## 历史独立窗口及原始连续推理记录
以下记录说明原始实验、权重和独立窗口诊断。所述独立点评分及旧指标不是当前流式场景的主结果;前端已切换为上方流式目录。
两版均输入原录音的**用户左声道(索引 0)和机器人右声道(索引 1)**。保留两路音频及静音,不混音、不置零、不改变时间轴。当前人工标签从 `labels/EOT标注/工作数据` 读取,结果另存。
## 模型与环境
复用本目录现有 uv `.venv` 和 `uv.lock`,不与 Smart Turn 环境混装。本次不修改依赖:Python 3.11.15、MaAI 0.2.22、PyTorch 2.14.1、transformers 5.5.3、ONNX Runtime 1.31.0。执行机器为本机 Apple M4 Mac mini、16 GB 内存;CPU 推理,PyTorch 和 ONNX 各 4 个 intra-op 线程、1 个 inter-op 线程。
| 项目 | 标准版 | 降噪版 |
| --- | --- | --- |
| 模型参数 | `model_type="normal-ver2", mc=False` | `model_type="normal-ver2", mc=True` |
| VAP 权重 | `vap_mimi_state_dict_ch_kyoto_12.5hz_20000msec.pt` | `vap_mc_mimi_state_dict_ch_kyoto_12.5hz_20000msec.pt` |
| VAP SHA256 | `2820d2b172a6ddd4696d33edb43933f436a09a3e0d3eb41c7dc390c33b22d5ce` | `61c9e186d765cb6c338cb7fdacb68baf4b2533e72cde7c803e52480a62919219` |
| 频率、上下文 | 12.5 Hz(80 ms)、20 秒 | 相同 |
| 编码器 | 官方 FP32 ONNX Mimi | 与标准版共用同一文件 |
VAP 来自官方 [vap_ch_kyoto](https://huggingface.co/maai-kyoto/vap_ch_kyoto/tree/main),固定修订 `c135cdcfa12ff5aa1cce2fdd23df110941a78f38`。编码器来自官方 [continuous-mimi-onnx](https://huggingface.co/maai-kyoto/continuous-mimi-onnx/tree/main),固定修订 `303ef4ec0c70e4c71b67ea166acd26dd0d96655c`,文件为 `continuous_mimi_fp32.onnx` 和配套 JSON;ONNX SHA256 为 `c86171a48e1bd46aa31a52e7fe00f74acc310e0d15d11881516cdd1df1639b54`。
所有文件保存在本目录 `models/mimi/`,固定下载 URL、修订、大小和校验值保存在 `mimi-model-manifest.json`。脚本逐次验证清单,不自动切换或下载其他权重。环境声明为 `mimi-env-spec.json`,实际环境和输入哈希随结果保存。
## 复跑
从项目根目录执行:
```bash
cd experiments/maai-ch-kyoto
UV_CACHE_DIR=/private/tmp/xiaobailing-uv-cache uv run --locked --offline python run_mimi.py smoke --variant both
UV_CACHE_DIR=/private/tmp/xiaobailing-uv-cache uv run --locked --offline python run_mimi.py all --variant both
UV_CACHE_DIR=/private/tmp/xiaobailing-uv-cache uv run --locked --offline python compare_mimi.py
```
`smoke` 在真实双声道历史上检查权重加载、固定种子重复推理和未来音频不变性。`all` 依次计算两版的判断点和连续曲线;`evaluate` 只计算判断点。`--variant standard` 或 `--variant mc` 可以单独运行一版。已有依赖及本地权重可离线复用。
## 判断点与连续评分
- 每个判断点独立重置 Mimi 流式状态及 VAP KV cache,使用此前最多 20 秒音频,按 80 ms 帧对齐,最后一帧结束于精确 `decision_ms`。不足整帧的余量从历史开头丢弃。先裁剪收到的双声道音频,再重采样到 16 kHz;不读取未来音频,不使用人工转写。
- 保留 MaAI 官方启动逻辑:首次 ONNX Mimi 编码输出跳过,后续实际收到评分才使用。当前实现首次有效输出在输入 160 ms 后;不把启动期缺失评分补成 0。
- 主分数与既有 VAP 前端一致,为 `1 - p_now[user]`,主阈值为严格大于 0.5。它是说话活动预测映射,不是官方校准的 EOT 概率;不加入外部结束信号、VAD 等待或超时接话。
- 连续曲线在完整录音上持续维护状态,使用流式重采样,时间戳表示输入实际可用时间,包含重采样缓冲。末尾不足一帧不补虚构音频;空心点保留独立历史窗口结果,可能不落在连续曲线上。
- 模型原生步长是 80 ms,流式重采样可能使更新延后或多帧在同一个输入可用时刻产生,因此页面曲线并非严格每 80 ms 一个点。本批连续评分最早在 240 ms 可用,更新间隔为 80/160 ms;独立窗口不经过流式重采样缓冲,首次模型输出为 160 ms。两种时间均明确记录,不把预测提前显示。
- 本次比较引用 `results/user-only/predictions.csv` 中已在**相同当前判断点**重跑的 CPC 降噪双声道对照,同时保留 CPC 机器人静音版。复用前严格校验标签、转写、依赖锁和六通原录音的哈希。当前点位变化后,应先重跑 `run_user_only.py all`,不能直接复用旧位置的分数。
## 加载审计与比较边界
官方本地文件加载路径使用通用 `vap` 架构标识,即使文件是降噪权重,也不会把对象上的 `variant` 自动改为 `vap_mc`。实验因此以指定权重文件及 SHA256 标识标准/降噪版本,并核对全部实际使用的 VAP 参数与对应 checkpoint 完全一致,避免把相同架构误认为相同权重。
Mimi 的两个被冻结的帧率转换卷积在原生 12.5 Hz 路径不参与计算;原始 checkpoint 不包含这些卷积。加载审计单独列出这四个未使用的 weight/bias,核验输入输出帧率均为 12.5 Hz;其余参数必须来自 checkpoint。Mimi 编码器本体使用已校验的独立 ONNX 权重。加载器输出中与初始常量相同的参数提示不代表参数缺失,以逐参数相等性检查为准。
Mimi 标准与降噪版本使用相同编码器、80 ms 帧、输入和评分规则;两者可作为不同 VAP 权重的直接对照。现有 CPC 为降噪版、100 ms 帧,比较时明确这些配置差异,不把所有变化归因于编码器。这里只评价选定判断点,不代表独立测试集或完整话轮策略指标。记录的历史重放耗时也不等于单次在线更新延迟。
## 结果与前端
| 目录 | 内容 |
| --- | --- |
| `results/mimi-standard/` | Mimi 标准版的 `predictions.csv`、`errors.csv`(如有)、`thresholds.csv`、`summary.json`、`score-timeline.json`。 |
| `results/mimi-mc/` | Mimi 降噪版的同类结果。 |
| `results/mimi-comparison/` | 由 `compare_mimi.py` 汇总的四配置逐点对照、指标 JSON 和中文对比分析。 |
逐点 CSV 保留人工真值、原生 `p_now/p_future/vad`、接话候选分数、CPC 同点参考分数及输入窗口。汇总包含分类指标、每通话指标、重复/因果输入验证、完整来源哈希和配置差异说明。
工作台展开“模型分数对比”→“选择模型”,可分别勾选 **VAP / MaAI Mimi(标准双声道)**(蓝灰色)和 **VAP / MaAI Mimi(降噪双声道)**(金棕色)。它们支持独立开关、0.11 / 0.5 / 0.8 参考线、悬停分数和判断点定位,与现有 CPC、Smart Turn 等共用录音时间轴。原始录音、标签和其他模型结果保持原样。