视频字幕 → 英语听力练习 Word
端到端方案:流式读字幕(不落盘)→ 出题 → 排版成 Word。
- 提取细节与踩坑 →
references/streaming-extract.md - 出题规范与排版 →
references/quiz-design.md - 兄弟技能
video-subtitle-extract:只做字幕提取(含 ASR 兜底、软字幕抽轨),需要更深的提取知识时参考
五步流水线
第 1 步:探流判型(永远先做,别上来就跑 OCR/ASR)
ffmpeg -i "视频地址" 2>&1 | grep -iE "Stream|Duration"
| 结果 | 类型 | 路线 |
|---|---|---|
有 Subtitle: 流 |
软字幕 | --soft 直接抽,零误差,别用 OCR |
| 只有 Video + Audio | 无字幕轨 | 抽帧看画面有无烧录字幕 → 有则 OCR,无则 ASR |
第 2 步:流式提取字幕(不落盘)
# Python:换成你环境里已装好依赖(numpy / rapidocr-onnxruntime / python-docx)的那个解释器
PY="python"
SK="$HOME/.workbuddy/skills/subtitle-to-listening-quiz/scripts"
# 硬字幕 OCR(自动定位字幕带)
HF_HUB_DISABLE_SYMLINKS=1 "$PY" "$SK/stream_subtitle.py" "视频地址" \
--referer https://www.xiaohongshu.com/ --name xxx -o out/
# 软字幕轨
"$PY" "$SK/stream_subtitle.py" video.mp4 --soft -o out/
# 已知裁剪区(跳过自动定位,更快)
"$PY" "$SK/stream_subtitle.py" video.mp4 --crop 720:290:0:670 -o out/
产出 out/sentences.json(后续出题的数据源)+ 4 种字幕文件。视频全程不落盘。
小红书短链要先解析出真实 mp4 地址(og:video 元标签),用 Playwright 接管已开的浏览器:
browser = await p.chromium.connect_over_cdp("http://127.0.0.1:9222")
第 3 步:清洗句子(LLM 必做,脚本不修)
读 sentences.json,逐句通读并修复:
- 英文空格丢失 —— OCR 常整行识别成
wewanttoadd、thefirst,按语义补空格; - 明显错字(
new boxes→new stuff); - 剔除残留噪声;
- 把修好的结果写回
sentences.json(后续 SRT/附录都用它)。
> 这一步不能省。空格未修的英文直接进题目会误导学习者。
第 4 步:撰写 quiz.json
通读全文后按模板写题。结构见 scripts/example_quiz.json。
{
"title": "...", "subtitle": "...", "meta": "音源/时长/口音/字幕来源",
"instructions": ["先盲听 2 遍…", "答案区带时间码可回听核对"],
"sections": [
{"name": "Section A 选择题(3 题 × 2 分 = 6 分)", "type": "choice",
"note": "从 A/B/C/D 中选出…",
"questions": [{"q": "...", "options": ["A. ...", "B. ..."],
"answer": "B", "locate": "00:13–00:22", "explain": "..."}]}
],
"total": "满分:18 分",
"study_blocks": [{"title": "① 缩略与弱读", "items": ["..."]},
{"title": "③ 足球术语", "table": {"headers": [...], "rows": [[...]]}}],
"notes": [{"title": "文化背景补充", "text": "..."}],
"appendix": {"sentences_file": "sentences.json"}
}
type 取值:choice / tf / blank / short / dictation。
出题红线(详见 quiz-design.md):
- 每题必须有 locate 时间码;
- 判断题 T/F 各至少一题;
- 挖空只挖实词,不挖 the/of/and;
- 不确定的专名(OCR 可能错)不当考点。
第 5 步:生成 Word
"$PY" "$SK/make_listening_quiz.py" quiz.json -o "XX_英语听力练习_含答案解析.docx"
# 若已有文档,只想追加「分页符 + 中英对照字幕」附录
"$PY" "$SK/make_listening_quiz.py" --append-only \
--docx 已有文档.docx --sentences out/sentences.json
文档结构:封面 → 使用说明 → 题目 → [分页] 语音难点/术语表 → [分页] 参考答案 → [分页] 中英对照字幕附录。
交付后
- 默认清理下载的视频/抽帧,只留字幕与练习文档(用户通常明确要求"处理完删掉视频");
- 展示时把 docx 放在
present_files首位。
环境
pip install numpy rapidocr-onnxruntime python-docx playwright
ffmpeg 必需。Windows 下两处必设:
HF_HUB_DISABLE_SYMLINKS=1(否则 HF 模型下载报WinError 1314)- 若 pip 装出 cp313 轮子而 venv 是 3.11 →
pip install --force-reinstall --no-cache-dir "numpy<2.3" lxml