2.2 分镜 schema


2.2 分镜 schema

本节摘要:本节做分镜段:把剧本 JSON 切成镜头施工图。先逐字段拆解分镜 schema 的七个字段——镜头号、场景号、时长、画面描述、台词、运镜、转场,每个字段说清「谁写它、谁读它」:镜头号与时长是剪辑段的排期依据,画面描述与运镜是生成段的提示词原料,台词是音轨与字幕段的输入,转场是剪辑段的指令。然后写剧本到分镜的转换提示:一场戏切成几镜由信息量决定,时长按场预算分配,转换提示词要把「一景一镜还是一景多镜」的裁量规则交给模型并给出镜头号编码规则。最后过三道校验关:镜头号连续性、时长总和达标、台词归属不散失——1.2 节的校验函数在这里补全为完整版本。

学习目标

  • 说出分镜七个字段各自的写者与读者,解释字段为什么这样分工。
  • 写出剧本到分镜的转换提示词,含镜头数裁量规则与时长预算。
  • 实现镜头号连续、时长总和、台词归属三道校验。
  • 完成一场戏从剧本到分镜的完整走查。

一、七个字段:谁写它、谁读它

字段 谁写 谁读 职责边界
shot_id 镜头号 分镜段 全流水线 定位键:文件命名、修改定位、状态跟踪都靠它
scene_id 场景号 继承自剧本 分镜段、迭代流程 归组键:改一场不改全片的依据
duration 时长 分镜段 生成、剪辑段 排期与预算:时长总和须对齐目标片长
visual 画面描述 分镜段 生成段 提示词原料:写得「看得见」,不写情绪
line 台词 继承自剧本 音轨、字幕段 一镜至多一句;空串表示无台词镜头
camera 运镜 分镜段 生成段 镜头语言指令:推拉摇移跟(第 3.2 节展开)
transition 转场 分镜段 剪辑段 与下一镜的衔接方式:切、叠化、黑场等

镜头号编码沿用 1.2 节的约定:场号乘一百加序号,101 与 102 同属第一场。这个编码把「归组」免费送给了下游——不需要查表就能从镜头号看出场次归属。

二、剧本到分镜:转换提示

转换不是逐场翻译,是一次「再创作受限翻译」:模型要决定一场戏切几镜、每镜多长、运镜怎么配。裁量规则必须写进提示词,否则模型会给出「每场一刀切两镜」的懒惰答案。

# storyboard_prompt.py —— 剧本到分镜的转换提示(写法示意) PROMPT = """你是分镜师。把下面的剧本切成镜头,规则: 1. 一场戏切成 1 到 4 镜:动作单一则 1 镜,动作有起承则多镜; 2. 镜头号 = 场景号 * 100 + 镜内序号(如第 1 场第 2 镜为 102); 3. 时长:全场预算 {budget} 秒,按信息量分配,单镜 2 到 6 秒; 4. visual 用具体画面描述,不写情绪词;camera 从推/拉/摇/移/跟/固定里选; 5. 剧本台词原样保留到所属镜头的 line,一句台词只放一个镜头; 6. transition 是与下一镜的衔接:切/叠化/黑场。 剧本: {script_json} 只输出 JSON:{{"shots": [{{"shot_id": int, "scene_id": int, "duration": float, "visual": str, "line": str, "camera": str, "transition": str}}]}}""" def build_prompt(script): budget = round(script["target_duration"] / max(len(script["scenes"]), 1), 1) return PROMPT.format(budget=budget, script_json=__import__("json").dumps(script, ensure_ascii=False)) ​

最后那行 __import__("json") 是行内导入的写法示意——工程代码里请正常地在文件头 import json。时长预算按「目标片长除以场数」下发给每场(示意口径),模型在预算内分配;台词原样保留的要求很关键:分镜段没有改台词的权限,改了就会在音轨与字幕段造成两个版本。

三、三道校验关

1.2 节的校验函数补全为三关完整版:

# validate_storyboard_full.py —— 分镜三道校验:编号、时长、归属 import json def validate(path, script_path): with open(path, encoding="utf-8") as f: board = json.load(f) with open(script_path, encoding="utf-8") as f: script = json.load(f) problems = [] ids = [s["shot_id"] for s in board["shots"]] for i in range(1, len(ids)): if ids[i] <= ids[i - 1]: problems.append("镜头号未递增:%s 后出现 %s" % (ids[i - 1], ids[i])) total = sum(s["duration"] for s in board["shots"]) target = script["target_duration"] if abs(total - target) > 1.5: problems.append("总时长 %.1f 秒偏离目标 %.1f 秒" % (total, target)) board_lines = [s["line"] for s in board["shots"] if s["line"]] script_lines = [line for scene in script["scenes"] for line in scene["lines"]] if sorted(board_lines) != sorted(script_lines): problems.append("台词在转换中散失或被改写,请对照剧本逐句核对") return problems ​

第三关用「两边台词多重集合相等」做散失检查——分镜段只许搬运台词,不许创作台词。运镜与转场的词表校验(camera 必须在六选一里)建议也加上,词表外的一次手工豁免比静默放行安全。

四、示例走查:《修表匠》第一场

输入是 2.1 节剧本的第一场(傍晚,老修表匠端详停摆的怀表,台词一句)。转换产出两镜:

# storyboard_walkthrough.py —— 第一场的分镜产出示意(storyboard.v1.json 节选) shots_of_scene_1 = [ { "shot_id": 101, "scene_id": 1, "duration": 4.0, "visual": "钟表铺内景,台灯暖光下,老人双手捧着怀表端详", "line": "这块表,四十年没停过。", "camera": "缓推", "transition": "切", }, { "shot_id": 102, "scene_id": 1, "duration": 2.5, "visual": "特写:怀表表盘,秒针纹丝不动", "line": "", "camera": "固定", "transition": "叠化", }, ] ​

走查三关:101 到 102 递增,过关;本场合计 6.5 秒,若全片四场预算 60 秒则本场占位合理(全场总和的检查在最后一场转换完后做),过关;台词一句不少地落在 101,过关。人工再看一眼:102 用叠化接下一场深夜,暗示时间流逝——这种「镜头语言表达叙事」的判断正是 2.3 节人审节点要做的事。

本节要点回顾

  • 七字段各有写者与读者:镜头号是定位键、画面描述与运镜喂生成段、台词归音轨字幕、转场归剪辑。
  • 转换提示必须含裁量规则:切镜数、镜头号编码、时长预算、台词原样保留。
  • 三道校验关:编号递增、总时长达标、台词无散失;词表校验建议同步加上。
  • 走查示例显示人工看的重点从「对不对」转向「好不好」——这正是人审的分工。

施工图有了,但施工图注定要改——下一节回答改哪里、怎么改、谁拍板。

作者与出处
原作者:灏天文库
整理人: 灏天文库整理
本站整理收录,版权归原作者/开源协议所有;欢迎通过原文链接访问源仓库。
发布者: 作者: 灏天文库 转发
评论区 (0)
U