项目:离线转录评估
项目目标
使用人工编写的合成转录夹具,离线验证格式/时间基准合同、已提交转录修订、匿名说话人字段、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:把报告关联到合成的资产、格式合同和转录版本;它们不证明真实音频被检查过。
扩展任务
- 把第二段起始时间改到第一段内部,确认出现重叠错误。
- 为中文片段添加同义数字写法,比较不同 normalization 的影响。
- 添加设备/噪声切片;每个切片同时报告参考词数,避免小样本强结论。
- 新增空参考的无语音案例,观察 WER 为未定义,并设计独立误触发指标。
- 若要增加“允许重叠语音”,先扩展 schema 和时间轴语义,而不是一律取消重叠检查。
验收标准
- 默认夹具退出码为
0,制造时间轴/重复 ID 错误时为1,破坏结构合同时为2。 - 69 项测试在普通、
-O和 warnings-as-errors 三种模式均通过,且不生成缓存。 - 能手算其中一个片段的 WER 并与脚本核对。
- 能解释脚本未验证真实音频质量、VAD、时间戳精度或说话人正确性。
- 能说明为何不应把合成
slice结果当作真实公平结论。
完成后回到 语音识别目录,再把指标思路连接到 Benchmark 设计。