考研高数教学视频字幕校正
两种工作模式
模式一:学习口音模式(首次使用 / 追加学习)
当用户提供"原始字幕 + 校正字幕"的 SRT 文件对时执行。
步骤:
- 确认文件路径:原始 SRT 目录 和 校正 SRT 目录(或单个文件对)
- 运行校准脚本提取个性化错误模式:
bash python3 ~/.cursor/skills/subtitle-correction/scripts/calibrate.py \ --raw-dir <原始SRT目录> \ --corrected-dir <校正SRT目录> \ --output ~/.cursor/skills/subtitle-correction/accent-patterns.md \ --append
- 不带--append时会重新生成整个个性化区域
- 带--append时追加新模式到已有数据中 - 向用户汇报学习结果(提取了多少条模式、Top 10 高频错误)
模式二:校正字幕(日常使用)
当用户提供待校正的 SRT 文件(或视频文件)时执行。
步骤:
- 获取初始字幕
用户直接提供 SRT 文件时,跳到步骤 2。
用户提供视频/音频文件时,先生成字幕:
bash
whisper "<视频路径>" --model medium --language zh --output_format srt --output_dir "<输出目录>"
如果用户未安装 whisper,提示安装:pip install openai-whisper
- 读取参考资料
读取以下两个文件,加载到上下文中:
- accent-patterns.md — 口音错误模式(通用基线 + 个性化模式)
- glossary.md — 考研高数术语词库
- 解析 SRT 文件
bash
python3 ~/.cursor/skills/subtitle-correction/scripts/srt_utils.py parse "<SRT文件路径>"
输出 JSON 格式的字幕条目列表。
- 分批校正
每批 20-30 条字幕,对每条文本执行三层校正:
第一层 — 个性化高频词替换:
直接应用 accent-patterns.md 中"个性化高频错误"区域的替换词对。
这些是从历史数据中学到的确定性错误,准确率最高。
第二层 — 术语词库匹配:
检查 glossary.md 中的术语及其误识别变体。
当字幕中出现某个术语的已知误识别形式时,替换为正确术语。
第三层 — 上下文语义校正:
利用 LLM 理解能力,结合前后文语境判断:
- 是否有前两层未覆盖的口音错误
- 是否有断句/标点需要修正
- 数学表述是否通顺准确
第四层 — 水词/语气词清理:
清除口语中无意义的填充词,使字幕简洁可读。参考 glossary.md 中"水词与语气词"章节。
清理规则:
- 删除纯语气词:句首/句尾的"嗯""啊""呃""哈""呢"等(不改变语义的)
- 删除口头禅填充词:如"然后呢""就是说""对吧""你看""我跟你说"等出现在句中但无实际意义的
- 合并重复表达:如"就是就是""对对对""好好好"压缩为一次或直接删除
- 保留有语义作用的:"这个问题呢"中的"呢"可以删,但"是不是呢?"中的"呢"表反问语气应保留
- 清理后如果整条字幕变为空,则删除该条目(调整后续序号)
第五层 — 数学公式排版规范化:
核心原则:在公式语境中,用数学符号代替中文口语表述;在非公式的口语说明中保留自然语言。
参考 glossary.md 中"高频误识别→数学符号映射"和"Unicode 上下标速查表"章节。
禁止算术化简(关键规则):
- 严禁对数学表达式做算术化简,必须保留老师口述的原始结构形式
- "3的平方分之一" → 1/3²(不是 1/9)
- "n平方π分之2" → 2/(n²π)(不是化简后的数值)
- "2的阶乘分之一" → 1/2!(不是 1/2)
- "3的平方π分之2" → 2/(3²π)(不是 2/(9π))
- 原因:教学视频中的公式结构体现了数学规律(如级数通项),化简会隐藏规律,不利于学生理解
函数与导数(零容忍规则 — 输出中不允许出现任何 FX/F1撇/F一撇 等原始识别形式):
- 函数统一用小写 f(x),所有 FX/F(X)/f x 必须转为 f(x)
- 所有"撇"字必须转为撇号 ':f撇/f一撇/F1撇 → f';f两撇/f两p → f''
- n 阶导数写作 f⁽ⁿ⁾(x)
- 带参数的导数同理:F1撇X0 → f'(x₀),F1撇KC → f'(ξ),f一撇0 → f'(0)
下标与上标(使用 Unicode 字符):
- 下标:x₀, x₁, ξ₁, ξ₂, a₁...aₙ
- 上标/次方:x², x³, xⁿ, (-1)ᵏ
- 复合上标:x²ᵏ⁺¹ 表示 x 的(2k+1)次方
- "x0"/"X0" → x₀;"xN" 中的 N 大概率是下标 → xₙ
希腊字母与常数(零容忍规则 — pi/派/theta 等拼音/中文音译在数学语境中毫无意义,必须转换):
- pi/PI/派/拍 → π(圆周率,任何数学语境中都不应出现 pi 或 派)
- theta/Theta/西塔 → θ
- alpha/阿尔法 → α
- ξ/克西/KC 等已在术语词库中覆盖
运算符与等式(仅在公式语境中替换):
- "加" → +,"减" → -,"等于" → =
- 示例:"1加x加1/2x" → 1+x+½x
- "乘以"/"乘" → ·(中点)
- 复合表达式整体转换:"等于-1的n减一次方" → =(-1)ⁿ⁻¹;"所以它就等于-1的n减一次方" → 所以它就=(-1)ⁿ⁻¹
- 纯口语说明中(如"然后加上一个余项")保留中文
阶乘:
- "的阶乘"/"阶乘" → !
- 示例:n的阶乘 → n!,(2k+1)的阶乘 → (2k+1)!
分数:
- 优先用 Unicode 分数:½, ⅓, ⅔, ¼, ¾
- "x分之一"/"x分之y" 统一用 y/x 格式:n分之一 → 1/n,2的阶乘分之一 → 1/2!
- 其他用 / 表示:1/n!,x/(1+x)
求和符号:
- "c k码"/"c个码"/"西格玛" → Σ
n/m 混淆(关键规则):
- 老师念 n 经常被识别为 m,数学语境中 n 的频率远高于 m
- FM → f(n) 或 f⁽ⁿ⁾(取决于上下文)
- m的阶乘 → n!(若上下文中一直用 n)
- X2M → x²ⁿ,m加一 → n+1
语境判断(核心规则):
- 所有识别结果必须符合数学教学视频的语境
- 出现与数学完全无关的词(如"c k码""缪""lower终止命令""解Wifi方程"等),必须结合上下文推断其实际数学含义
- 参考 glossary.md 中"高频误识别→数学符号映射"获取常见的荒谬识别→正确数学含义的映射
第六层 — 公式连续性检查:
检查相邻字幕条目,如果一个数学公式被切断到两条中,合并为一条:
- 合并时取第一条的起始时间和第二条的结束时间
- 特别长的公式可以保持分开,但每条必须是语义完整的片段
- 典型需合并的案例:
- f(b)-f(a)/g(b)-g(a)=f' + (ξ)/g'(ξ) → 合并
- 闭区间上连续开区 + 间上可导 → 合并
- 检查标准:如果一条字幕以不完整的数学表达式结尾(如括号未闭合、运算符悬挂),应与下一条合并
校正原则:
- 只修改识别错误、清理水词、规范公式排版,保留有意义的口语表达
- 高确信修改直接替换
- 低确信修改在文本后标注 [?],方便人工审核
- 保持时间码完全不变(合并条目除外,合并时取首尾时间码)
- 全局兜底校验
六层校正完成后,对整个字幕文件做全局扫描,捕获遗漏和异常。
校验结果分两类处理:
- 自动修复:明确的遗漏,直接修正
- 标记警告:不确定但可疑的问题,加入报告的"校验警告"区域
校验一 — 残留非中文/非数学垃圾文本:
检查每条字幕,识别与数学教学完全无关的英文短语或乱码:
- 纯英文噪音:"you have a full heart", "button", "so he is", "for often", "sorry you may can't let you go" 等
- 背景音乐歌词被误识别为字幕的内容
- 处理:纯垃圾条目 → 自动删除;混合内容(中文+垃圾英文)→ 删除英文部分保留中文
校验二 — 语义异常检测:
扫描每条字幕,判断在"考研高数教学"语境中是否说得通:
- 包含完全不相关的词(如 "婚姻""快乐种子""碳""麦肯劳" 等未被前面校正层捕获的原始误识别残留)
- 单条字幕语义完全不通顺(可能是 ASR 幻觉输出)
- 处理:能推断正确含义的 → 自动修复;无法推断的 → 标记警告
校验三 — 公式完整性检查:
- 括号平衡:检查 (), [], {} 是否配对,未配对的标记警告
- 悬挂运算符:字幕以 +, -, ·, =, / 开头或结尾 → 提示可能需要与相邻条目合并
- 孤立公式碎片:仅包含 (ξ), dx, + 等无法独立成句的内容 → 合并到相邻条目
校验四 — 残留原始 ASR 格式(零容忍兜底):
全文搜索以下模式,发现即自动修复:
- FX, F1撇, f一撇, F(X), f x → 转为正确格式
- KC, k c, KCE → ξ
- theta, Theta → θ
- pi, PI, 派(数学语境中)→ π
- 中文"加""减""等于"出现在公式表达式中 → 替换为 + - =
- 任何"撇"字残留 → 转为撇号 '
校验五 — 重复/冗余条目:
- 相邻两条字幕文本完全相同 → 删除后一条
- 相邻字幕高度相似(一条是另一条的子串,或仅差一两个字)→ 合并为更完整的版本
- 同一短语在条目内重复(如 "26题 26题")→ 去重为 "26题"
校验六 — 极短条目:
- 仅 1-2 个字符且无独立语义的条目(如单独的 "加", "的", "嗯")
- 合并到前一条或后一条(取时间上更近的),或直接删除
校验七 — 时间码合理性:
- 时间码单调递增(没有乱序)
- 相邻条目无时间重叠
- 单条持续时间合理(不应 < 0.3 秒或 > 30 秒)
- 发现异常时标记警告,不自动修改时间码
校验八 — 变量一致性:
- 同一段落中 n 和 m 是否混用(如前面一直用 n,突然出现 m,大概率是残留的 n/m 混淆)→ 自动统一
- ξ 与 KC 是否混用 → 统一为 ξ
- 函数名大小写是否混用(f(x) 和 F(x) 不应共存)→ 统一为小写 f(x)
- 输出结果
使用工具脚本写出校正后的 SRT:
bash
python3 ~/.cursor/skills/subtitle-correction/scripts/srt_utils.py write \
"<输出SRT路径>" '<JSON字幕数据>'
生成修改对比报告:
bash
python3 ~/.cursor/skills/subtitle-correction/scripts/srt_utils.py diff \
"<原始SRT路径>" "<校正后SRT路径>"
- 向用户展示结果
报告格式:
```
校正完成!
- 总字幕条数: XXX
- 修改条数: XX (XX.X%)
- 高确信修改: XX 条
- 待确认修改: XX 条(标记 [?])
- 水词清理: XX 条
- 公式排版: XX 条
- 公式合并: XX 条
- 兜底校验自动修复: XX 条
- 兜底校验警告: XX 条
校正后文件: <路径>
修改报告: <路径>
请重点检查:
1. 报告中标记 [?] 的待确认条目
2. 报告末尾"校验警告"区域的可疑项
```
报告末尾附加校验警告区域(仅当有警告时生成):
```markdown
## 校验警告
以下条目通过兜底校验发现可疑问题,请人工确认:
| 序号 | 时间码 | 当前文本 | 警告类型 | 说明 |
|---|---|---|---|---|
| ``` |
警告类型包括:语义异常, 括号未闭合, 悬挂运算符, 变量不一致, 时间码异常, 残留ASR格式, 疑似垃圾文本
注意事项
- SRT 文件编码:优先尝试 UTF-8,兼容 UTF-8 with BOM 和 GBK
- 分批处理时保持批次间 5 条重叠,避免上下文断裂
- 如果字幕条数超过 500 条,提示用户校正过程可能较长
- 校正完成后提醒用户可以将本次修改反馈到模式库(模式一)