# 评测方法 v0.2

状态：长音频三轨协议已于 2026-07-21 冻结。后续参数或评分规则变更必须使用新的
protocol/adapter/scorer version，不覆盖历史产物，也不因评分规则升级重跑已保存的 raw。

第一次阅读建议先看 [如何阅读评测结果](READING_RESULTS.md)。本页是指标与发布门槛的权威定义；
`gold` 指独立人工参考答案，`raw` 指模型或服务未经本项目清洗的原始响应。

## 目标与轨道

评测回答四个不同问题，禁止混成一个总分：

1. **转录（ASR core）**：说了什么。英文 WER；中文、日文、方言 CER；中英混杂 MER；另报术语、数字、幻觉和标点。
2. **匿名发言人归属（diarization）**：谁在何时说。DER、JER、speaker count error、overlap-only DER，并补 cpWER/cpCER/WDER。
3. **时间戳（timestamp）**：什么时候说。字符/词/segment 的开始和结束边界误差、容差命中率、turn boundary F1。
4. **工程完整性（engineering）**：是否能投入使用。第一阶段只记录离线 RTF、峰值内存/显存、失败率和长音频恢复，不参与能力排名；实时/流式首包延迟、partial 稳定性和并发吞吐另立 suite。

任何结论都应先在场景内汇总，再跨场景给宏平均与时长加权平均；不得让一个长播客淹没方言、会议或噪声场景。

## 场景矩阵

核心场景包括普通话、英文、日文、方言、商务会议、噪声、中英混杂、专业术语、播客、长音频、重叠语音、静音/音乐。每个场景至少 3 个独立样本后才可形成趋势判断；少于 3 个只标为 exploratory。

交付分两层：第一阶段使用 `podcast-meeting-v1`，只以长播客、真实商务会议和会议重叠为 P0 阻塞项；噪声、方言、日文、静音/音乐等保留在完整 `core-v1`，但不阻塞第一阶段产品判断。第一阶段的结论必须明确限定为“播客/会议场景”，不能外推到被延后的场景。

推荐每个系统每个样本做 3 次确定性或固定随机种子的重复运行。记录均值、标准差和失败；模型版本、推理后端、精度、参数、设备与依赖必须冻结。

### 结果成熟度门槛

- `pipeline_smoke`：允许单条样本，只证明下载、推理、标准化、落盘和计分链路可用；禁止排名。
- `exploratory`：场景内少于 3 条独立样本，只展示逐样本事实，不形成趋势判断。
- `scenario_qualified`：场景内至少 3 条、至少 2 个独立来源或说话人，并且没有 reference 泄漏，才允许场景内比较。
- `decision_grade`：核心场景全部 qualified、每系统完成规定重复次数、失败也计入，并报告置信区间与数据覆盖，才允许跨场景结论。

单条 10 秒干净朗读即使 CER=0，也只属于 `pipeline_smoke`。它不能代表长会议、重叠语音、噪声、方言、术语、代码切换或幻觉控制。

## 长音频三轨协议（冻结）

小时级录音是系统级测试输入，用来回答“整个文件能否被完整、稳定地处理”；8–12
分钟人工 gold 是 accuracy unit，用来低成本、可重现地定位 CER/cpCER/DER/时间戳错误。
两者同时保留，不以十分钟切片代替小时级完整性，也不在无整期 gold 时把整期输出当作准确率结论。

所有系统必须分轨报告，禁止将下列结果混成一个长音频总分：

1. `native_whole_context`：在模型官方声明的单次输入/上下文范围内，将完整录音交给一次
   全局解码，不执行外部独立 ASR 分块和文本拼接。模型内部声学前端的固定帧/窗特征提取
   不等于外部将多段独立 ASR 结果拼接；只要它们仍进入同一次全局解码，仍属本轨。
2. `production_complete_file`：向产品入口提交同一个完整文件，允许使用冻结的官方长音频 wrapper。
   官方 wrapper 内部切分和拼接时，切点、最长子窗、overlap、上下文传递、时间偏移和
   stitching/reconciliation 版本均进入 adapter identity。对超出原生上限且没有官方整文件
   wrapper 的系统，可使用本项目冻结的静音感知分块作为 `production_complete_file/chunked`
   子轨，但必须同时报告段内表现、跨切点惩罚与 speaker-label 重协调，不得声称为原生整期。
3. `gold_diagnostic_window`：所有系统使用同一物理裁剪、同一起止时间的人工标注 8–12 分钟窗口，
   计算 CER/WER、cpCER/cpWER、DER/JER 和时间戳边界。该轨只支持准确率诊断，不支持整期
   尾部覆盖、长程 speaker identity 稳定性或整期吞吐结论。

决定性容器转换（例如 M4A 解码为 16 kHz mono PCM WAV）是允许的输入 adapter，不是改变
评测问题。必须保留源文件与派生文件 SHA-256、FFmpeg/解码参数和 adapter version，
所有系统对同一样本使用同一冻结 PCM 内容；若 provider 强制其他容器，只允许不改变样本率、
声道和 PCM 样本的确定性重封装，并将其记入输入身份。

Qwen 官方长音频 wrapper 的低能量切分/合并、Qwen forced aligner 的子窗对齐，以及
Whisper `transcribe()` 的 30 秒滑窗和前文条件，都是系统行为和 adapter identity 的一部分。
后端、切分参数或 stitching 改变就构成新的可比系统身份，但在原始分块 raw 完整保存时，
只改后处理规则应从 raw 派生新版本，不重跑模型。

## 归一化与指标

- Unicode NFKC，大小写折叠（有大小写语义的专名另报实体指标）。
- 核心错误率移除 Unicode 标点与空白差异，不做样本特化替换。
- WER token 是英文/拉丁词；CER token 是 CJK 字符与剩余非空字符；MER 将连续拉丁数字串作为词、每个 CJK 字符作为 token。
- 输出 substitution、deletion、insertion、reference token 数，而非只给一个比率。
- 标点 F1 使用标点序列的编辑对齐近似；数字和术语独立计 precision/recall/F1，术语表只来自每条样本的 reference metadata。
- 静音、音乐和低语音占比样本单独计算非空输出率与 hallucinated characters/second。
- 每个场景同时报告 sample-macro（每条样本等权）与 corpus/micro（先汇总 S/D/I 和 reference tokens 再相除）。跨场景只使用场景宏平均；长音频的时长加权值单列，不能替代场景宏平均。

## Diarization 协议

主协议默认 collar=0.25s，重叠语音计入；同时报告忽略重叠版本。为与 LattifAI 复核，可额外跑 collar=0.20s 的 parity track，但不得与主协议混表。说话人标签先做最优置换，再算 cpWER/cpCER；联合 ASR+diarization 与外接统一 diarization 必须分轨。

MOSS parity track 另报 corpus CER、cpCER 与 `Δcp = cpCER - CER`。按 speaker 拼接文本后使用 Hungarian assignment 寻找最小字符错误；先清理时间戳、speaker/event/情绪标签，再移除 Unicode 标点与空白并做大小写折叠。`Δcp` 是 speaker-conditioned permutation 与扁平 transcript 两种口径的差值，可正可负；尤其在重叠语音中，扁平化后的时序惩罚可能使 cpCER 低于 CER，不能把 `Δcp` 解释为单向的“说话人归属额外错误”。该 parity track 不取代主协议 DER/JER，因为 transcript-based speaker attribution 与时间轴错误回答的是不同问题。

这里的“发言人识别”默认指匿名 speaker attribution/diarization，即稳定地区分 `[S01]`、`[S02]`，不要求输出真实姓名。Named/enrolled speaker identification 需要独立声纹注册集，第一阶段不测。系统不支持 speaker attribution 时标为 `unsupported`，不得当作错误率 0，也不得用外接 diarization 的结果伪装成原生能力；如另跑统一外接 diarization，必须单独成轨。

## 时间戳协议

- 同一音频版本、同一采样率和统一零点；reference 至少提供 word/character/segment 之一的人工时间边界，并记录标注粒度。
- 文本先按确定性编辑路径对齐，再对匹配 token 报 start/end absolute error 的 mean、median、P90/P95；同时报 0.25s、0.5s、1.0s 容差命中率。
- 对 speaker turn 报 boundary precision/recall/F1；对 segment 报 time IoU 与 speech coverage，避免模型只输出很宽区间获得表面命中。
- 主口径先使用与 CER/WER 一致的 tokenization 做 Levenshtein 对齐，只保留 equal blocks；当系统提供
  character/word timestamps 时，以匹配 token 为锚点重建每个 reference turn 的预测首尾，再汇总
  start/end absolute error、time IoU 和容差命中率。每个计分 turn 至少覆盖 50% reference token，且
  首尾 20% 区域均需存在匹配锚点；单流转录无法确定重叠语音中的唯一 token 顺序，因此重叠 turn
  从此边界主指标排除并单独报告数量。必须同时报告 reference token match coverage 和可计分 turn
  coverage，防止只对少量容易匹配文本得到漂亮数字。
- 若系统只有 segment timestamps，没有 token timestamps，可以保留“唯一
  `(reference segment, hypothesis segment)` 配对”的 parity 结果作诊断；因分段粒度不同会混入
  segmentation policy 误差，不得与 token-reconstructed 主口径混表或直接排名。
- 原生时间戳与外接/forced aligner 分轨。Qwen 的 ForcedAligner 输出标为 `supported_via_forced_aligner`，不能与 MOSS 原生联合时间戳混成同一能力声明。Qwen3-ForcedAligner-0.6B 官方输入范围为最长 5 分钟；更长音频必须确定性地拆成不超过 5 分钟的对齐子窗，再把时间戳映射回统一零点。子窗长度、overlap、切点与 stitching 版本必须进入 request/adapter/cache identity；若无法证明该流程，长于 5 分钟的时间戳只标 `out_of_official_input_range` 或 diagnostic，不进入正式边界排名。
- 无时间戳输出的系统标 `unsupported`。第一阶段不测流式 partial timestamp 稳定性。

## Agent 仲裁边界

Agent 不参与确定性指标计算，只在有独立 reference 的样本上盲评候选文本：语义忠实、完整性、实体、数字、幻觉控制。系统名随机映射为 A/B/C/D，映射文件与 judge prompt 分开保存。

每个 Agent 返回固定 JSON。至少 3 个有效 judge 才形成共识；第一名投票不足 75%、平均 confidence 小于 0.65、或者出现 2:2 时进入人工复核。保存命令版本、prompt 哈希、模型标识、原始 stdout/stderr、解析结果和聚合结果。Agent 结论不得回写或覆盖客观指标。

## 长音频工程诊断

没有独立 gold 的完整播客只允许报告 reference-free 工程事实：provider job 是否 completed、输出是否
非空、音频时长、推理时长、RTF、字符密度、时间轴结构完整性，以及固定 12/24/48/96 normalized
token 的精确相邻重复块。字符密度和“未发现精确重复块”都不是准确率或完整性证明。

整期工程结果必须通过独立的 `engineering_completeness` gate。`process_succeeded`、HTTP 2xx 或
provider job `completed` 只表示调用流程结束，不得代替 `engineering_complete`。门禁至少保存并判定：

- 最后一个有效时间戳、它占音频时长的覆盖率和 trailing-unsegmented seconds。通过要求覆盖到每样本冻结的
  “最后有语音边界”（来自人工尾部审听或独立 VAD 后人审）及其预注册容差；没有 timestamps/
  segments 时本项标为 `unsupported`，整期完整性最多是 `indeterminate`。
- 实际 generated-token 数、effective generation config、EOS 状态、stop reason 和触发的 stopping
  criterion。“触发 EOS”本身不证明完整；只有在尾部覆盖同时通过时才能解释为正常结束。
- raw 末尾是否构成完整的可解析 segment，是否出现半个时间戳、speaker tag 或被截断文本；同时保存
  未清理 raw 尾部和 parser 错误。
- 固定窗长的相邻重复、非法/回退时间戳、分段爆炸，以及按录音前/中/后时长桶统计的 speaker 数、
  新标签出现、标签重置和长程 re-entry/identity drift。无 speaker gold 时只能作结构异常门禁，
  不能宣称 diarization 正确。

门禁将上述证据分别落到 `transcript_coverage_status`、`generation_termination_status`、
`raw_tail_status`、`repeat_timeline_status` 和 `speaker_continuity_status`。对不支持 speaker 的系统，
最后一项是 `unsupported` 而不是失败；对声称支持 speaker 却没有整期 speaker gold 的系统，
其 identity-drift accuracy 保持 `unscored`。这不阻止转录完整性结论，但禁止将其扩展为
“整期 speaker 也稳定”。

门禁输出至少是 `engineering_complete`、`failed_truncated`、`failed_repetition_or_timeline`
或 `indeterminate_missing_coverage_evidence`。任一尾部覆盖失败、raw 末尾截断或严重重复/时间轴错误都禁止标为
`engineering_complete`。若请求关闭 timestamps 或 segments 为空，不能从结尾文本“像结束语”推断整期
无漏段。已有模型稿只能帮助挑选人工复核位置，不能充当 gold。

MOSS 张翼 47:41 整期 canary 是该门禁必要性的已保存证据：runner 返回 `succeeded`，
但 raw 在半个 segment 处结束，最后时间戳只到 1284.75 秒，覆盖音频的 44.90%，因此已冻结判定为
`failed_truncated`，而不是整期成功。该例只引用已有不可变 raw 和派生分析，不改写历史 run；
详见 `docs/MOSS_PODCAST_ENGINEERING_ANALYSIS.md`。

## 对 lattifai/benchmark 的借鉴与取舍

访问日期：2026-07-21。来源：

- https://github.com/lattifai/benchmark
- https://raw.githubusercontent.com/lattifai/benchmark/main/eval.py
- https://raw.githubusercontent.com/lattifai/benchmark/main/speaker_count.py

采纳项（高置信度）：

- 使用 pyannote DER/JER，并明确 collar；补 speaker count accuracy/error。
- 单列 overlapping speech 的错误，帮助判断会议场景短板。
- 保留模型原始响应与标准化结果，避免只留最终分数。
- 重复运行、温度对照、URL 与本地音频入口一致性检查可作为稳定性诊断。
- 时间轴/错误可视化和 TextGrid 类导出适合报告中的人工复核。

不直接复制（高置信度）：

- 原仓库只有两个 YouTube 样本，不足以支撑多场景产品决策。
- `chatgpt` 切词、speaker alias 等样本特化启发式违反本项目的防作弊规则。
- 只以 WER 覆盖多语言会歪曲中文、日文和中英混杂表现。
- LattifAI 后处理会改变时间戳/DER 而通常不改变 WER，其结果更接近 alignment layer 评测，不能代替端到端 ASR 对比。
- 缺少统一的模型 revision、环境锁、置信区间、客观/主观边界和多 Agent 匿名仲裁。

## 对 MOSS 官方评测的借鉴与取舍

访问日期：2026-07-21。来源：

- https://github.com/OpenMOSS/MOSS-Transcribe-Diarize
- https://arxiv.org/abs/2601.01554v7
- https://github.com/sgl-project/sglang-omni/blob/24d7fb573576359687bcbebbd25e998ec68d436d/benchmarks/metrics/transcribe_diarize_metrics.py

采纳项：

- 不把单人短句当作联合转写/分离能力的代理；覆盖 AISHELL-4/AliMeeting 类长会议、长播客，以及短而多人重叠的片段。
- 同时报 CER、cpCER 和 Δcp，对照扁平 transcript 与 speaker-conditioned permutation 两种口径；明确 Δcp 可正可负，不把它解释为单向的归属错误增量。
- corpus/micro CER 作为与官方 serving benchmark 对照的 parity 数字，同时保留本项目 sample-macro 与场景宏平均。
- 对所有系统应用同一套 tag、标点和空白清理，不让某一家的结构化标签被误算成转写错误。

限制与拒绝项：

- OpenMOSS 主仓库未提供论文结果表对应的 eval 脚本；论文也未完整披露字符 tokenization、大小写/标点细节及聚合口径，因此不能声称逐值复现官方表格。
- Podcast/Movies 在论文中被描述为将公开的数据集，但截至访问日官方组织尚未发布；不能用未知测试集结果校准本项目排名。
- SGLang-Omni 的公开 scorer 实现了 corpus CER/cpCER，并包含基于预测时间戳的 DER（collar=0）；其 private benchmark 不能成为本项目 golden。当前 MOSS parity track 只借鉴 CER/cpCER 算法与清洗协议，DER/JER 仍按本项目统一主协议单独计算。
- 只报 cpCER/Δcp 不足以定位时间轴错误，本项目继续独立报告 DER、JER、overlap-only DER 与 speaker count。

## 数据来源与 reference 审计

- Hugging Face/ModelScope 只作为分发入口；每条样本必须固定上游 dataset revision、split、原始 recording ID、音频 SHA-256、reference 类型和许可，不以平台页面可见性代替再分发授权。
- FLEURS/AISHELL 等官方人工录音与 transcript 可作为公开 benchmark 候选；模型生成字幕不能作为同类 ASR 的 golden。
- echo-frame 的 `uploaded_cc` 只有在 source language、非 automatic captions、经过人工文本审计且裁剪后再次听审时，才可作为内部 reference；未明确再分发许可的音频不得进入公开样本包。
- LattifAI 的 YouTube 长音频与 ASS 可帮助设计重叠/时间轴诊断，但其仓库未说明 ground-truth QA 和数据许可，不能直接升级为 ready golden。
- 静音、纯音乐、受控噪声与合成重叠样本必须保存生成脚本、源素材许可、随机种子和混音参数；合成样本与真实样本分组报告。

## 报告措辞

报告必须区分“测到的事实”“基于事实的判断”“尚未验证的假设”。任何排名都需附场景覆盖、有效样本数、失败数和不确定性；样本不足时禁止写“显著领先”。

## Artifact lineage 与规则升级

正式评测采用 append-only lineage，细则见 `docs/ARTIFACT_LINEAGE.md`。原始模型响应只运行并保存
一次；归一化和评分以带版本的派生产物存在。每个结论必须能回溯到 input audio SHA、精确请求配置、
model revision、raw SHA、normalizer/scorer version、manifest/reference SHA 和父 artifact。

规则升级不得覆盖历史 normalized/metrics，也不得为了套用新规则而重复推理。历史 provider job
优先恢复；输入转码、terms/timestamps 等协议不同或模型身份只能间接推定时，必须记录
`exact_input_match`、`protocol_compatibility` 和 `identity_confidence`，不兼容结果只进诊断轨。
