| name | video-story-clip-lite |
| description | 电影/影视剧剧情短视频剪辑(开源精简版)。把完整电影剪成多条短视频素材 (抖音/快手/短剧切片)。典型场景:用户提供原片+字幕(SRT),要求剪出 8-15 条、每条 50-75 秒的剧情短视频。SEGMENTS 由 AI 生成写入 JSON 配置, cut_clips.py 读取配置执行无损切割。这是开源精简版,覆盖"字幕分析 + 片段 规划 + 无损切割 + 验证"基础流程;无字幕段视觉验证、样片风格学习闭环 (analyze_sample)在完整版中。 |
电影剧情短视频剪辑(开源精简版 V0.2)
概述
将完整电影剪辑成多条短视频。SEGMENTS(每条视频选哪些片段、怎么写旁白)由 AI 生成,写入 JSON 配置文件;cut_clips.py 读取配置执行切割。
剪辑风格由 references/style_guide.md 定义——AI 生成 SEGMENTS 时参照该文件。
分工边界
| 职责 | 由谁负责 |
|---|
| 分析字幕、规划片段(SEGMENTS) | AI(参照 style_guide.md) |
| 执行切割、导出视频 | cut_clips.py(读取 JSON 配置) |
| 旁白花字文案 | AI(写入 JSON 的 narrations 字段) |
| 比例转换、字幕、背景音乐、后期 | 用户(在剪映处理) |
skill 只输出原片规格的视频片段 + 对应关系 txt 文件。
工作流程
第 0 步:准备配置文件
从 assets/movie_config_template.json 复制模板,填入电影基本信息(movie_name / src / out_dir / ffmpeg / ffprobe),segments 留空。
询问片头/片尾区间(推荐):主动询问用户是否提供片头/片尾区间(如"片头到 3 分钟、片尾从 1 小时 57 分开始")。用户提供则所有 clips 强制限定在 [片头结束秒, 片尾开始秒] 区间内;未提供则用演职员表标志检测(字幕出现连续人名=片尾起点)。
第 1 步:获取原片信息
ffprobe -v error -show_entries stream=codec_name,width,height,r_frame_rate,bit_rate -of default=nw=1 "原片路径"
ffprobe -v error -show_entries format=duration,bit_rate -of default=nw=1 "原片路径"
第 2 步:分析字幕
- 解析 SRT,建立时间↔剧情索引
- 用 Grep 搜索关键词定位剧情节点
- (可选)搜索公开剧情资料补充全局脉络
时间戳换算强约束(禁止手算):所有"字幕时间 HH:MM:SS ↔ 秒"的换算必须用脚本/工具完成,禁止手算。手算 mm:ss→秒极易错位(实战教训:01:24:18 被误算为 4485s,实际应为 5058s,差 1000 秒导致片段切错)。换算公式验证:秒 = HH*3600 + MM*60 + SS,写入 SEGMENTS 前逐条核算一次。
场景定位验证强约束(提到≠发生):定位剧情节点时,"台词提到某事件" ≠ "该事件的画面"。必须验证该台词是处于事件场景内(场景内对话),还是场景外(事后回忆/他人提及)。实战教训:搜"断腿"匹配到追车戏里"断腿之前你是好警察"(画面是追车不是断腿)、搜"合作"匹配到警方逼供。定位后必须读该台词前后 60 秒的字幕确认场景连续性,必要时抽帧验证。
对白推敲强约束(反复确认,理解后再剪):定位每段素材前,完整读该场景的连续对白(不是只读一句关键词),确认三件事:①谁在说②说的是不是这个场景本身③场景前后文。关键阶段对白若无法完全确认,必须抽帧验证画面再定时间戳。
第 3 步:无字幕段扫描
python scripts/find_gaps.py "字幕.srt" --threshold 20 --start 300 --end 原片总秒数-300
找出无字幕段后,用字幕上下文判断是过场(删)还是关键剧情(保留但剪短/让用户确认)。强约束:
- 凡 ≥20 秒的无字幕段,必须让用户确认内容后才能决定保留与否,不得仅凭字幕推断直接进入 SEGMENTS
- 任何"无对白但计划剪进成片"的片段(不管有无字幕间隔)也必须让用户确认画面内容后再决定保留
- 片头片尾(标题、演职员表、片尾歌)直接跳过,不抽帧、不进方案,除非用户特别要求。
- 用户提供片头/片尾区间时优先使用(第 0 步询问),所有 clips 强制限定在
[片头结束秒, 片尾开始秒] 区间内
- 无用户提供时用演职员表标志检测(字幕出现连续人名=片尾起点)
- 生成 SEGMENTS 后逐条核对每条 clips 的结束时间 < 片尾起点,跨过片尾起点的碎片必须删除
- 实战教训:方案声称"片尾已跳过"却把 clips 结束时间设在片尾起点之后,剪进约 49s 演职员表
视觉验证(抽帧+多模态判定)在完整版中,精简版靠字幕上下文 + 用户确认。
第 4 步:AI 生成 SEGMENTS
第 4 步前置:先输出"剧情时间线场景清单"——正式写 SEGMENTS 前,基于字幕分析先列出 10-15 个场景:[时间戳、场景内容、画面依据]。清单需体现对剧情时间线的真实理解(含倒叙/插叙)。默认展示给用户确认后再写 SEGMENTS;若用户明确表示不需要确认(如"不用确认直接剪"),跳过确认环节直接生成。禁止跳过此步直接凭关键词找片段(用来防"提到≠发生")。
AI 根据字幕分析结果 + references/style_guide.md 的规则,将 SEGMENTS 写入第 0 步的 JSON 配置文件 segments 字段。
格式见 assets/movie_config_template.json:每条含 num / title(网感副标题)/ clips(原片起止秒列表,可跨时间)/ narrations(旁白文案列表)。
时长硬约束(强制,生成后必须自检):
- 每条视频总时长以 50-75s 为硬约束,先列碎片,再核算总时长,不达标必须调整后再写入配置
- 时长预算(强制):每条先定总时长预算(如 60s),再按预算分配各碎片(如 30+20+10),禁止先乱选碎片再算总账(3 个 30s 碎片相加必超 75s)
- 不足 50s:沿该条主题扩展相关片段(前因/后果/相关反应/关键台词 callback)凑满,禁止硬塞无关画面
- 超过 75s:砍掉最弱的碎片(关联度最低/重复/过场段),压到 75s 内
碎片结构强约束(强制,防止偷懒):
- 每条视频必须由 3-7 个碎片拼接(快剪串烧风:核心长段 + 短闪段 + callback),碎片应来自不同时间段
- 禁止整条单段连续(除极端情况且必须在方案
_note 中说明理由);生成后自检:若 >30% 的条是单段,说明偷懒了,必须重做
- 禁止"每条只放一个关键词定位的 60s 段"——这是糊弄。每条必须有 hook + 主体 + callback
- 碎片数暂定为 3-7(用户 2026-08-13 决定)
- 实战教训:《拆弹专家2》12 条全部单段连续(无碎片拼接),严重违反风格,被判糊弄返工
全局时间戳互斥检查(强制):生成后逐条核对所有条之间的 clips 时间戳不得重叠/重复引用。同一物理场景尽量只服务一条主题(实战教训:《拆弹专家2》第 2/3 条在病房场景交叉重叠 15s×2)。
命名约束:副标题/文件名禁止包含 Windows 非法字符:/ \ : * ? " < > |(实战教训:副标题"70/30"中的 / 被当作路径分隔符,输出目录被拆断)。可用"比""和"等替代。
交付前强制自检(6 项,全部通过才交付):
- 条间时间戳互斥:无重叠 / 无重复引用同一场景
- 无片头片尾:每条 clips 结束时间 < 片尾起点
- 每条 3-7 碎片:无整条单段(除 _note 说明)
- 每条总时长 50-75s:按预算核算
- 命名合法:副标题无 Windows 非法字符
- 提到≠发生抽查:抽查 2-3 条,主题与画面匹配(读完整场景对白验证)
第 5 步:执行切割
python scripts/cut_clips.py --config 电影名.json
python scripts/cut_clips.py --config 电影名.json --reencode
python scripts/cut_clips.py --config 电影名.json --no-merge
拼接方案:碎片 → TS(h264_mp4toannexb)→ concat protocol → mp4(全程 -c copy,100% 无损)。临时 TS 自动清理,碎片文件保留。
第 6 步:验证
python scripts/verify_clips.py "输出目录"
关键技术约束
- 中文路径编码:ffmpeg 在 Git Bash 下按 GBK 解析会报错。必须用 Python subprocess 调用 ffmpeg。脚本开头加
sys.stdout.reconfigure(encoding="utf-8")。
- 默认拼接、碎片保留:每条视频的碎片拼接为一个完整 mp4(与目录同名),碎片文件同时保留,用户可按需使用。
- 只输出原片规格:不做分辨率转换、不加背景音乐、不加字幕。
参考文档
| 文件 | 用途 |
|---|
references/style_guide.md | 基础剪辑风格规则(AI 生成 SEGMENTS 必读) |
references/requirements.md | 需求规范(分工边界、输出格式) |
assets/movie_config_template.json | JSON 配置模板 |
scripts/cut_clips.py | 核心:读 JSON 配置执行切割 |
scripts/find_gaps.py | 无字幕段扫描 |
scripts/verify_clips.py | 输出验证 |
常见问题
Q: 时长为什么比设计的长?
A: -c copy 只能在关键帧切割,每段偏长 5-17 秒。可接受就用,不可接受用 --reencode。
Q: 无字幕段怎么处理?
A: 精简版用 find_gaps.py 找出,靠前后字幕上下文判断,关键剧情段让用户确认。完整版提供抽帧 + 多模态视觉判定(DELETE/KEEP-SHORT/KEEP-FULL)。
Q: 怎么让 AI 剪得像我想要的风格?
A: 精简版遵循 style_guide.md 的基础规则。完整版提供"样片学习闭环"——分析你的最终样片,自动提炼你的风格参数写回风格指南。