口播还原师
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_49271746/video-subtitle-restore
技能介绍
要解决什么问题
短视频口播素材常常遇到一个尴尬:字幕不是独立字幕轨,而是直接烧录在画面里,视频也没有可用的 ASR 结果。想拿完整台词做分镜脚本,只能"看画面读字"。更麻烦的是,本地 ASR 模型权重往往被墙——HF、hf-mirror、ModelScope 全都不通;在线 ASR 要么成本高,要么识别不准。这时候需要的就不是语音转写,而是把画面里的字幕逐帧读出来再拼回去。
它是怎么工作的
核心原则只有一条:密集读帧,不是关键帧。只抽 3 张关键帧会丢掉大量中间口播,必须按时间轴均匀抽帧,逐帧读字幕后按时间序拼接,才能还原完整脚本。
具体分四步:
- 密集抽帧 + 拼网格 — 运行
scripts/extract_frames.py,输入单个视频文件或含视频的目录。默认每 2 秒抽 1 帧(可用--max-frames 600控制总量),每 12 帧拼成一张 4 列 × 3 行的网格图,帧号水印标在左上角,输出到_grid/grid_01.png等 ASCII 目录,避开中文路径坑。 - 多模态逐帧读字幕 — 把
grid_*.png批量交给多模态能力,逐张读出每张图里 12 帧的字幕文本和对应的画面动作。 - 按时间序拼接 — 把各网格图的字幕按帧号顺序拼成完整口播,自然衔接成一条连贯脚本。
- 回填分镜表(可选) — 按母本结构补镜头、字幕、钩子、利益点,形成可分镜拍摄的脚本。
适用边界与注意点
- 抽帧间隔要权衡:
--every-sec默认 2 秒,字幕停留短或语速快的素材需要调小;但帧数上限--max-frames 600决定了长视频的还原完整度,硬截断会丢尾部台词。 - 不要一次性塞几百张图:主线程读大量图会触发 400 上限。先拼网格把图数压缩约 12 倍,再用多个 Agent 并行各读一批网格图。
- 中文路径:
cv2.VideoCapture在 Windows 读中文路径经常静默失败,脚本已做兜底——打不开时自动复制到临时 ASCII 名再读。 - 帧率推断:
CAP_PROP_FPS偶尔返回 0,脚本会回退到默认 25fps。 - 依赖 OpenCV,建议在 managed Python venv 内安装,避免污染系统环境。
使用场景
- 拿到烧录字幕的口播视频,本地 ASR 权重被墙无法转写,需要逐帧读画面字幕还原完整台词。
- 竞品口播视频字幕烧在画面里,需要提取每句台词整理成可改编的脚本,在线 ASR 又不准。
- 视频后期要把口播台词回填到分镜表,镜头、字幕、钩子、利益点逐项对应,手动抄写容易漏句。
适合人员
- 短视频口播创作者,录完视频需要快速拿到完整台词做剪辑或二次创作,不想重听手动打字。
- 内容运营或编辑,经常提取竞品或素材视频的口播文案做选题分析或改编,素材字幕全是烧录的。
- 视频字幕组或本地化人员,需要把烧录字幕的口播视频转为可编辑的脚本文本,没有独立字幕轨。