ShotLock 分镜一致性校验
这个 skill 解决什么问题
大模型写分镜,单看每一镜都挺像回事,连起来全是洞:第五场女主还是长发,第十七场变成短发;上一镜男主在画面左边,下一镜跑到右边;三秒钟的镜头塞了六十字台词,配音根本念不完。
原因很直接——模型生成每一镜时只看当前这一镜的文本,它不记得二十镜之前角色穿什么、站哪边。让模型写完自己复查没用,它漏掉的东西和它写的时候漏的是同一批。
ShotLock 的解法:先立一份机器可读的实体表(角色、场景),再让每一镜去引用它,最后用脚本验引用有没有漂。 模型负责写内容,脚本负责守住一致性。
包里有什么
本包自包含,无需安装任何第三方库:
| 目录 | 内容 |
|---|---|
shotlock/ |
校验引擎(schema 规范 + 15 条规则 + 报告 + 命令行) |
examples/ |
正反两份样例:good_deck.json(合规)、bad_deck.json(故意埋 15 处违规) |
references/ |
SHOT_SPEC.md(字段规范)、RULES.md(规则清单与阈值依据) |
工作流(按顺序,别跳步)
第一步:先建实体表,不要先写镜头
先把 characters 和 scenes 写完整,再动 shots。
角色表每个角色必须写清外貌的三个维度:发长、发色、服装色。这三个是出图和剪辑时最容易串的,也是校验器唯一能比对的部分。写"漂亮""气质冷淡"这种词没有用,脚本读不出来。
场景表写清 location、time_of_day、lighting、int_ext。
第二步:逐镜头生成 JSON
每个镜头必须带的字段见 references/SHOT_SPEC.md。三个容易漏但很关键的:
characters[].screen_dir:角色在画面的 left / center / right。没有这个字段越轴检测跑不了,靠自然语言描述推断左右是不可靠的。对话镜头务必填。duration_sec:单位秒,不用帧。continuity_override:只有当本镜的时间或光线确实偏离场景表时才填(比如一场戏从黄昏演到深夜)。不要用这个字段掩盖生成时的漂移,填了就会触发 SL005 校验。
第三步:跑校验
在包根目录执行:
python -m shotlock examples/good_deck.json
退出码 0 通过,1 存在达到拦截级别的问题,2 输入错误,3 内部错误。
其他用法:
python -m shotlock deck.json --html report.html # 自包含 HTML 报告,可打印存 PDF
python -m shotlock deck.json --json result.json # 结构化结果
python -m shotlock deck.json --fail-on P1 # 有严重项也返回非零
python -m shotlock deck.json --only SL003,SL008 # 只跑指定规则
python -m shotlock deck.json --skip SL015 # 跳过某条规则
第四步:按报告修
报告按 P0 / P1 / P2 分级:
- P0 阻断:数据结构或物理上不成立。不修完不许进下一环节,不许"先记着后面再说"。
- P1 严重:发布前必修,观众能看出来。
- P2 建议:影响观感,按风格取舍。
修的时候改的是镜头 JSON,不是改校验规则。如果你发现自己在想"这条规则是不是太严了",先确认是不是剧本真的有问题——多数时候是。
第五步:复验
改完再跑一次,直到 P0 为 0。这个循环通常要跑两到三轮,正常。
硬性数值约束(这些直接对应规则,写的时候心里有数)
| 约束 | 取值 | 对应规则 |
|---|---|---|
| 单镜头时长 | 1.5s ~ 25s | SL002 |
| 中文语速 | 2.2 ~ 7.5 字/秒 | SL003 |
| 单条字幕宽度 | 不超过 18 字 | SL013 |
| 集总时长偏差 | 不超过目标的 15% | SL009 |
| 连续同景别 | 不超过 4 个(且平均时长不超过 3.5s) | SL011 |
| 连续叠化 | 不超过 2 个 | SL010 |
十五条规则速览
- P0 阻断:SL001 结构完整性、SL002 镜头时长边界、SL003 台词语速、SL006 角色注册、SL007 场景注册
- P1 严重:SL004 角色外貌漂移、SL005 场景连续性、SL008 越轴检测、SL009 总时长预算、SL010 转场合法性
- P2 建议:SL011 景别节奏、SL012 情绪单调、SL013 字幕长度、SL014 物件闪现、SL015 建置镜头
完整表格和每个阈值的依据见 references/RULES.md。
常见失败模式
一镜塞一大段台词。 最常见的崩法。六十字的台词至少要八秒,短剧里八秒静止特写是灾难。拆成两三镜,中间插听者的 reaction。
对话正反打忘了记左右。 生成第二镜时模型不知道第一镜谁在左边。只要 screen_dir 跟着写就不会错,怕的是根本没写这个字段——那样校验器也救不了你。
长剧本中途角色外貌漂。 二十场以后发色变了。角色表是唯一事实来源,镜头里如果确实要改(比如剪了头发),改角色表并让后续镜头都跟着新定义走,不要在单个镜头里临时写一句。
生成完直接交付,不跑校验。 这份 JSON 存在的意义就是让脚本能验它。不跑等于没写。
配套
上游生产环节(剧本改编、分镜生成)可用墨金格(mojinge.cloud),本工具负责下游校验,两者互补。