# 诊断流程样例:歌词卡对齐验收 ## 输入 | 输入 | 示例 | 作用 | |---|---|---| | 权威音频目录 | `~/Documents/learning-bu/english/04-projects/英文歌项目/抖音-sdhdxh-tonzhon-mp3` | 防止用错 MP3 来源 | | 完整歌曲 | `song.mp3` | 作为切片母文件 | | 时间戳歌词 | `song.lrc` | 提供每一句的开始时间和文本 | | 卡片表 | `cards.csv` 或 APKG 解包后的 notes | 读取正面 cloze 和 sound 引用 | | Anki 媒体目录 | `collection.media` | 检查 `[sound:xxx.mp3]` 是否真的可播放 | ## 流程 1. 读取 manifest,确认本次使用的 MP3 来自权威目录;如果实际文件来自下载缓存或临时目录,直接 FAIL。 2. 解析 `song.lrc`,生成 `line_id, start_ms, end_ms, lyric_text`。 3. 解析每张卡:提取正面文字、挖空词、`[sound:...]` 文件名。 4. 用文本相似度把卡面歌词匹配到 LRC 行,用切片 metadata 或切片起止时间把音频匹配到 LRC 行。 5. 对比 `text_line_id` 和 `audio_line_id`。 6. 检查 media 文件是否存在、大小是否异常、是否有同名覆盖、是否适合 AnkiWeb 同步。 ## 失败样例 | card_id | text_line | audio_line | 判定 | 修复建议 | |---|---:|---:|---|---| | `beauty_012` | 12 | 11 | FAIL: 音乐前一句,卡面后一句 | 重新按完整 MP3 + LRC 切片,不要整体后移硬补 | | `beauty_045` | 45 | missing | FAIL: sound 文件缺失 | 重新导出 media,并确认 Anki collection.media 中存在该文件 | ## 成功信号 - `source_ok = true` - `alignment_pass_rate = 100%` - `missing_media_count = 0` - `off_by_one_count = 0` - 生成 APKG 前 gate 返回 exit code 0 ## 落地方式 制卡脚本最后一步从“直接导出 APKG”改成:先生成 draft deck 和 media,再运行 `lyrics_anki_alignment_gate.py`。只有报告 PASS 时才导出最终 APKG;否则打开 HTML review 页,按失败行重切或替换音源。