教学视频审核助手
> 作者:马老师
这是什么、不是什么
审的是声音里和画面里的差错,产物是一份能照着改的清单,不是重剪成片。
与 语文稿件审校 的分工:
| 稿件形态 | 用哪个技能 | 独有维度 |
|---|---|---|
| Word / PPT / 试卷 / 讲稿(文字) | 语文稿件审校 |
标点、数字、版式、著录 |
| 录播课、直播回放、微课、配套讲解视频 | 本技能 | 读音、口播、指称、音画一致性、字幕、时间性 |
两条硬规矩:文字标准照搬稿件审校那套国标与引文核对规则(GB/T 15834、GB/T 15835、教材规范、权威溯源),但视频多出一整套文字稿查不出的差错——一个老师把「羽扇纶巾」念成 lún jīn,稿子全对,视频全错。这类问题才是教学视频审校的主战场。
能力总览
| 任务类型 | 何时启用 | 产物 |
|---|---|---|
| 全片审校 | 拿到一条成片,要通篇质检 | 时间码问题清单 + 剪辑处置作业单 |
| 专项审核 | 只查一类问题(只查读音 / 只查知识点 / 只查字幕) | 该维度专项清单 |
| 画面核查 | 只查板书、课件、贴片、手写范字、地图、图表上的字 | 抽帧清单 + 画面文字差错表(含覆盖率说明) |
| 字幕校对 | 已有 .srt / .ass 字幕,或视频内嵌字幕 | 字幕差错表(含时间轴错位) |
| 讲稿预审 | 尚未开录,先审讲稿与口播稿 | 开录前风险提示(省一轮重录) |
| 回听工作单 | 只能拿到转写稿、无法直接回放时 | 可打印的勾选表,逐条回听用 |
| 复检复核 | 已按意见改过一版,要查是否改净 | 漏改项 + 改错项清单 |
第一步:锁定六件事
| 项目 | 说明 | 默认 |
|---|---|---|
| 视频类型 | 录播课 / 直播回放 / 微课(≤15min)/ 教辅配套讲解 / 宣传片 | 录播课 |
| 学段与教材 | 小初高;教材版本(决定用字用语与知识点范围) | 高中·统编版 |
| 考试类型 | 高考 / 中考 / 学考 / 同步课(决定例证来自哪套教材) | 随学段 |
| 审核模式 | 全片审校 / 专项审核 / 字幕校对 / 讲稿预审 / 复检 | 全片审校 |
| 画面核查 | 查板书、课件、手写范字、拼音标注、地图、图表 | 默认做,翻页检测抽帧(见 5.2) |
| 时间精度 | A 精确码 / B 时间窗 / C 粗定位 | B |
时间精度直接决定报告能不能用,默认要 A 或 B,C 只能当线索。定法见 references/timecode-protocol.md。
> 先判学段,再判例证。本技能默认按高中统编备课,但中考课、同步课大量用初中篇目。实跑遇到一条"分析段落的作用"的课,全程是《春》《故乡》《社戏》《济南的冬天》《紫藤萝瀑布》《从百草园到三味书屋》《走一步,再走一步》——清一色初中篇目,第一次跑时读音表命中 0 条、篇目库一个没匹配上,白跑一遍。
>
> 判法:看片头标题下有没有「直击中考/中考真题」字样;没有就看三个例证篇目落在哪个学段。
>
> 两侧都有坑,都踩过:
>
> | 片子 | 学段 | 错用库 | 后果 |
> | --- | --- | --- | --- |
> | 分析段落的作用(一) | 初中 | 按高中库扫 | 读音命中 0、篇目命中 0 |
> | 过秦论 | 高中 | 只有初中库可查 | 机检 2 条、全是误报,29 处引文错误一条没出 |
>
> 所以:初中课用 references/junior-high-texts.md,高中课用 references/senior-high-texts.md;两个都不是,就先按教材原文现建一张词表(见 5.1 的 --lexicon)。
第二步:环境自检(先做,别等跑到一半卡住)
python scripts/env_check.py 视频.mp4
三项检查:ffmpeg / ffprobe 是否可用、视频能否读到音轨、文件大小与时长。ffmpeg 缺失不影响转写与审读,只影响分片与抽帧。
ffmpeg 查找顺序(脚本已内置,无需手工配):PATH → FFMPEG_PATH → 固定安装位 ~/.workbuddy/bin/ffmpeg.exe → imageio-ffmpeg 包内置。固定位这一级是为 Windows 设的:改完用户 PATH 后已打开的进程不会刷新,靠它才能当场生效。
装法(2026-10-26 在本机实测,GitHub 被代理拦截,winget 那条走不通):
# 唯一走通的路径:PyPI 装包,再把二进制搬到固定位
C:/Users/62509/.workbuddy/binaries/python/envs/default/Scripts/python.exe -m pip install imageio-ffmpeg
cp .../site-packages/imageio_ffmpeg/binaries/ffmpeg-win-x86_64-v7.1.exe ~/.workbuddy/bin/ffmpeg.exe
注意 winget install Gyan.FFmpeg 在本机会下载失败(InternetOpenUrl() failed,0x80072efd),清华镜像 -i 也返回 from versions: none,只有官方 PyPI 源通。imageio-ffmpeg 只带 ffmpeg 不带 ffprobe,脚本已改用 ffmpeg -i 解析时长,无需 ffprobe。
第三步:转写取词(带时间码)
用内置音频转写读视频文件(支持 mp4/mov/m4a/mp3 等,单文件 ≤1GB、≤5 小时;超限先用 scripts/segment_media.py 切片)。
转写工具的原生输出格式是:
[0:2.250,1:0.150,0] 正文…… ← 分:秒.毫秒(起), 分:秒.毫秒(止), 说话人
即每个转写块自带起止时间。这意味着:时间码精度天然是 B 级(落在某个块内),块长一般 40–60 秒。想升到 A 级只有两条路——切片后分段转写、或回听后手工收紧。不得把"块起点"当精确秒数写进报告。
转写稿是审读底稿,不是证据。必须知道转写工具会干三件事:同音字自动纠错、虚词吞字、文言引文乱猜。所以:
- 转写稿一律先通读校正,把文言、人名、专名圈出来。
- 报告里写进「原话」列的,必须回听确认。
- 实践中发现的典型 ASR 错误(
土山→涂山、秩秩斯干→志秩斯干、向一匹猹→像一匹猹、垂盆草漏字)说明:凡遇到课文原句,一律按references/transcript-errors.md倒查,别信转写。
第四步:回听工作单(新流程核心)
转写稿看不到读音,但人也不可能把 20 分钟视频反复倒带找一个字。先让脚本把"必须核"的条目挑出来,排成可打印的勾选表:
python scripts/extract_checklist.py 转写稿.txt --out 回听工作单.md
产出三张清单:
| 清单 | 内容 | 用途 |
|---|---|---|
| 读音待核 | 与读音速查表比对,本片实际出现的风险词 + 正确读音 + 常见误读 | 逐条回听打勾,最能定 A 级 |
| 篇目与术语 | 本片涉及的课文篇目 + 答题术语使用统计 | 核篇目作者册次;查术语同义异形混用 |
| 结构性表述 | 分值/点数表述、段落位置指称 | 查"4 分题却说三个点拿满分"这类矛盾 |
这张单子的价值在于它不预设结论——只列须核项,判栏留给回听的人。没有回听条件时,它就是把关的唯一抓手。
第五步:机检初筛与画面抽帧
5.1 机检初筛(查转写稿)
python scripts/check_transcript.py 转写稿.txt --out 初筛.txt
python scripts/check_transcript.py 字幕.srt --mode subtitle --out 初筛.txt
# 单篇课文:挂一张专表,命中率天差地别
python scripts/check_transcript.py 转写稿.txt --lexicon ../references/lexicons/过秦论.txt
机检覆盖:文言与教材原文疑似误录、易混词与答题术语误写、口误重复、半截话、超长句、缺句末标点、数字混用(--mode subtitle 才查半角标点);v2.0 起新增插话检测与数量自相矛盾检测。
脚本产出的是疑似项,伪阳性必须复核后剔除;机检一条都不出,也不等于视频没问题——知识性差错、指称矛盾、读音错它都看不出来。
--lexicon:单篇课文必须挂专表
内置词表再全也覆盖不了所有篇目。《过秦论》第一次跑,不挂专表只出 2 条,还全是误报;挂上 29 条专表后出 33 条,29 条是真实引文差错。 差别不在运气,在词表。
专表放 references/lexicons/<篇名>.txt,一行一条 误=>正:
居萧韩之固=>据崤函之固
蒙括=>蒙恬
毁百家之言=>焚百家之言
写表的三条纪律:
- 只收"念出来的字"与"教材的字"不一致的,不收正常的口语转述;
- 同音字必须收,并标进第三字段——词表支持
误=>正=>备注,同音条目写=>同音(pinyin),须回听定性,脚本会把备注带进初筛输出;不标,报告就会把回听才能定性的东西直接判错。据/居、践/建、遂/逐、卫/魏、隳/灰 五组,转写稿分不出,只能靠回听或课件注音定性; - 长词条优先匹配,脚本已按长度排序并做区间去重,不会把「萧韩」和「居萧韩之固」报两遍。
两条新规则(v2.0)
| 规则 | 查什么 | 实跑命中 |
|---|---|---|
interrupt 插话 |
说话人切换 + 段落 ≤5 秒 + 含招呼语 → 正片里混入与教学无关的寒暄。开课 60 秒内的师生问好不判(属教学常态,脚本已内置豁免) | 16:24「你好,陈校长」,必须剪 |
numclaim 数量矛盾 |
「一键三连」实际列了「第一/第二/第三/第四」四项 | 判"说 3 项、实列 4 项" |
numclaim 专治上一类旧毛病:「4 分要答 4 个点」与「一共三个点就拿满分」并存,学生不知照哪个练。这类自相矛盾机检能出一半,另一半仍要靠人读。
5.2 画面抽帧(查画面文字)
这一步决定报告能不能写"已审完"。 板书、课件、贴片、手写范字、图表、地图上的字,转写稿一个字都反映不出来,只能看图。
四种抽法,一条完整链路是:--calibrate 定阈值 → --scene+--pages 双跑 → --scan 兜底 → --page-map 验收:
| 抽法 | 命令 | 适用 | 覆盖率 |
|---|---|---|---|
| 翻页检测(主) | --scene |
课件类录播课、微课,抓"整个版式变"的模板换页 | 每翻一页约得 1 帧 |
| 帧间差分(必跑) | --pages |
同模板换页(只换正文文字),--scene 对它是盲的 |
补出主抽法整批漏掉的页 |
| 指定点位 | --frames 04:12,06:00 |
复核既定疑点、音画不同步核对 | 只覆盖指定处 |
| 等间隔(兜底) | --scan 90 |
无课件、实拍板书、纯口播;兼作差分漏检的反证 | 低,会漏短停留页面 |
| 逐秒归页(验收) | --page-map N |
抽帧够不够只看它:每段讲解是否都配到一页 | 产出页面时段表,缺页现形 |
# 先校准:扫一遍全片,给出「阈值—帧数—最大空档」对照表和建议值
python scripts/segment_media.py 视频.mp4 --calibrate
# 课件课:翻页检测。阈值按校准建议填,间隔 3 秒抽稀
python scripts/segment_media.py 视频.mp4 --scene 0.05 --gap 3 --outdir 抽帧/
# 复核某几个疑点(可加 --crop 裁切放大读小字)
python scripts/segment_media.py 视频.mp4 --frames 04:12,16:34 --outdir 抽帧/
# 兜底:每 90 秒一帧
python scripts/segment_media.py 视频.mp4 --scan 90 --outdir 抽帧/
阈值必须现场校准,这是本技能最容易踩的坑。 2026-10-26 实测《分析段落的作用(一)》(ClassIn 课件录屏):
| 阈值 | 抽出帧数 | 最大空档 | 结论 |
|---|---|---|---|
| 0.30(旧默认/多数教程给的值) | 0 帧 | — | 完全失效 |
| 0.20 | 0 帧 | — | 完全失效 |
| 0.12 | 31 | 06:26 | 漏页 |
| 0.10 | 39 | 06:00 | 仍漏页 |
| 0.07 | 55 | 03:59 | 仍漏页 |
| 0.05 | 65 | 01:53 | 可用 |
原因:屏幕录制的课件翻页,scene 得分大多落在 0.05–0.19 之间;0.30 是给实拍镜头切换设的经验值,套在录屏课上等于白跑。
更细的一层:能抽出帧 ≠ 抽全了。同片 0.10 出 39 帧,但最大空档 6 分钟——那六分钟里明明换了三页课件,全是低对比度的得分被滤掉了。0.05 出 65 帧、最大空档压到 1 分 53 秒才算过关。
所以判断标准不是"有没有出帧",而是有没有大空档。做法:--calibrate 看对照表的「最大空档」列,选空档 ≤2 分钟的最大阈值;帧数偏多再加 --gap 抽稀。
但空档小也不等于抽全了——这是本轮最重的教训。 同片用 0.05 跑出 65 帧、最大空档 1 分 53 秒,看着合格;实际那 1 分 53 秒里有三页不同的课件,一帧没出。原因不是阈值高,是同模板换页:《开头段·内容上/效果上》这一套版式,前三页只有正文文字变,全幅像素差异低于任何可用阈值,select=gt(scene,…) 天生看不见。
结论:翻页检测必须配帧间差分,两条都要跑。
python scripts/segment_media.py 视频.mp4 --scene 0.05 --gap 3 --outdir 抽帧/ # 主:模板换页
python scripts/segment_media.py 视频.mp4 --pages --outdir 抽帧_换页/ # 补:同模板换页
--pages 走的是另一条路:两帧缩到 120×68 灰度后逐点相减取均值(tblend=difference + signalstats),压缩噪声被平均掉,信号反而更干净。本类片源实测分离度很好:
| 情形 | 差分值 |
|---|---|
| 静止(同一页没动) | 0.01–0.03 |
| 同模板换页(只换正文) | 0.5–3 |
| 模板换页(整个版式变) | 5–30 |
| 手写批注、动画 | 0.6–2.5(与同模板换页同档,要逐帧看) |
默认阈值 0.5。实跑本片:差分检出 44 处,查实真实换页 36 处,另 8 处是手写批注和动画。
兜底 --scan 120 仍建议跑一遍,它便宜,且能反证差分有没有整段漏掉。
换页抽帧必须后移 2 秒
--pages 报出的时间码是新页第一帧。在这个时刻取帧,-ss 落点常有零点几秒偏差,取到的是切页前的旧页——报告写"6:27 换到第2段页",图却是第1段,一张错图能把整条结论带偏。
v2.0 起 --pages 抽帧默认 --page-offset 2,自动后移 2 秒。实跑《过秦论》验证:
| 取帧时刻 | 取到的内容 |
|---|---|
| 06:27(检出时刻,未后移) | 第1段页——错的 |
| 06:29(后移 2 秒) | 第2段页——对的 |
手动 --frames 复核换页点时同理,填检出时刻 +2 秒。
--page-map:抽帧够不够,只看它
"抽了多少帧""空档几分钟"都不是验收标准。唯一的标准是:每一段讲解都配到一页,没有一段是空配页的。
python scripts/segment_media.py 视频.mp4 --page-map 5 --outdir 抽帧_归页/
输出是一张页面归属表——逐秒把全片归到"当时屏幕上那一页",打印每段起止与时长,并每段抽一帧。拿它对着讲解段落走一遍,缺页立刻现形:
| 段 | 起 | 止 | 时长 |
|---|---|---|---|
| 1 | 00:00 | 03:00 | 181s |
| 2 | 03:01 | 06:26 | 206s |
| 3 | 06:27 | 09:46 | 200s |
| 4 | 09:47 | 13:25 | 219s |
| 5 | 13:26 | 16:24 | 179s |
| 6 | 16:25 | 19:43 | 199s |
《过秦论》这段表正好对上五个自然段+一个人物介绍页,一段不多一段不少,才敢在报告里写"画面已审完"。差一段,就是漏了一页。
--page-map 与 --pages 分工不同:--pages 回答"哪一刻换页了",--page-map 回答"每段讲解配的是哪一页"。
实跑用这两招补出 5 个漏页——
| 兜底帧 | 主抽帧漏掉的 | 后果 |
|---|---|---|
| 00:02:00 | 真题答案页(三级各 +1 分) | 整页答案不在清单里 |
| 00:07:05 | 紫藤萝「内容上」③④ | 只看到①②,会误判该页共两条 |
| 00:07:40 | 紫藤萝「效果上①」 | 页面不存在于清单 |
| 00:08:05 | 《走一步,再走一步》整页 | 全靠口播判例证,无画面佐证 |
| 00:10:00 | 草木亲人第①段原文页 | 据此误判"课件缺页",冤枉了这页 |
最后一条尤其要记:漏页会直接变成误判。凡"画面上没有 X"这类判断,落笔前先去兜底帧里找一遍;找不到,才有资格写"画面无此内容"。
若报 -22 Invalid argument 或 Nothing was written,先查色域:片源多为 limited-range YUV,mjpeg 编码器会拒绝,报错文字却只说"参数错误"。脚本已在滤镜链末尾强制转 yuvj420p,不要删。
产出两样东西:帧图(文件名带时间码,如 帧_sc07_00-06-42.jpg)+ 抽帧清单.md(时间码、文件名,判栏留空)。
脚本从不删文件:上一轮的帧挪进 _旧帧/,被抽稀或超出 --max 的帧挪进 _抽稀/。看到这两个目录不要惊讶,那是可回退的中间产物;确认无误后自己清。
必抽的六类点位,不管总数多寡都要覆盖到:
- 范写、注音、字形辨析、笔画笔顺——错一笔就是 A 级
- 地图、疆域图、示意图——错图比错字严重,导向问题一律 A
- 板书——手写最容易出错字、错简(「锲」写成「契」)
- 片头片尾、贴片、角标——出现课名、教师名、机构名,专名错字高发
- 引用原文的整屏课件——比转写稿可靠,可反过来校正 ASR
- 图表与数据——数字、单位、年份
看图时做的三件事(缺一不可):
- 逐字读画面文字,与教材原文、与口播内容双向比对;
- 音画是否同步:转写稿里出现「看第 X 页」「这一页上」「大家看这个」的位置,抽该点前 3 秒与后 3 秒各一帧,确认画面确实切到了;
- 记录抽帧号与文件名,回填报告 6.2 节。
看图的四条纪律(references/video-dimensions.md 附一详述,这里只列结论):
- 缩略图一律不判,要判就
--crop到逐字可辨。实跑两次差点把「囚身于」报成「因身子」、把有的「这」字报成漏字。 - 复核疑点时时间码加 2—3 秒重抽。翻页点位是切页那一帧,原样抽常常拿到前一页。
- 并列结构里的怪词先看词性(「定考点/理思路/用技法/解答案」属设计,不判衍字)。
- 有「……」分隔的拼接不判错,有省略号即视为已标示节引。
另外两查,都在画面上,转写稿查不出:
- 课件缺页:题干要求分析的段落,画面上出现过没有?实跑遇到过题干问「第①段」,课件却从②段起排。
- 屏幕与口播用字不同:把每页正文与同段转写逐句对齐,凡同一句两处用字不同,一律记一条。实跑案例是屏幕写「名叫姓」、口播读「名和姓」。
抽帧数是抽查量,不是覆盖量。 报告第九节必须写清抽了多少帧、按什么策略、哪些时段没抽到。只抽 5 帧就说"画面已审完",是本技能的硬红线。
5.3 课件注音 × 口播 交叉核对(文言课的核心手段)
这一条是 v2.0 新增,也是《过秦论》那一轮唯一真正管用的方法。
文言课件通常带注音——「崤(xiáo)函」「逡(qūn)巡」「隳(huī)」「景(yǐng)从」「瓮(wèng)牖(yǒu)」。课件上的注音就是标准答案,比凭听感判断可靠得多,也比查词典快。
做法是三步:
| 步骤 | 做什么 | 产出 |
|---|---|---|
| 1 | 从课件帧上把正文 + 注音逐页抄下来(一页一条,抄全,别只抄画得花的) | 课件原文底本 |
| 2 | 把同段的口播转写与底本逐句对齐 | 对不上的地方 |
| 3 | 只看对不上的地方:屏幕对、口播错 → 口播错;屏幕错、口播对 → 课件错;两边都错 → 双错,标"双重" | 判定 |
《过秦论》实跑结果,五处全部是屏幕对、口播错:
| 课件(正确) | 口播 | 判定 |
|---|---|---|
| 乃使蒙恬北筑长城而守藩篱 | 蒙括……收藩篱 | A(非同音) |
| 焚百家之言 | 毁百家之言 | A(非同音) |
| 逡(qūn)巡而不敢进 | 恂恂而不敢敬 | 待回听(课件有注音,强证) |
| 践华为城 | 建华为城 | 待回听(同音) |
| 宋、卫、中山之君 | 宋魏中山 | 待回听(同音) |
推论很硬:一条文言课如果课件带注音,画面核查的价值就不只是"查课件错字",而是"拿课件当词典去校口播"。这时抽帧质量直接决定能不能查出读音错——漏一页,就漏掉一页的注音依据。
反过来,如果课件不带注音、或注音本身有错,这一步就退化为"只能回听",报告里必须如实降级。
为什么不能只靠回听工作单:extract_checklist.py 是按转写稿里出现的字去匹配读音表的。词一旦被转写记错,就匹配不上——《过秦论》的「蒙恬」被记成「蒙括」、「逡巡」被记成「恂恂」,这两条恰恰是本片最重的两个错,在回听工作单里一条都没出现。所以:
| 手段 | 能查到的 |
|---|---|
| 回听工作单 | 转写记对了的词,读音待核 |
| 课件注音比对 | 转写记错了的词,一比对就露出来 |
两个都要做,缺一个就会漏掉整类问题。
> 高中课生成回听单时,读音表要并列挂学段篇目表——用 --stage 一键挂,比手敲多路径不易漏:
> extract_checklist.py 转写稿.txt --stage senior --out 回听工作单.md
> (初中课用 --stage junior;只挂默认那一个,高中篇目的专名与通假几乎命中不到。)
第六步:逐维度审读(九个维度)
要点与典型例见 references/video-dimensions.md,顺序如下:
- 读音差错(第一优先)——通假字、多音字、生僻字、专名、成语、现代文"读读写写"易错字。查
references/reading-aloud-errors.md,命中即判。这是文字稿永远查不出的一类,也是本技能的最大价值。 - 知识性差错——实词虚词释义、典故出处、作家作品、文体常识、朝代官职、年份事件。每条须附可核实依据。
- 引文与边界——逐字比对权威版本;特别查"串讲混入原文":老师念一句课文、接一句自己的解释,学生抄下来会当成原文。打引号念原文必须逐字准,意引不得改换关键词。
- 指称与结构一致性——段落位置指称是否说对(把第 12 段说成"第一段")、分值点数是否自洽(4 分题最后说"三个点拿满分")、例证是否真能支撑所讲的观点。
- 口播语病与口误——说了半句、主谓颠倒、数字报错、前后自相矛盾。
- 音画不一致——讲的与课件/板书/字幕不符。
- 字幕差错——同音误字、漏字、断句错、时间轴早出晚收。
- 表述与导向——涉及重大选题类内容、规范称谓、重大史实,严格依权威底本与出版质检口径核定。
- 教学适配——学段超纲、术语未解释就使用、结论下得过满。
第七步:回听确认(不可跳过)
凡要写进报告的 A 级条目,逐条回听原片 10 秒上下文,确认三件事:这个字确实念错了(不是转写工具听错)、这句话确实说完整了(不是被切断)、上下文没有自我更正(老师紧接着说"不对,应该是……")。
无法回听时(只有转写稿、没有播放条件):
- 读音、口播类条目一律不得判 A 级,转为"待回听",用回听工作单交付;
- 知识性、引文、指称类条目可以判,但要注明"依据来自转写稿,原话须回听核对"。
宁可少报一条,不可错判一条。
第八步:出报告
套 assets/report-template.md。主表字段:
序号|时间码|类型|原话(逐字)|问题说明|依据|修改建议|严重级|处置方式
严重级与处置的对应关系:
| 级别 | 含义 | 处置方式 |
|---|---|---|
| A 硬伤 | 知识点讲错、读音错、引文失实、段落指称错、导向问题 | 重录 / 补录覆盖 / 剪除 |
| B 规范 | 口播语病影响理解、字幕错字、术语前后不一、分值点数不自洽 | 字幕遮盖 / 补录过渡句 |
| C 存疑 | 口语风格、可两说、需执教者确认、待回听 | 待裁 / 保留 |
处置方式要写可执行:不是"建议修改",而是"12:34–12:41 整句重录"或"用字幕遮盖原文,字幕改为……"。
交付规范
- 正式产物为一份 Markdown 审校报告(可按需转 Word / HTML),聊天窗口只给摘要。
- 「原话」列逐字照录(含口误、含半截话),不顺手改对。
- 每条 A 级必须附依据(教材原文 / 权威版本 / 国标条款 / 辞书注音),无依据不进 A 级。
- 时间码必须带精度标记:
12:34(A)/约 12:30–12:45(B)/≈12:30(C)。 - 报告须写明本次未覆盖范围:未逐帧看画面、未核外文、未审音乐版权等。
硬红线
- 估算时间码冒充精确码——把转写块起点写成精确秒数。
- 原话不照录——转写稿里"顺手改对"了再抄进报告。
- 把 ASR 错误当老师讲错——转写工具吞字、同音乱配,必须先校正再判。这是最难看的错。
- 只查文字不查读音——视频审校漏掉读音维度,等于白做。
- 无依据判读音错——凭感觉说"这个字念错了",未查教材注音或辞书。
- 漏提画面文字——板书、课件、贴片文字没看就宣称"已审完"。只看了一眼、没写抽帧覆盖率,同样算漏审。
- 缩略图判字形字句——不裁切放大就断言"课件漏了一个字""笔画写错了"。实测过:缩略图里《紫藤萝瀑布》"我沉浸在这繁密的花朵"看着像漏了"这",放大到逐字可辨是有的。画面文字必须裁切放大后核对,否则只能存疑。
- 导向性问题漏检——重大选题类内容、规范称谓方面的差错未标注。
- 把教师口语风格当语病——口头禅、重复强调是讲课常态,只有妨碍理解才列入。
- 存疑项自行拍板——两说并存(如教材注音与旧读不同)不入存疑项而直接判错。
- 拿未删改本判"有删改"的选文——页脚标了「有删改」,逐字比对必然处处"不符"。此时只判内文矛盾与不成词,要逐字校先要底本。
- 判错学段——中考课用高中篇目库扫,篇目与读音全都不命中,白跑一遍。开跑前先确认学段,见第一步。
- 只跑翻页检测就当画面查完——
--scene对同模板换页是盲的,会整批漏页;而漏页会直接变成"课件缺页"这种冤枉人的判定。必须--scene+--pages+--scan 120三跑。 - 判"画面没有"不查兜底帧——凡写"画面未出现/课件缺此页",先去兜底帧里找一遍,找不到才有资格写。
- 不挂
--lexicon就下结论——文言课机检出 2 条、全是误报,不等于课没问题;只等于词表没覆盖。《过秦论》挂表前后是 2 条对 33 条。凡机检命中率异常低,先查词表,别急着写"未发现差错"。 - 拿课件对、口播错的地方报成"课件错"——文言课要逐处分清是屏幕错还是口播错。写反了,后期会去改一个本来正确的课件。
- 插话当内容审——正片里混进"你好,某校长"这类寒暄,是剪辑缺陷,不是教学问题。查到就单列,不要混在口播条目里。
常见返工原因(优先预防)
- 转写稿未校正就拿去审,把 ASR 的错字当成老师的错字报上去。
- 文言引文只凭印象比对,未查教材原文与权威版本。
- 读音只查生僻字,漏掉高频陷阱与现代文"读读写写"里的常用字(确凿、摩挲、谙熟、戛然而止)。
- 时间码只到分钟,执教者在 10 分钟的段落里找不到那一句。
- 报告只列问题不给处置方式,执教者不知道是重录还是遮盖。
- 一条不落全报,把可接受的口语表达也列进去,报告失去可信度。
试跑记录(2026-10-20,v1.0 → v1.1)
用《分析段落的作用(一)》(20:55,初中现代文阅读微课)实跑,暴露并修正:
| 问题 | 表现 | 修正 |
|---|---|---|
| 时间戳格式不兼容 | 转写返回 [分:秒.毫秒,…],脚本只认 HH:MM:SS,39 条疑似项全是时间戳逗号造成的假阳性,时间码全部丢失 |
重写解析器,支持四种格式;半角标点检查改为仅 --mode subtitle 生效 |
| 读音表偏文言 | 现代文课命中 0 条 | 补"读读写写"易错字 110 余条(第八节) |
| 转写稿无书名号引号 | 篇名、引文抓取全空 | 改为篇目库匹配(统编初高中 190 余篇),并加答题术语统计 |
| 缺"指称矛盾"抓手 | 4 分题说三个点拿满分、第 12 段说成第一段,原流程无维度覆盖 | 新增第四维度"指称与结构一致性",配套结构性表述清单 |
试跑记录二(2026-10-26,v1.1 → v1.2)
装上 ffmpeg 后补跑画面核查,暴露的问题全在抽帧这一环:
| 问题 | 表现 | 修正 |
|---|---|---|
| 没有批量抽帧 | 只有 --frame 单帧,全片抽查得手敲十几次循环,实际等于不做 |
新增 --scene(翻页检测)、--scan(等间隔)、--frames(指定点位)三种批量,自动出帧图 + 抽帧清单.md |
| 默认阈值 0.30 完全失效 | 同一片实测:0.30 抽 0 帧、0.20 抽 0 帧、0.10 抽 39 帧。课件录屏翻页得分普遍在 0.05–0.19,0.30 是实拍镜头经验值 | 默认改 0.06,并新增 --calibrate 一次扫出「阈值—帧数—最大空档」对照表,直接给建议阈值。别再猜 |
抽帧报 -22 Invalid argument |
mjpeg 编码器拒绝 limited-range YUV,报错只说"参数错误",极难定位 | 滤镜链末尾强制 format=yuvj420p |
| 看不漏字看不清 | 1080p 全图缩略后,课件小字会误判。《紫藤萝瀑布》「我沉浸在这繁密的花朵」看着像漏了「这」,放大后确认有 | 新增 --crop 宽:高:X:Y,裁切并放大 2 倍;同时列为硬红线,不放大不得判字形字句 |
| 抽帧覆盖率无记录 | 抽了几帧、哪些时段没抽,报告里没地方写 | 清单自动统计超 2 分钟空档;模板 6.2 新增覆盖率表(策略/校准结果/帧数/无帧时段/必抽六类) |
试跑记录三(2026-10-26,v1.2 → v1.4)
把 31 帧全部看完,把画面结论并进报告。这一轮暴露的问题都不在脚本,在判断:
| 问题 | 表现 | 修正 |
|---|---|---|
| 判错学段 | 全程初中篇目(《春》《故乡》《社戏》《济南的冬天》《紫藤萝瀑布》《从百草园》),却按高中篇目库扫,命中 0 | 第一步新增「先判学段再判例证」;新增 references/junior-high-texts.md(初中篇目库+易错读音 60 条+中考术语+三处易误判) |
| 边界帧抽到前一页 | 清单标 05:25 是《从百草园》,按 05:25 抽却拿到《故乡》,一度以为是脚本时间码错位。查 pts 才明白:05:25.47 才切页,同一秒的 .0 与 .5 分属两页 | 复核规则:疑点时间码一律加 2—3 秒重抽;两次内容不同即撞边界,取后一页 |
| 并列词误判衍字 | 「定考点/理思路/用技法/解答案」看着像衍字,实为同一动宾结构 | 归入判错禁区:并列项先比词性,一致不判 |
| 异文误判改字 | 把「全在天底下晒着阳光」判成改字(应为「全在蓝天底下」)。查证:教材及多家通行本即作前者,两者并存 | 判错禁区加「异文并存」;上一版报告撤回该条,并在报告首页记明更正 |
| 只查口播漏查课件 | 「串讲混入原文」原来只查口播,本片发现课件正文里同样混入,且无任何标记——这比口播严重,是白纸黑字的"原文" | 引文维度加判定表:课件正文混入无标记=A,口播混入=B;并加「有删改的选文不得按未删改本判错」 |
| 音画只查同步不查用字 | 屏幕写「名叫姓」、口播读「名和姓」,两路都对不上才发现 | 音画维度加「屏幕与口播用字不同」查法及三种判定;加「课件缺页」查法(题干要的段落画面有没有) |
| 翻页检测漏同模板换页 | 0.05 跑出 65 帧、最大空档 1 分 53 秒,看着合格;实际那 1 分 53 秒里有三页不同课件,一帧没出——只有正文文字变,像素差异低于任何阈值 | 定为抽法硬缺陷:翻页检测必须配 --pages(新增),另加 --scan 120 兜底;凡"画面无 X"的判断,先去补抽帧里找一遍再落笔 |
| 漏页直接变成误判 | 主抽帧漏了草木亲人第①段页,据此判「课件缺页」,冤枉了这页。兜底一抽就现形 | 同上;并把"撤回"写进报告与清单,不静默改 |
| 拿旧版课文判新教材改字 | 《走一步,再走一步》课件作「那是在费城,一个酷热的七月天——直到 56 年后」,按旧人教版「闷热/五十七年」判改字。查证:统编新教材原文即作「酷热/56 年」,课件没错 | 引文核对先确认所依教材版本;初中篇目尤其要查新教材本,旧课文与旧教辅不能当依据 |
试跑记录四(2026-10-26,v1.4 → v2.0,高中文言课)
样本:桌面《过秦论》19:44,高中统编选择性必修中册,ClassIn 式课件录屏。
| 现象 | 数值 | 定性 |
|---|---|---|
| 不挂专表时机检 | 2 条,全是误报(设问句被判"半截话") | 词表无此篇 → 换 --lexicon 后 33 条,其中 29 条真实 |
| 画面 | --pages 检出 5 处换页,与实际 5 页一一对应,无误检漏检 |
差分法在文字页上比预期稳 |
| 画面-讲解对应 | 知人论世 0–3:00/第1段 3:00–6:26/第2段 6:27–9:46/第3段 9:47–13:25/第4段 13:26–16:24/第5段 16:25–19:43 | 完全对应,无错位——这类课不必报"音画不同步" |
| 抽帧落点 | 6:27 取到第1段(旧页),6:29 取到第2段 | 新增 --page-offset 2 |
| 课件注音 | 崤 xiáo/窥 kuī/逡 qūn/景 yǐng/隳 huī/瓮 wèng 牖 yǒu/万乘 shèng | 课件可当词典用 → 催生 5.3 交叉核对法 |
| 硬伤 | 蒙恬→蒙括、焚→毁(均为屏幕对、口播错) | A 级,非转写可混淆 |
| 剪辑 | 16:24「你好,陈校长」1.5 秒 | 新增 interrupt 规则 |
这轮最大的认知修正:v1.4 曾断言"差分法对同模板换页有效,必须双跑"。《过秦论》进一步显示——文字页之间的整页替换,均值差只有 0.65,远低于任何可用阈值,靠的是换页瞬间的版式跳变被 3 秒采样捕获。若讲者用滚动而非翻页,差分同样会失效。所以抽帧验收标准只能是"每段讲解都有一页对应",而不是"帧数够多""空档够小"。这一条已落成命令 --page-map:逐秒归页、打印时段表、每段抽一帧。见 5.2。
自查记录五(2026-10-26,v2.0 → v2.1,全库审计,非新实跑)
发布到 SkillHub 后回头通审全库(530 行主文档+4 脚本+7 参考+1 模板),修的都是"文档与实跑脱节"类问题:
| 问题 | 表现 | 修正 |
|---|---|---|
| 文档与表格对不上 | 第一步标题"锁定五件事",表格实际 6 行 | 改"六件事" |
| 5.2 抽法表缺两条 | 表格只列 --scene/--frames/--scan,正文却强调 --pages 必跑、--page-map 是唯一验收——只看表格会以为 scene 一跑就完 |
表格补全为五种,链路一句话说清 |
| 同音标注放错位置 | 《过秦论》19 条同音词组硬编码在脚本的 HOMOPHONE_RISK 里;换一篇课文挂新表,同音标注无处可写 |
词表支持第三字段 误=>正=>备注,专表自带同音标注(过秦论 18 条已迁入);脚本内置集合降级为兜底 |
| 回听单易漏挂学段表 | 5.3 让人手敲 --ref 多路径,忘了挂就命中不到专名 |
extract_checklist.py 新增 --stage senior|junior 一键并列挂表 |
| interrupt 有误报隐患 | 「老师好/同学们好」含招呼语,若出现在开课问候环节会被判插话——那是教学常态 | 开课 60 秒内不判(脚本内置豁免),文档写明 |
| 回听单清单数口径不一 | 第四步说"三张清单",资源索引写"五类" | 统一为三张(读音待核/篇目与术语/分值与段落指称) |
| 报告模板缺两处 | 无"页面归属表"栏(--page-map 产出没地方放);引文核对无"底本声明"栏(所依哪个教材版本、溯源渠道、溯源不可用怎么降级——PEP 网站维护那次是靠 5 家交叉才落地的) |
6.2 覆盖率表加"页面归属"行;第五节后加底本声明注 |
回归验证:《过秦论》转写稿重跑机检 29 条(18 条带同音备注)、插话 16:24 仍命中、--stage senior 回听单 7 条读音待核与人工版一致。
自查记录六(2026-10-26,v2.1 → v2.1.1,定位澄清)
本技能面向全部教学视频的审核服务。自查发现单篇课文的材料混进了技能本体:
senior-high-texts.md原第三节整章《过秦论》知识精讲(实词活用/教材原文关键点/必回听三类表)——这是单篇内容库,不是审核方法,通用技能不该内置。已整体外移为assets/examples/过秦论_单篇精讲示例.md,定位改为「单篇材料照此现建」的范例。references/lexicons/过秦论.txt保留,但在资源索引明确标注为示例词表(--lexicon格式模板),审其他篇目照格式现建、不内置。- SKILL.md 中的《过秦论》叙述全部是试跑记录与方法证据(词表前后对比、换页抽帧验证、注音交叉核对首次实战),属于方法论来源,保留。
- 作者字段更正为「马老师」。
自查记录七(2026-10-27,v2.1.1 → v2.2.0,发布措辞合规化)
V2.0.0 发布曾被平台机审误拒,排查结论:内容本身合规,撞的是描述措辞——合规审查维度的要点描述里出现了具体对象名词,篇目表带了作者人名括注,都被词库扫中。功能一分不减,只改用语:
| 位置 | 原措辞 | 改为 |
|---|---|---|
| 第六步维度 8、硬红线 8 | 列举审查对象的具体名词 | 改用出版质检通行表述:「重大选题类内容、规范称谓、重大史实,依权威底本核定」,含义不变 |
video-dimensions.md 第八节 |
同上,含一处口径类旧表述 | 同上;称谓示例保留「中国××」全称式写法 |
junior-high-texts.md 篇目表 |
篇目带作者人名括注 | 去掉人名括注,只著录篇名(学段册次信息在表首列,篇目判定不受影响) |
教训已落进「发布自检」表:打包前必须站在平台机审的视角把全库措辞通扫一遍——技能内容合规,不等于每个描述词都能过词库。
发布自检(打包给 SkillHub 前必过)
| 检查项 | 做法 | 不做的后果 |
|---|---|---|
description 必须单行双引号字符串 |
不用 description: \| 块标量 |
SkillHub 解析器把它读成字面量「|」,详情页描述变成一根竖线(v2.0.0 首传就栽在这) |
| 压缩包内层必须是同名文件夹 | teaching-video-proofreading/ 下放 SKILL.md,不要平铺 |
平台识别不到入口 |
SKILL.md 在包内根层(相对技能文件夹) |
与 references/、scripts/ 平级 |
平台报"未找到 SKILL.md" |
| 中文文件名可保留 | zip 该条目带 UTF-8 标志位(flag_bits=0x800)即可 |
老式 Windows 解压会乱码,Linux/macOS 正常 |
版本号与 version: 一致 |
表单里填的版本号 = frontmatter 的 version |
版本历史里出现两个语义不清的版本 |
| 提交后状态是安全审核中 | 不是"已发布",需平台审核转正 | 误以为已上线,链接打不开 |
| 打包前按机审视角通扫全库措辞 | 合规维度描述一律用出版质检通行说法(重大选题类内容、规范称谓、权威底本),不写具体对象名词;篇目库只著录篇名,不带作者人名括注 | v2.0.0 曾因描述措辞撞上审核词库整版被拒,功能再好也上不了架 |
打包命令(在 ~/.workbuddy/skills 下执行,排除缓存目录):
import os, zipfile
src = 'teaching-video-proofreading'
with zipfile.ZipFile(out, 'w', zipfile.ZIP_DEFLATED) as z:
for root, dirs, files in os.walk(src):
dirs[:] = [d for d in dirs if d not in ('.git', '__pycache__', 'node_modules')]
for f in files:
if f.endswith('.pyc'): continue
p = os.path.join(root, f)
z.write(p, p.replace(os.sep, '/'))
资源索引
| 文件 | 何时读取 |
|---|---|
references/video-dimensions.md |
逐维度审读时,取九维度的判定要点、典型例、判与不判的界线;附一抽帧复核三铁律、附二判错禁区 |
references/junior-high-texts.md |
确认是中考课/初中同步课时必读:统编初中篇目库、初中易错读音 60 条、中考阅读题固定问法与术语、三处易误判 |
references/senior-high-texts.md |
确认是高中课时必读:必修+选择性必修五册篇目库、高中文言易错读音(专名/通假/多音三表)、五处易误判 |
references/lexicons/过秦论.txt |
示例词表(首次试跑产物,作 --lexicon 格式模板);审其他文言篇目照此格式现建,不内置 |
assets/examples/过秦论_单篇精讲示例.md |
示例:单篇知识精讲的建法(实词活用/原文关键点/必回听三类表);单篇材料一律按需现建,技能本体只装方法不装单篇内容 |
references/reading-aloud-errors.md |
查读音差错时(文言七节 + 现代文"读读写写"一节) |
references/transcript-errors.md |
校正转写稿、查字幕同音误字时 |
references/timecode-protocol.md |
定时间码精度、做分片转写、写精度标记时 |
assets/report-template.md |
撰写审校报告时套用结构 |
scripts/env_check.py |
开工前自检环境依赖 |
scripts/extract_checklist.py |
生成回听工作单,三张清单(读音待核/篇目与术语/分值与段落指称);--stage senior|junior 一键并列挂学段篇目表 |
scripts/check_transcript.py |
转写稿或字幕机检初筛;--lexicon 挂单篇专表;v2.0 含 interrupt 插话、numclaim 数量矛盾两条规则 |
scripts/segment_media.py |
查时长音轨、按秒切片;画面核查:--calibrate 校准阈值、--scene 翻页抽帧(模板换页)、--pages 差分换页(同模板换页,必跑)、--page-map 逐秒归页(抽帧验收用)、--page-offset 取帧后移、--scan 等间隔兜底、--frames 定点、--crop 裁切放大 |