short-drama-edit · diff
git:20260910.5915f95 to git:20260911.795cb80
27 added, 29 removed. Audit A to A.
---
name: short-drama-edit
- description: 把已经生产出来的逐镜素材按分镜装配成短剧成片:定每镜入出点、镜序、台词完整性、字幕、响度与交付规格,写成 `剧集/<EP>/剪辑单.md` 并渲染出成片。用户说“把这些镜头剪成片”“做成片/装配/套剪”“定入出点”“加字幕”“统一响度”“成片太长/太碎”“导出可继续精修的工程”时使用;不生成新素材,不改剧本、分镜或视频提示词的语义。
+ description: 将已生成的短剧镜头剪成成片,记录入出点、镜序、声音、字幕与交付规格。用于套剪、加字幕、统一响度、调整节奏或导出精修素材;需要补素材或修改故事时转回对应创作阶段。
license: MIT
---
# 短剧剪辑与成片
把 `剧集/<EP>/制作成果/` 里的逐镜素材装配成一条成片,取舍写进 `剧集/<EP>/剪辑单.md`。
每段使用二级标题 `## CUT-...`,各自绑定一个 `MOTION-...` 和一个真实媒体文件。
- 本阶段是套件里唯一同时看得见**成片**和**创作意图**的位置。上游每一份文档描述的都是「这一镜
- 应该是什么」;只有到这里,才第一次能回答「生成出来的这一段,哪一部分真的能用」。这两件事经常
- 不一致,而处理这个不一致正是剪辑的工作,不是缺陷。
+ 根据实际素材选择可用片段,按剧本与分镜核对叙事。素材与意图不一致时,记录取舍和缺口。
## Quick Start
```text
用 $short-drama-edit 把 EP001 已生产的镜头剪成成片
```
## 入口
进入条件是**素材已经存在且可读**:`剧集/<EP>/制作成果/` 里有本次要用的视频文件。
提示词写完、job 确认过、adapter 返回成功,都不等于素材可用;本阶段只认当前能打开的文件字节。
- 素材不全时不要等齐。已有素材能构成一段连续可看的内容就可以先剪,把缺口写进「未采用镜头」并
- 说明它缺的是文件还是质量。剪一版看得见的东西,比拿着完整清单空等更能暴露上游问题。
+ 素材不全时可以先剪已有连续段落;用户要求完整成片时,将这一版标为片段并列出缺口。
+ 在「未采用镜头」说明缺文件、质量不可用或叙事取舍。
`剧集/<EP>/分镜.md` 与 `视频提示词.md` 是镜序和职责的来源。剪辑可以**取舍**它们,不能**改写**
它们:删一镜、缩一镜、换顺序都属于本阶段;改台词、改镜头职责、改起终状态要回上游发修订请求。
+ 内置渲染直接拼接编码后的分段,输入素材的画幅与帧率须一致。`check` 在可探测媒体时核对;
+ 不同规格先通过外部工具按交付要求统一,保留构图并记录裁切或留边,再更新剪辑单的路径与时间。
+
渲染与测量需要 `ffmpeg` / `ffprobe` 在 PATH 上。没有时 `edit_tool.py` 直接失败并说明,
不用别的手段近似,也不把「没测」写成「通过」。
## 工作流
1. **逐段看完整素材,先标可用带,再谈剪辑。** 每个文件从头到尾看一遍,写下它实际能用的时间
区间,以及区间之外发生了什么(起势静止、结尾漂移、发白、动作回弹、多余的重复表演)。
这一步的产出是事实,不是决定。做法见 [生成素材的可用带](references/generated-footage.md)。
- 2. **有台词的镜先按发声定边界。** 台词完整性优先于画面取舍:先确定这句话从哪一帧开始出声、
- 哪一帧收尾,再在这个约束内选画面入出点。切在字中间是结构缺陷,不是节奏选择。
- 3. **在可用带内选叙事入出点。** 入点取动作已经在进行中的那一帧,出点取信息完成之后、缺陷
+ 2. **有台词的镜先定位发声区间。** 保留完整字音和所需停顿。内置工具同步切画面与声音;
+ 需要在连续对白上换画面时,使用外部剪辑工具分开处理。
+ 3. **在可用区间内选叙事入出点。** 按动作、反应或停顿的需要选择入点,出点取信息完成之后、缺陷
开始之前。逐段写清入点理由和出点理由。做法见 [入出点与镜序](references/cut-craft.md)。
- 4. **排镜序并检查相邻关系。** 相邻两段不同时具备同景别、同机位、同运动方向;重复承担同一
- 信息的段落删掉一段,而不是两段各留一半。
- 5. **对一遍相邻段的画面。** 逐镜生成的素材会漂移:同一个人、同一张桌子的两条,
- 回来可能差一档曝光、半步白平衡。差得看得出来时,在那一段写一行 `画面`。
+ 4. **排镜序并检查相邻关系。** 检查动作、空间、揭示与声音是否连贯;重复信息没有新增作用时再删。
+ 5. **比较相邻段的画面。** 按同场景、同光态比较可比区域;有可见偏差时在对应段写 `画面`。
做法见 [接镜与色彩一致性](references/generated-footage.md#接镜与色彩一致性)。
- 6. **处理声音接缝与响度。** 逐镜生成的素材各自带着自己的环境声或音乐,直接拼接会在每个剪辑
- 点留下音床硬切。做法见 [声音、字幕与音乐](references/sound-and-subtitles.md)。
+ 6. **处理声音接缝与响度。** 拼接后回听;需要混音时通过外部工具执行并记录。
+ 做法见 [声音、字幕与音乐](references/sound-and-subtitles.md)。
7. **写字幕。** 字幕的每一个字都取自 `剧本.md` 的台词原文,不取自转写结果;标点可按字幕惯例调整,
字不能改。转写只用来定位时间。
8. **写出 `剪辑单.md`,再渲染。** 先有文档后有成片:文档是可审查、可修订、可复现的那一份,
成片是它的产物。
9. **按可测项验收成片,再交付。** 见 [交付与验收](references/delivery-verify.md)。
## 剪辑单要求
- 正文开头写交付规格:`成片目标时长`、`画幅与帧率`、`交付响度`、`字幕`。目标时长是意图,
- 实际时长可以不等于它;差多少、为什么,写在末尾报告里,不靠删内容硬凑。
+ 实际时长与目标的差写在报告里。用户明确要求固定时长时,应满足要求或报告缺少的素材。
- 每段一个 `## CUT-<EP>-<序号> · <中文名称>`,块内逐行写:
- `- 来源:<MOTION-...> · <项目相对路径>`——`MOTION-...` 必须是 `视频提示词.md` 里真实存在
的条目,路径必须是当前可读的文件。
- `- 入点:<秒>` / `- 出点:<秒>` / `- 时长:<秒>`——三者必须自洽,`出点 - 入点 == 时长`。
全部用秒,保留两位小数,不写时间码,不写帧号。
- `- 取舍:入点=<理由>;出点=<理由>`——理由写画面上发生了什么,不写「节奏需要」。
- 这一行是本阶段唯一的创作记录;它解释的是为什么丢掉了没被选中的那些帧。
- - `- 声音:<本段声音怎么处理>`——保留原声、压低、静音、交叉淡入、接住音乐落点,逐段说清。
+ 理由应能对应实际素材与本镜叙事需要。
+ - `- 声音:<本段声音怎么处理>`——记录保留原声或外部处理。此行不驱动内置 render 的混音。
- `- 画面:<接镜校正>` 或 `- 画面:无`——只在这一段与相邻段明显对不上时写,
格式是「亮度 <数>」「饱和 <数>」「色温 <数>」三项的任意组合,用 `;` 分隔。
详见 [接镜与色彩一致性](references/generated-footage.md#接镜与色彩一致性)。
- `- 字幕:<逐字台词原文>` 或 `- 字幕:无`。本段有多句台词时改用编号写法,
- 每句自带时间:`- 字幕 1:0.20-1.50 就是什么`、`- 字幕 2:2.30-4.30 就是少了点东西`……
- 编号从 1 连续,时间不得重叠。**一镜不等于一句**——一次三个来回的对话是一个过肩镜头,
- 只写一条字幕会让另外两句在成片上无声地消失。
+ 每句自带时间:`- 字幕 1:0.20-1.50 请进`、`- 字幕 2:2.30-4.30 门没有锁`。
+ 编号从 1 连续,时间相对本 CUT 入点,且不得重叠。
- 素材里没有被采用的镜头,在正文开头写一行 `- 未采用镜头:<MOTION-...>(理由:……)`,
多项用 `;` 连接。理由区分两类:**文件缺失**(还没生产 / 生产失败)和**质量不可用**
- (生成结果不能用)。两者在文档里长得一样,但一个要回生产、一个要回上游改提示词。
+ (生成结果不能用),也可说明叙事取舍。补素材前先判断需要重出还是修订上游。
- 同一个 `MOTION-...` 可以拆成多个 `CUT-...`(同一段素材的两处分别使用),也可以整段不用。
不能凭空出现没有素材来源的 `CUT-...`。
- 一段素材被用两次时,两个 `CUT-...` 的区间不得重叠:同一批帧在成片里出现两次是重复镜头,
不是复用。确需重复出现(闪回、强调)时写明它是有意重复,并说明第二次为什么仍然成立。
## 边界
- **不生成新素材。** 需要补拍、重出、换参考图,回 `$short-drama-produce`;需要改提示词,
回 `$short-drama-video-prompts` 或 `$short-drama-image-prompts`。
- **不改上游语义。** 剪辑单可以让某句台词不出现在成片里(整镜未采用),不能改这句台词是什么。
发现剧本层面的问题就点名报告,交回 `$short-drama-write`。
- - **不做解说旁白。** 短剧成片靠人物对白和画面推进,不加第三人称叙述音轨。需要解说式成片是
- 另一种产品形态,不在本套件的目标里。
+ - **沿用剧本的声音设计。** 保留已有对白、VO 和 OS,不自行增加解说;需要新增叙述时回写作阶段。
- **不把技术成功写成质量结论。** 渲染完成、时长对上、文件存在,都不是「这条片子能看」。
成片质量的判断交给 `$short-drama-review`,或交给创作者本人。
- - **不替创作者决定要不要再剪一版。** 报告当前成片的可测事实和仍然存在的取舍选项,让创作者选。
+ - **按已授权目标完成。** 继续修复影响交付的问题;新增创作方向或补素材需求交给创作者决定。
## 命令
命令由 [edit_tool.py](scripts/edit_tool.py) 提供:
```text
python3 <本技能目录>/scripts/edit_tool.py check <剧集/EP001> --project-root <project>
python3 <本技能目录>/scripts/edit_tool.py render <剧集/EP001> --project-root <project> [--no-subtitles] [--subtitles ffmpeg|remotion] [--remotion-concurrency N]
python3 <本技能目录>/scripts/edit_tool.py verify <剧集/EP001> --project-root <project>
```
`check` 只核对不渲染:素材是否比剪辑单新(重出之后字幕时间必须重测)、区间自洽、`MOTION-...` 解析、文件存在、区间不越过素材时长、
同源区间不重叠、字幕文字能在 `剧本.md` 里找到。其中「区间不越过素材时长」需要 `ffprobe`,
没有时这一项报「未测」并说明原因,不静默跳过。`render` 按剪辑单切段、拼接、烧字幕、统一响度,
输出 `剧集/<EP>/制作成果/成片/`。`verify` 只测量已经渲染出来的成片并回报数字,不改文件、
不给质量结论。
- 字幕默认由 ffmpeg 烧录,零依赖,长片也是秒级。`--subtitles remotion` 换成一条排版可调的
+ 字幕默认由带 libass 的 ffmpeg 烧录。`--subtitles remotion` 换成一条排版可调的
路线,代价是装一次 Node 依赖,而且叠层要**逐帧过无头浏览器**渲整部成片——慢且吃内存,
并发默认压在 2(`--remotion-concurrency` 可调,调高前先量本机)。取舍见
[声音、字幕与音乐](references/sound-and-subtitles.md),装法见
[Remotion 字幕叠层](assets/remotion/README.md)。
- `render` 会保留每段切好的中间文件。它们是下一轮微调的输入,也是「这一刀到底切在哪」的证据;
- 不要在报告里用「重新渲染一次就好」代替给出这些文件。
+ `render` 保留切好的中间文件。它只切段、硬拼接、统一字幕样式、接镜校正和整片响度,
+ 不执行 `声音` 行中的混音方案,也不按交付规格自动缩放或改帧率。需要混音、逐镜字幕避让、
+ 转场或画幅转换时用外部工具完成并记录,验收实际交付文件。
## 按需知识
- 默认只读本 SKILL、当前分镜和要用的素材。遇到对应问题时只打开一份:
+ 先读本 SKILL、当前分镜、视频提示词和素材;有字幕时读取剧本原文。按需要打开参考资料:
- 阶段边界与规则分级:[阶段契约](references/stage-contract.md)
- 可用带、生成缺陷与逐镜取舍:[生成素材的可用带](references/generated-footage.md)
- 入出点、镜序与节奏:[入出点与镜序](references/cut-craft.md)
- 声音接缝、字幕与音乐落点:[声音、字幕与音乐](references/sound-and-subtitles.md)
- 成片可测项与验收:[交付与验收](references/delivery-verify.md)
- 剪辑单成稿样例:[剪辑单样例](assets/剪辑单.md)
- 可选的 Remotion 字幕排版:[Remotion 字幕叠层](assets/remotion/README.md)
## 修订
保留未受影响的 `CUT-...` ID。改一段的入出点不触碰其它段;删一段时说明它承担的信息由哪一段
接住,或明确说明这条信息在成片里不再出现。重新渲染前先更新剪辑单,不要让成片领先于文档。
## 完成
每个 `CUT-...` 都绑定真实素材与自洽区间,台词在成片里完整可听,字幕逐字等于剧本原文,
剪辑点没有可听的音床硬切,成片响度落在交付目标上,未采用镜头都写明理由并区分了缺文件与缺质量,
即完成。目标时长与实际时长的差、以及仍然值得再剪一版的地方,写在末尾报告里交给创作者判断。
## 安装维护
只有安装、升级或排障时运行 `python3 scripts/selftest.py`。