Communitygithub.com

视频脚本高精度逆向工程

当用户提供视频文件(mp4/mov/m4a 等)并要求将其逆向还原为书面脚本时使用——视频脚本拆解、逐帧拉片、带货脚本还原、短剧/口播/剧情视频转脚本、“阅读即观看”式还原。生成带时间戳的 Markdown 脚本,包含每行对话、声音质感(音高/音量/语速/气息)、面部表情轨迹、具名眼神目标、动作细节,以及双重转录交叉校验以修正说话人和代词误归。

视频脚本高精度逆向工程 是什麼?

该技能旨在将动态视频高精度逆向还原为静态文字脚本,让读者无需观看视频就能“看见”视频内容。它支持所有主流视频格式(mp4/mov/m4a 等),适用于带货脚本、短剧、口播、剧情视频等多种场景。核心流程包括:音频转录(提取带时间戳的对话)、逐帧抽帧与分析、字幕网格建立(逐秒台词基准表)、场景分段、五维填充(声音质感、表情变化轨迹、眼神交互、动作细节、神态气场),以及双重转录交叉校验,确保说话人归属、代词和动作方向的准确性。技能通过严格的校验链(ASR 转录、分片重转录、逐秒字幕基准表、口型帧裁决)来修正错误,最终输出结构化的 Markdown 脚本,附带角色档案、语气神态总表、带货方法论和表演提示单,并提供一键提取脚本工具和详细参考文档。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ZHIXIAO-XJY/video-script-reverse-engineering/tree/HEAD

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

视频脚本高精度逆向工程 是做什麼的?

把一段动态视频还原成一份可复刻拍摄的静态文字脚本。核心判据:读者不看视频也能"看见"它——说什么、怎么说、脸上怎么变、眼睛在看谁、为什么这么说。

何时调用

  • 用户给出视频文件并要求"拆脚本 / 还原脚本 / 逐帧分析 / 拉片 / 转成文字脚本 / 这个视频怎么拍的"
  • 需要从参考视频里提取带货话术结构(痛点→共鸣→实证→报价→行动指令)
  • 需要给演员/编导一份表演提示单(语气、表情变化、眼神落点)
  • 需要从对标视频反推分镜与剪辑节奏

不适用:纯字幕提取(用 ASR 即可)、视频剪辑本身、音乐扒谱。

铁律(先记这五条)

  1. 台词零清洗:保留"呃 / 哎 / 嗯 / 呀 / 嘘 / 哦 / 哼",它们是真实感与人物分配的关键证据,不得美化删改。
  2. 眼神必须具名:写"【A】的眼神投向【B的具体身份/部位】+ 停留时长",禁止"看向对方""深情对视"这类模糊表述。
  3. 表情要写"变化轨迹":按 [起] → [中] → [末] 分阶段推进(例:瞪圆 → 瞳孔放大 → 眉舒展抿唇),禁止只写一个静态形容词。
  4. 语气要写"声音质感":音高、音量、语速、气息(气声/破音/抽气)、重音落点、停顿长度——五项至少写三项。
  5. 说话人必须过校验链:ASR diarization 一定会错 → 分片重转录比对(P6)→ 逐秒字幕基准表(P3.5)→ 口型帧裁决。四层证据全过,才允许写【说话人】。

执行流程(P0–P7)

P0 素材探针

ffprobe -v error -show_entries format=duration,size:stream=codec_type,codec_name,width,height,r_frame_rate \
  -of default=noprint_wrappers=1 "<video>"

据此决定抽样密度(见下表),并确认音轨是否存在(无音轨则跳过 P1,改用画面推断)。

时长抽帧策略帧数上限说明
≤2 min1 帧/2s + 关键段 1 帧/秒60–80短视频/广告,细节全要
2–10 min1 帧/5s60–100剧情短片
10–30 min1 帧/10s + 钩子段加密80–120短剧/长口播,首尾各 90s 需 1 帧/3s
>30 min1 帧/20s + 分段抽样100–150只做章节级还原,先出大纲再深挖

成本守则:单次任务 ViewImage 总调用控制在 60 次以内,每批 8 张并行;帧数不够时优先保"表情转折点、产品特写、道具特写、字幕卡"。

P1 音频全量转录

ffmpeg -y -v error -i "<video>" -vn -ac 1 -ar 16000 -b:a 96k audio.mp3

用 AudioTranscribe(支持 mp3/wav/m4a/mp4 等,≤1GB 或 5 小时)转录。产出带 [起,止,说话人ID] 的时间戳文本——它是后续所有时间轴的骨架。

注意:返回的说话人 ID 只是聚类编号,不等于角色,必须由语义+语气+画面共同判定。

P2 抽帧

# 先试场景切换检测(转场多的视频用这个)
ffmpeg -y -v error -i "<video>" -vf "select='gt(scene,0.15)',showinfo" -vsync vfr -q:v 3 kf_%03d.jpg 2> scene_log.txt
grep -o "pts_time:[0-9.]*" scene_log.txt | head -100
  • 命中 <10 帧 → 说明是单机位连续拍摄(口播/剧情),改用均匀抽帧:-vf "fps=1/10,scale=576:-1"
  • 阈值可下调至 0.08 再试一次;仍无转场就放弃场景检测
  • 竖屏短视频统一 scale=576:-1,够看清表情又不浪费 token

P3 批量看帧

每批 8 张并行 ViewImage,统一 query 模板(保证可比性):

描述这一竖屏视频帧:人物外貌、表情、动作、场景、服装、字幕文字、构图

读帧要点:

  • 人物关系方向(谁拽谁、谁追谁、谁被带走、谁上了哪辆车)必须靠帧确认——ASR 永远不会告诉你这些;两个同性成年人同场景时,聚类 ID 不可直接当角色
  • 字幕文字是免费的高价值信息(剧名水印、品牌名、产品字幕、价格字幕、免责声明、台词人名)——逐帧抄下来;字幕里出现的人名(如「顾川别墨迹了」)配合画面里"谁被拽着",就是台词归属的铁证
  • 注意常驻元素(水印、免责字幕、logo),这些写进文档头部
  • 记住每帧对应的秒数(kf_001 = 0s,kf_002 = 10s……),后面写场景描述要用

P3.5 全片字幕网格:建立逐秒台词基准表(说话人归属的第一证据)

有烧录字幕的视频(短剧/带货片几乎都有),先把**台词的"官方答案"**拿到手:

# 每秒 1 帧裁出字幕条(先抽 1 帧全图确认字幕纵向位置,本例 y=710 高 140)
ffmpeg -y -v error -i "<video>" -vf "fps=1,crop=576:140:0:710,drawtext=fontfile='<font>':text='%{pts\:hms}':x=8:y=6:fontsize=24:fontcolor=white:box=1:[email protected],tile=3x10" -q:v 3 sub/grid%02d.jpg
  • 30 帧/图 → 14 分钟片约 29 张,逐张 ViewImage 读出「时间戳→字幕文字」
  • 蓝边/白边字幕通常是旁白转场字幕(如「两人被迫分别」),单独归类,不混入台词
  • 两行字幕会被裁切丢上半行——存疑时回看该秒全帧

这张逐秒基准表能一次性解决四类问题:漏句、多句、文本错字(他/她)、语气词归属——ASR 与字幕冲突时,先信字幕文本、再用口型帧裁决说话人(字幕不标注谁说的)。

P4 建骨架:把台词流切成场景段

  1. 以 ASR 时间戳为轴,按场景/空间变化切段(换景、换对手、换情绪基调)
  2. 每段命名格式:⏱️ [mm:ss - mm:ss] 事件名(功能标注),例:[04:15 - 05:10] 护理台上的试探·润唇膏首次登场
  3. 段首写 > 场景描述:(光线、构图、主要物体位置、人物站位)
  4. 段内台词按时间先后逐行排列,多人重叠时分行并标注"(此处与X同时发声)"

P5 五维填充(每句台词下挂五个标签)

标签必写内容
🎙️ 声音质感音高走向 / 音量 / 语速 / 气息(气声·破音·抽气·叹气)/ 重音落在哪个词 / 停顿几秒
😐 表情变化轨迹[起]→[中]→[末] 三段,写到眉、眼、嘴、鼻翼、下颌的具体动作
👀 眼神交互【主语】的眼神投向【宾语具名】,停留时长;视线移动要写路径
🙌 动作细节手部姿态、身体朝向、移动轨迹、道具互动(指节发白/攥紧/指尖发抖这类微动作优先)
🫧 神态气场一句话定性这个人此刻的心理状态(导演视角,不是复述表情)

语气词要单独成句分析:一声"哼"要写清是鼻腔气音还是喉音、是冷笑还是认输、与下一句的间隔——这决定了它是谁的台词。

P6 二轮交叉校验(本技能的核心价值,不可跳过)

问题:整片一次性转录会把相邻两人的话合并成一段,把他/她写成同一个字,把问句写成陈述句。

做法:挑出 4–6 个"高危段"切片重转录,与整片稿逐句比对。

高危段特征(命中任一即切片):

  • 一段里出现 ≥2 个角色的对话(尤其 whisper 段、吵架段、群众场面)
  • 同一场景出现两位同性成年人(音色相近,聚类极易合并成一个 ID)
  • 出现"他/她"且指代可能混淆
  • 出现叠句、抢话、同时发声
  • 出现语气词孤立成句(哼/哦/哎/啊)
  • 离别、拉扯、追赶、送站场面("谁被带走、谁在追"极易写反)
  • 时间戳跨度 >20 秒且说话人 ID 未变(说明被合并了)
# 切 70–90 秒片段(避开静音边界,前后各留 1s 余量)
ffmpeg -y -v error -ss 15 -t 75 -i "<video>" -vn -ac 1 -ar 16000 -b:a 96k seg1.mp3

对每片跑一次 AudioTranscribe,然后按下表判定:

差异类型判定方法处理
说话人颠倒看分片里发声位置是否交替(A/B/A/B);再结合画面口型与剧情因果以交替规律 + 剧情逻辑为准,正文加 📌 校订说明
他/她混淆同音字必错,按被指对象的真实性别改写直接改,不保留原字
漏句(整片稿缺失)分片稿出现的句子在正文找不到补回,同步调整段内时间轴
合并句需拆分一句话里主谓不一致("你快走别墨迹了我等着")按语义拆成 2–3 行,各归其人
问句/陈述句误判看尾音上挑与否、有无"?"语义控诉句用"!",追问句才用"?"
画外音 vs 出声分片里是否与前后同一发声位置连续、有无音轨切换连续同位置=出声低语,须标注"对方未听清"而非"内心独白"
动作方向颠倒看帧:谁的手拽着谁、谁上了哪辆车、字幕称呼喊的是谁全段反转重写,正文加 📌 校订说明 并附帧证据

三轮画面复核:涉及动作方向、人物关系(谁被带走/谁在追/谁拽谁)的结论,二轮的纯文字比对不足以定案——必须回到密集抽帧(1 帧/秒)核对画面,并用后文回指台词(如"15年前你把我拉走")反推互锁。真实案例见 references/pitfalls.md #9。

四轮字幕基准表复核:交付前用 P3.5 的逐秒字幕基准表与脚本逐条对齐——凡是脚本台词与字幕文本不符、或字幕上有而脚本没有的句子,逐条修正/补录;归属存疑的点抽全帧看口型定案(抽帧时刻=字幕出现秒数)。两个特殊规则:

  • 闪回原声会溢出:闪回画面结束后,原声可能延续到现实镜头上(例:现实镜头里母亲闭唇,字幕却显示童年的"嘘")——归属跟音轨走,不跟画面走;
  • 字幕的"她"未必是女:原片字幕常有他/她混用,按语义与后文回指判定真实指代,但引用原字幕时要保留原文并注明。

校验记录要写进交付物(表格:时间点 / 原稿 / 校验后 / 判定依据 + 重合度 + 遗留不确定项)——这是脚本可信度的凭证。

P7 交付与自检

产出单个 Markdown 文件,结构见 references/script-template.md;交付前逐条过 references/qc-checklist.md。

最后用 present_files 呈现,并在回复里给出:视频识别结论(剧名/品类/时长)、核心剧情一句话、带货结构、本次校验修正了几处。

脚本工具

scripts/extract_assets.sh 一键完成 探针→音频→场景检测→均匀抽帧→高危段切片:

bash scripts/extract_assets.sh "<video>" "<outdir>" [帧间隔秒数]
# 例:bash scripts/extract_assets.sh ./v.mp4 ./frames 10

脚本输出 probe.txt、audio.mp3、kf_*.jpg(含序号↔秒数对照)、scene_log.txt,并把帧数/时长打印成一张工作量表。

参考文件

  • references/script-template.md — 交付物完整骨架(角色档案 / 语气神态总表 / 分段五维 / 带货方法论 / 表演提示单 / 校验记录)
  • references/qc-checklist.md — 16 项交付前自检清单
  • references/pitfalls.md — 10 类高频错误与对策(含真实案例)

输出约定

  • 时间格式统一 mm:ss(超 1 小时用 hh:mm:ss),段落标题里写区间,台词块内可标单点秒数
  • 角色名统一:首次出现写全名,正文用【】包裹,例 【顾母】
  • 同一角色不同身份(化名/童年/成年)必须分开建档,并在档案里写清对应关系
  • 产品名、品牌名、价格必须逐帧核对字幕(ASR 常把品牌名听错,例:"胡萝问素"→"胡萝卜素")

相關技能