项目:离线转录评估

项目目标

使用人工编写的合成转录夹具,离线验证格式/时间基准合同、已提交转录修订、匿名说话人字段、WER/CER 和切片差异。项目不含音频,也不推理模型,适合在任何 Python 3 环境复现指标口径。

资产:

运行

以下命令从同时包含 docs/ 与 .website/ 的项目根目录运行:

Push-Location -LiteralPath 'docs\语音识别\03-项目与自测\examples'
python -B .\evaluate_transcript.py .\asr_fixture.json
python -B .\evaluate_transcript.py --self-test
python -B -m unittest discover -s . -p 'test_*.py'
python -B -O -m unittest discover -s . -p 'test_*.py'
python -B -W error -m unittest discover -s . -p 'test_*.py'
Pop-Location

脚本以 NFKC、casefold() 和移除标点后的空白 token 计算教学用 WER,以去空白字符计算 CER。此规则写在报告中,换规则就必须改变评测版本;空参考的 WER/CER 会标为 undefined_no_reference_units,不会伪报为零。当前回归集共 69 项,普通、-O 和 warnings-as-errors 三种模式都应通过。

输入与退出码合同

输入必须是 UTF-8 严格 JSON;重复键、NaN/Infinity、未知字段和错误类型会被拒绝。顶层精确包含 schema_version: "1.1"、session_id、source_audio、transcript_revision、transcript_state、normalization 与 segments。source_audio 要声明稳定 asset_id、source_revision、相对 asset_start 的时间基准、原始/分析格式和 audio_available: false;这些都是合成元数据,脚本不会读取或验证真实媒体。transcript_state 固定为 committed,因为本项目不模拟流式 partial/revision 事件。每段精确包含 ID、起止时间、说话人、切片、参考文本和预测文本;speaker 可为 null,表示未提供匿名说话人标签。

  • 退出码 0:结构合同有效,且无重复 ID 或时间轴错误。
  • 退出码 1:结构合同有效,但存在重复 ID、负时间、无效区间或重叠。
  • 退出码 2:文件、UTF-8、JSON 或结构合同错误。

报告解释

  • micro_wer/micro_cer:汇总编辑数除参考长度。
  • rate_status:defined 或 undefined_no_reference_units;后者的错误应通过无参考片段指标单独解释。
  • by_slice:按夹具中的合成场景标签汇总;标签不代表真实人群。
  • timestamp_errors:结束不晚于开始、段落倒序或重叠等契约问题。
  • audit_errors:重复 segment_id 等跨段一致性问题。
  • speaker_coverage:有匿名说话人标签的片段比例,不评价身份是否正确。
  • source_audio / transcript_revision:把报告关联到合成的资产、格式合同和转录版本;它们不证明真实音频被检查过。

扩展任务

  1. 把第二段起始时间改到第一段内部,确认出现重叠错误。
  2. 为中文片段添加同义数字写法,比较不同 normalization 的影响。
  3. 添加设备/噪声切片;每个切片同时报告参考词数,避免小样本强结论。
  4. 新增空参考的无语音案例,观察 WER 为未定义,并设计独立误触发指标。
  5. 若要增加“允许重叠语音”,先扩展 schema 和时间轴语义,而不是一律取消重叠检查。

验收标准

  • 默认夹具退出码为 0,制造时间轴/重复 ID 错误时为 1,破坏结构合同时为 2。
  • 69 项测试在普通、-O 和 warnings-as-errors 三种模式均通过,且不生成缓存。
  • 能手算其中一个片段的 WER 并与脚本核对。
  • 能解释脚本未验证真实音频质量、VAD、时间戳精度或说话人正确性。
  • 能说明为何不应把合成 slice 结果当作真实公平结论。

完成后回到 语音识别目录,再把指标思路连接到 Benchmark 设计。