lumina-flow-shot-split-scene-as-shot

star 0

flow.story_to_video.shot_split 的派生版本;专门把"场景+若干镜头"紧凑分镜文本转成「1 场景 = 1 shot」的结构化 shot list,场景内多个镜头被压缩为 shot 内部的 `[00:00-00:02]` 时间戳硬剪辑块,直接对接 Seedance 2.0 一次成片多镜的能力。

HUAHUAI23 By HUAHUAI23 schedule Updated 5/31/2026

name: lumina-flow-shot-split-scene-as-shot description: flow.story_to_video.shot_split 的派生版本;专门把"场景+若干镜头"紧凑分镜文本转成「1 场景 = 1 shot」的结构化 shot list,场景内多个镜头被压缩为 shot 内部的 [00:00-00:02] 时间戳硬剪辑块,直接对接 Seedance 2.0 一次成片多镜的能力。

flow.story_to_video.shot_split / scene-as-shot

阶段定位

这是 story_to_video 的结构化编译阶段,与姊妹 lumina-flow-shot-split 并列、互斥使用。

  • 姊妹 skill lumina-flow-shot-split:处理 consult.storyboard 输出的导演级长稿(每镜一个 ### 镜头 NN:标题(约 X 秒) 字段化小节)→ 1 镜头 = 1 shot
  • 本 skill lumina-flow-shot-split-scene-as-shot:处理 consult.storyboard-script-to-shot-prompts 输出的紧凑「场景+镜头」格式 → 1 场景 = 1 shot,场景内多个镜头压缩为 shot 内部的 [00:00-00:02] 时间戳硬剪辑块。

两者输出结构不同,下游消费路径也不同:本 skill 的输出直接对接 Seedance 2.0 一次成片多镜调用(每个 shot 一次 Seedance 调用,shot 内部所有镜头作为 timestamp blocks 一次喂给模型)。

适用场景

  • 输入是紧凑「场景 + 若干镜头」格式:
    • 顶部可选 # 分镜文本 总标题
    • 顶部可选单行 角色锚点:A=...;B=...
    • 顶部可选单行 参考池:@slot=描述;@slot=描述... 块(Universal Reference 12 槽位声明)
    • 场景标题 场景X 名称 X秒场景X 名称 X秒 衔接:类型(token1+token2)(场景间衔接,第二个场景起强烈建议)
    • 场景下若干镜头行 **镜头X X.Xs 时间: ... [景别/运镜]** 描述
    • 镜头描述里可能内联 (@char_main_xxx) / (@scene_xxx) 参考池槽位引用
    • 镜头编号在整篇内连续递增,不在每个场景里重置
    • 镜头行可能内嵌 角色(情绪、动作)"短台词",行尾可选 |避免:无字幕条/无后景人/...(全角 与半角 | 都识别)
    • 镜头行可能跟一行 衔接:类型 模式:xxx 首帧:@xxx 重复:xxx(Tier 2/3 长叙事强烈建议每镜都写)
  • 用户目标是直接走 Seedance 2.0 一次成片路径。

不适用 / 走姊妹 skill

如果输入命中以下任一特征,应该走 lumina-flow-shot-split 而不是本 skill

  • 出现字段化栏目(叙事目标: / 画面叙事: / 动作与调度: / 视线与空间: / 声音: / 参考池引用: / 衔接: 等多行字段)。
  • 出现 ### 镜头 NN:标题(约 X 秒) 三级 heading 形式的镜头小节。
  • 出现 ### 对话块 NN:标题(约 X 秒)
  • 出现 ## 角色锚点 + 多行展开的 manifest 块。
  • 出现 ## 视觉参考池 + 多行展开的槽位列表(图像槽 / 视频槽 / 音频槽分子段)。
  • 出现 ## 连续性账本道具状态机 / 光线连续矩阵 / 声音桥接计划 多字段段。

发现这些特征时,提示用户「输入是导演级长稿格式,应使用 lumina-flow-shot-split 处理」,不要在本 skill 里硬拆。

核心映射规则

顶层结构

来源 目标 备注
顶部 角色锚点:A=...;B=... 单行块 continuity_ledger.character_anchors map 每个角色的视觉锚点字符串原样存
顶部 参考池:@slot=描述;@slot=描述... 单行块 reference_pack[] 全局元数据 每项 {slot, type, purpose, description};type 由 purpose 推断(char_*/scene/lighting/prop/style_palette → image,motion/transition → video,ambient/bgm/voice → audio)
每个 场景X 名称 X秒 1 个 shot shot.title = 场景名称、shot.scene_index = X、shot.declared_duration = X秒
场景标题后追加的 衔接:类型(token1+token2) shot.handoff(仅 transition_type + repeated_tokens 两字段) 第一个场景没有;第二个场景起缺失 flag「场景 N 无场景间衔接,跨场景一致性可能下降」
场景内所有镜头时长之和 shot.duration 与 declared_duration 不一致时以镜头之和为准并 flag
镜头行的 时间: 白天/夜晚 shot.time_of_day 同场景所有镜头必须一致;不一致 flag
镜头描述里内联的 (@char_main_xxx) / (@scene_xxx) 引用 timeline_blocks[i].reference_refs[] 提取 @xxx 槽位 ID;该 shot 级 reference_refs[] 为所有 block 引用的并集去重
镜头行下一行的 衔接:类型 模式:xxx 首帧:@xxx 重复:xxx timeline_blocks[i].handoff(block 内衔接) 写在镜头之间的硬切,按 block 级落字段
场景内所有镜头行尾的 |避免:... shot.negative_constraints[] / 拆条、聚合到 shot 级、去重;全角 与半角 | 都识别

shot 内部时间戳合成(核心)

把场景内每个镜头转成 shot 的 timeline_blocks[] 数组,按累计时间生成时间戳:

镜头1 2.0s [中景/固定] 描述...
镜头2 1.5s [特写/固定] 描述...
镜头3 1.5s [反应镜头/固定] 描述...
镜头4 2.0s [中近景/推镜] 描述...
镜头5 1.0s [插入镜头/固定] 描述...
镜头6 2.0s [中景/跟拍] 描述...
镜头7 2.0s [快切/手持晃动] 描述...

合成为一个 shot 的 timeline_blocks(含 reference_refs 与 handoff 示意):

{
  "duration": 12.0,
  "scene_name": "保安室-玻璃后的微笑",
  "time_of_day": "夜晚",
  "scene_handoff": null,
  "reference_refs": ["@char_main_xiaomei", "@char_main_jiangye", "@scene_baoanshi", "@lighting_baoanshi", "@prop_keycard"],
  "timeline_blocks": [
    {
      "start": "00:00.0", "end": "00:02.0", "framing": "中景", "movement": "固定",
      "description": "保安室(@scene_baoanshi)内冷白色灯管微微闪烁,姜夜(@char_main_jiangye)坐在值班桌后,玻璃窗外隐约映出小美(@char_main_xiaomei)站在门口的身影。",
      "reference_refs": ["@char_main_xiaomei", "@char_main_jiangye", "@scene_baoanshi"]
    },
    {
      "start": "00:02.0", "end": "00:03.5", "framing": "特写", "movement": "固定",
      "description": "玻璃反光遮住姜夜(@char_main_jiangye)半边脸,他嘴角慢慢上扬,露出意味不明的微笑。",
      "dialogue": { "speakerRef": "姜夜", "tone": "玩味、轻声", "text": "\"奖励\"", "kind": "dialogue", "source": "verbatim" },
      "reference_refs": ["@char_main_jiangye"],
      "handoff": { "transition_type": "match_on_action", "seedance_input_mode": "text_to_video", "first_frame_ref": null, "repeated_tokens": ["@char_main_jiangye", "@scene_baoanshi"] }
    },
    {
      "start": "00:03.5", "end": "00:05.0", "framing": "反应镜头", "movement": "固定",
      "description": "玻璃外的小美(@char_main_xiaomei)听见这两个字,笑容更甜,微微歪头,眼神带着得逞的意味。",
      "reference_refs": ["@char_main_xiaomei"],
      "handoff": { "transition_type": "eyeline_match", "seedance_input_mode": "text_to_video", "first_frame_ref": null, "repeated_tokens": ["@char_main_xiaomei"] }
    },
    {
      "start": "00:05.0", "end": "00:07.0", "framing": "中近景", "movement": "推镜",
      "description": "镜头缓缓推向姜夜(@char_main_jiangye),他靠在椅背上嘿嘿一笑,眼神从慵懒变兴奋,伸手按向桌边开门按钮。",
      "dialogue": { "speakerRef": "姜夜", "tone": "兴奋、急切", "text": "\"那还等什么\"", "kind": "dialogue", "source": "verbatim" },
      "reference_refs": ["@char_main_jiangye"]
    },
    {
      "start": "00:07.0", "end": "00:08.0", "framing": "插入镜头", "movement": "固定",
      "description": "姜夜手指按下门禁(@prop_keycard)开关,按钮亮起绿光,保安室门锁发出\"咔哒\"一声轻响。",
      "sfx": ["门禁绿光提示音", "门锁咔哒"],
      "reference_refs": ["@prop_keycard"]
    },
    {
      "start": "00:08.0", "end": "00:10.0", "framing": "中景", "movement": "跟拍",
      "description": "小美(@char_main_xiaomei)推门走进来,脸上还挂着甜腻笑容,身体轻轻前倾。",
      "reference_refs": ["@char_main_xiaomei", "@scene_baoanshi"]
    },
    {
      "start": "00:10.0", "end": "00:12.0", "framing": "快切", "movement": "手持",
      "description": "姜夜(@char_main_jiangye)突然起身,动作带出残影,一只手猛地伸出,瞬间扣住小美(@char_main_xiaomei)的咽喉,将她压制在墙边。",
      "reference_refs": ["@char_main_xiaomei", "@char_main_jiangye"],
      "handoff": { "transition_type": "match_on_action", "seedance_input_mode": "text_to_video", "first_frame_ref": null, "repeated_tokens": ["@char_main_xiaomei", "@char_main_jiangye"] }
    }
  ]
}

时间戳规则:

  • 第一个块从 00:00.0 开始。
  • 后续块的 start = 上一块的 end,无空隙、无重叠。
  • 时间戳用 MM:SS.S0.1s 精度,与源镜头行 X.Xs 时长精度匹配;不要四舍五入到 0.5s 否则累加会 drift),与 Seedance 的 [00:00-00:05] 语法等价。
  • shot.duration = 最后一个块的 end
  • 单 shot duration 必须 ≤ 15s(Seedance 2.0 一次生成硬上限);超出 flag 不擅自截断。

镜头行解析

镜头行格式:

**镜头X X.Xs 时间: 白天。** [景别/运镜] 描述...角色(情绪/语气)"短台词"...|避免:负向约束1/负向约束2

逐字段解析:

  • **镜头X → block.shot_index_in_full(整篇连续编号,跨场景不重置;本 skill 仅记录,不做强消费)
  • X.Xs → block.duration(用于累加生成 start/end,0.1s 精度)
  • 时间: XX。 → 校验与 shot.time_of_day 一致
  • [景别/运镜] → block.framing + block.movement(按 / 拆)
    • 单镜只允许一个主运镜(push-in / pull-out / pan / tilt / tracking / orbit / aerial / handheld / locked-off / 固定),出现 先推近再环绕 flag
    • fast flag 作用域限定在 [景别/运镜] 字段全文 + 描述句里描述运镜的部分(如 相机 fast push-in / fast tracking);剧情/生理 心跳加快 / 他比上次跑得更快 / 台词 "快进来" 不 flag
  • 引号外的描述句 → block.description(保留原貌)
  • 描述句里内联的 (@xxx) 槽位引用 → 提取所有 @<purpose>_<name> 形式 token,去重后存到 block.reference_refs[];该 shot 级 reference_refs[] = 所有 block 引用并集去重
    • 提取的 @xxx 必须能在全局 reference_pack[] 找到;找不到 flag「shot N block M 引用未声明的参考池槽位 @xxx」
  • 引号 + 情绪前缀的台词 → block.dialogue(按 lip-sync 三件套保护规则解析,下面单列)
  • 行尾 |避免:...|避免:...(全角/半角分隔符都识别) → 聚合到 shot.negative_constraints[],按 / 拆条

衔接行解析(block 内衔接,可选)

镜头行下一行如果出现 衔接:类型 模式:xxx 首帧:@xxx 重复:xxx 单行格式,按以下字段映射到该 block 的 handoff:

衔接:match_on_action 模式:image_to_video_first_frame 首帧:@last_frame_of_shot07 重复:@char_main_xiaomei+@scene_baoanshi

落到 timeline_blocks[i].handoff

{
  "transition_type": "match_on_action",
  "seedance_input_mode": "image_to_video_first_frame",
  "first_frame_ref": "@last_frame_of_shot07",
  "repeated_tokens": ["@char_main_xiaomei", "@scene_baoanshi"]
}

校验:

  • transition_type 必须是 hard_cut / match_on_action / eyeline_match / sound_bridge / j_cut / l_cut / graphic_match / concept_cut 之一;非枚举 flag + 回退 hard_cut
  • seedance_input_mode 必须是 text_to_video / image_to_video_first_frame / first_last_frame / ref_pack / nine_panel_grid_i2v / video_extend 之一;非枚举 flag + 回退 text_to_video
  • 模式非 text_to_video首帧: 必填,缺失 flag。
  • 重复: 拆 token 后必须 ≥1 个;空数组 flag「场景 N block M 与上一 block 共享 0 token」。
  • 衔接行缺失时第一个 block 不 flag(场景内首镜默认 hard_cut+text_to_video);同 shot 内后续 block 缺失 flag「block M 缺衔接,回退默认」。

场景标题衔接解析(场景间 handoff)

场景标题行可能带后缀:场景X 名称 X秒 衔接:类型(token1+token2)

例:场景2 保安室-身份反转 13秒 衔接:sound_bridge(@ambient_rain+雨声延续)

落到 shot.scene_handoff(注意是 shot 级,不是 block 级;表达"上一个 shot 整体 → 本 shot 整体"的衔接):

{
  "scene_handoff": {
    "transition_type": "sound_bridge",
    "repeated_tokens": ["@ambient_rain", "雨声延续"]
  }
}

校验:

  • transition_type 同上 8 枚举值;非枚举 flag + 回退 hard_cut
  • 第一个场景没有上一场景,不要求 scene_handoff;第二个场景起缺失 flag「场景 N 无场景间衔接(scene_handoff),跨场景一致性可能下降,建议回 consult.storyboard-script-to-shot-prompts 补」。
  • concept_cut 全片计数 >2 处 flag「全片 concept_cut N 处,叙事可能散架」。

台词解析(lip-sync 三件套保护)

格式:角色(情绪/语气)"短台词"(引号可以是 "..." / 「...」 / 『...』,等价处理)

  • 角色名dialogue.speakerRef
  • 情绪/语气dialogue.tone(原样保留)
  • 引号内文本 → dialogue.text保留引号原样(Seedance 把引号识别为 lip-sync 触发器)
  • dialogue.kind 默认 dialogue
  • 出现 VO / 旁白 / 内心 OS / 画外、画外音 / OS 关键词时切到 voiceover / inner_monologue / offscreen,且这些类型引号可省。
  • dialogue.source:原文逐字 verbatim;为时长容量轻微改写 adaptedlip-sync dialogue 不允许 adapted,超载就 flag);shot_split 自己加的桥句 new_bridge(必须仍满足三件套)。任何 new_bridge 都强制 flag「shot N 新增桥句 new_bridge,未经用户确认」。
  • 说: / 说道: 前导识别:上游 consult 规则禁用 说: 前导(引号才是 lip-sync 触发器),但兼容历史输入。如果镜头里出现 角色(情绪)说:「台词」,按 verbatim 解析(保留引号原样进 dialogue.text),但同时 flag「shot N 出现 说: 前导,建议回 consult.storyboard-script-to-shot-prompts 删除以避免 Seedance 把它当噪声」。
  • 校验:单条 dialogue.text 引号内 ≤ 12 个汉字 / 8 个英文单词;超过 flag。

角色锚点 manifest 消费

紧凑格式只有一行:

角色锚点:小美=粉色泡泡袖针织衫/黑色短裙/黑色短直发齐下颌/右眉骨小痣/银色细项链;姜夜=黑色保安制服/短寸/左耳骨钉/右手腕黑色细绳手链

解析为:

{
  "continuity_ledger": {
    "character_anchors": {
      "小美": "粉色泡泡袖针织衫/黑色短裙/黑色短直发齐下颌/右眉骨小痣/银色细项链",
      "姜夜": "黑色保安制服/短寸/左耳骨钉/右手腕黑色细绳手链"
    }
  }
}

人物引用规则同 lumina-flow-shot-split

  • 项目里有该角色稳定资产 → characterRef 用稳定资产名 + 同时带上 anchor_descriptor
  • 项目里没有 → 用 anchor_descriptor 作为 characterRef 临时占位,让下游 Seedance 拿到一致性 token,并在质量说明里 flag「人物 X 缺项目资产,使用临时锚点占位」。
  • 校验:每个 shot 的所有出场角色都必须在锚点 manifest 里有对应字符串;缺失 flag。

参考池单行 manifest 消费

紧凑格式只有一行:

参考池:@char_main_xiaomei=小美三视图;@char_main_jiangye=姜夜三视图;@scene_baoanshi=保安室主图;@lighting_baoanshi=冷白+红频闪光场;@prop_keycard=门禁卡特写;@ambient_rain=室内雨声 5s loop;@bgm_tension=压力 BGM 8s

解析为:

{
  "reference_pack": [
    { "slot": "@char_main_xiaomei", "type": "image", "purpose": "char_main", "name": "xiaomei", "description": "小美三视图" },
    { "slot": "@char_main_jiangye", "type": "image", "purpose": "char_main", "name": "jiangye", "description": "姜夜三视图" },
    { "slot": "@scene_baoanshi",    "type": "image", "purpose": "scene",     "name": "baoanshi", "description": "保安室主图" },
    { "slot": "@lighting_baoanshi", "type": "image", "purpose": "lighting",  "name": "baoanshi", "description": "冷白+红频闪光场" },
    { "slot": "@prop_keycard",      "type": "image", "purpose": "prop",      "name": "keycard", "description": "门禁卡特写" },
    { "slot": "@ambient_rain",      "type": "audio", "purpose": "ambient",   "name": "rain",    "description": "室内雨声 5s loop" },
    { "slot": "@bgm_tension",       "type": "audio", "purpose": "bgm",       "name": "tension", "description": "压力 BGM 8s" }
  ]
}

typepurpose 推断:

  • char_main / char_outfit / char_face / scene / lighting / prop / style_paletteimage
  • motion / transitionvideo
  • ambient / bgm / voiceaudio

校验:

  • image 槽位 ≤ 9,video ≤ 3,audio ≤ 3;超出 flag「参考池超 Seedance Universal Reference 上限」。
  • purpose 必须是 12 枚举值之一;非枚举 flag「参考池槽位 purpose 非标准」但仍存。
  • 每个镜头描述里出现的 (@xxx) 引用必须能在 reference_pack[] 找到;找不到 flag「shot N 引用未声明的参考池槽位 @xxx」。
  • ≥4 shot 但顶部没参考池单行 manifest 时按现行守恒模式继续,flag「≥4 shot 但缺参考池 manifest,跨镜一致性回退到纯 token 模式,建议回 consult.storyboard-script-to-shot-prompts 顶部补」。

工作方法

  1. 先识别输入格式。命中"场景X 名称 X秒"标题 + "镜头X X.Xs 时间: ... [景别/运镜]" 行 → 进入本 skill 守恒模式;否则提示走姊妹 skill(详见 §不适用 / 走姊妹 skill 的特征列表)。
  2. 解析顶部可选 manifest(最多三段):
    • 角色锚点:A=...;B=... 单行 → continuity_ledger.character_anchors
    • 参考池:@xxx=...;@xxx=... 单行 → reference_pack[](按上面 §参考池单行 manifest 消费规则)
  3. 场景X 切分输入,每个场景独立处理为一个 shot。
  4. 解析场景标题:提取场景编号、场景名称、声明时长;如果带 衔接:类型(token) 后缀,落 shot.scene_handoff
  5. 遍历场景内的镜头行:
    • 累加镜头时长(0.1s 精度)生成时间戳 start / end
    • [景别/运镜]
    • 提取描述、台词、SFX、负向约束(全/半角分隔符都识别)
    • 提取描述里内联的 (@xxx) 槽位引用,校验在 reference_pack 里
    • 校验单镜单主运镜、fast 仅在运镜字段 flag、禁焦距 jargon
    • 解析镜头行下一行的 衔接: 行(如有),落 timeline_blocks[i].handoff
  6. 校验场景级约束:
    • 总时长 = 镜头时长之和;与声明时长不一致 flag
    • 总时长 ≤ 15s(Seedance 上限);超出 flag
    • 总时长 ∈ [12, 15](用户另行指定时除外);不在范围 flag
    • time_of_day 同场景所有镜头一致;不一致 flag
  7. 把场景内出场角色(描述里直接出现的、台词的 speakerRef、被反应镜头观看的)落到 shot.character_refs;按角色锚点占位规则处理资产匹配;同时把出场角色对应的 @char_main_* 槽位落到 shot.reference_refs[](如果参考池里声明过)。
  8. 聚合行尾负向约束到 shot.negative_constraints[],去重。
  9. 第二个场景起校验 shot.scene_handoff 存在性 + 枚举合法性 + token 非空;缺失 flag。
  10. 生成最终 shot list,按场景顺序。
  11. 输出质量说明:列出所有 flag、占位说明、容量警告、上下限警告、衔接缺失警告、参考池槽位引用未声明警告、说: 前导兼容警告。

镜头边界(场景内)

本 skill 不在场景内做镜头拆分 —— 场景内的镜头数和顺序是上游 consult.storyboard-script-to-shot-prompts 的导演决定,shot_split 守恒。

但下面情况要 flag:

  • 单镜时长 > 5s:超过这个值时间戳合成意义不大(一个镜头几乎等于一个 shot),建议回 consult 拆开。
  • 同场景出现两次相同景别相同主运镜的连续镜头(如 [中近景/固定] → [中近景/固定]):可能是导演重复,flag 让用户检查。
  • 场景内镜头编号不连续递增(跳号、重号):原文有错,flag 不擅自补。

场景边界(跨 shot)

  • 场景之间默认是硬切(场景标题本身就是一次 scene boundary)。下游 presenter 决定是否在场景间加 J-Cut/L-Cut/声音桥。
  • 跨场景的人物站位、视线、手中道具不强制连续:场景之间允许跳位(用户写场景就意味着空间/时间可能变化)。
  • 跨场景同名角色在 character_refs 里仍指同一资产/锚点,不要因为场景换了就当成新人物。

时长与颗粒度

「场景」= 1 个 shot = 1 次 Seedance 调用 = 用户口中的「1 个视频」,是镜头之上的聚合单位。

  • 每个场景声明时长 默认 12-15s(贴 Seedance 一次生成硬上限 15s 走,最大化单次产出)。
  • 用户没有显式指定时长时按默认 12-15s 校验;偏离时 flag「场景 X 时长 Y.Ys 偏离默认 12-15s,确认是否用户显式指定了其他时长」。
  • 用户显式指定时长(在用户提示里写如「一个视频建议 8-10s」/「每段 6 秒」/「每场景不超过 10s」/「每场景 12s」)时,按用户值校验,不再用 12-15s flag。
  • Seedance 单次生成硬上限 ≤15s:任何场景声明 > 15s 时 flag「场景 X 时长 Y.Ys 超过 Seedance 一次生成上限 15s」,仍按原文落输出(shot.duration 用镜头之和),不擅自截断
  • 单镜典型时长:环境镜头 1.5-2.5s / 表情特写 1.0-1.5s / 简单插入 0.8-1.2s / 对白行 2.0-3.5s / 突发动作 0.5-1.2s / 反转收口 1.5-2.5s。
  • 不强制场景内时长平均;上游已经按节奏分配。
  • 场景声明时长 vs 镜头之和不一致 → 以镜头之和为 shot.duration,并在质量说明 flag「场景 X 声明 12s 实际镜头之和 11.5s/14.5s」。
用户提示 校验范围
未提及时长 默认 12-15s
「一个视频 8-10 秒」 8-10s
「每段 6 秒」 6s
「每个视频不超过 10s」 ≤10s(按 8-10s 走)
「每场景 12s」 12s

资产引用

  • lumina-flow-shot-split §资产引用规则:只引用项目稳定名称;缺资产时用 anchor_descriptor 占位 + flag。
  • 紧凑格式没有显式道具字段,从镜头描述里抽取明显道具(门禁卡、监控屏、玻璃门、咖啡桌等),仅当项目里有稳定资产时才进 prop_refs;否则保留在 description 里。
  • 场景名本身可能是一个场景资产(如「保安室-玻璃后的微笑」中的"保安室");项目里有对应场景资产 → scene_ref,否则只保留在 shot.scene_name。

下游约束与 meta 字段透传

紧凑格式的字段相对少,但仍有几个必须透传的:

来源 目标 备注
行尾 |避免:... shot.negative_constraints[](聚合到 shot 级、去重) 必须保留,下游 Seedance prompt 会拼到 negative slot
镜头描述里的 SFX 隐含信号(如"咔哒一声"、"灯管闪烁两下") timeline_blocks[i].sfx[] 保留,下游可路由到 Seedance 原生音频 SFX 通道
镜头描述里的明暗交界线/色温信息(如"5600K 冷白荧光顶光"、"明暗交界线沿对角线分割") shot.lighting_geometry 命名光场必须保留
镜头描述里的微表情链(如"先眨一下眼 → 喉结轻动 → 嘴角下压 0.5 秒") timeline_blocks[i].micro_expression_chain(数组) 表情戏的关键信号,原样保留
镜头描述里的眼神锚(如"视线锁定 B 的左眼 1.6s") timeline_blocks[i].gaze_anchor 表情戏的关键信号

禁止改写、合并、压缩这些字段。原文没有就留空,不硬编。

主体前置 (Subject-First) flag

scene-as-shot 不改写原镜头行描述,但要在质量说明里 flag 触发 Seedance 2.0 "人物闪现 / 拍间融合" 反模式的写法。检查每个 block.description 首句:

  • 环境前置:首句以"明亮的 X / 阳光 / 冷光 / 暖光 / 整间 / 一片"等环境短语开头,接"镜头推近到 X / 镜头摇过到 X",flag「场景 X 镜头 N 首句环境前置,Seedance 2.0 易出现人物闪现,建议回 consult.storyboard-script-to-shot-prompts 改为主体前置(先写主体位置 + 动作,再写环境)」。
  • 被动揭示语:出现"揭示出 X / 最终落在 X 身上 / 原来 X 站在 / 突然出现 X / 忽然闪现 X / 画面里多了 X",flag「场景 X 镜头 N 出现被动揭示语,主体可能延迟揭示」。
  • carry-over 角色缺位:上一镜(同场景或前一场景末镜)的同一角色在本镜首句没有显式出现(无位置/状态描述),flag「场景 X 镜头 N carry-over 角色 X 未在首句重提位置/状态」。
  • 新进角色无入画方向:本镜首次出现的角色没写方向/起始位置("从画面左侧入画"),flag「场景 X 镜头 N 新进角色 X 缺入画方向」。

scene-as-shot 不擅自改写 block.description,按原文落输出;只在质量说明里 flag,让用户决定回 consult 层修。

焦距 jargon flag

[景别/运镜] 字段或 block.description 里出现 85mm / f/1.4 / 35mm 焦段 / shallow DOF / focal plane / 浅景深 / 焦距 / 光圈 / 景深 等技术 jargon 时 flag「场景 X 镜头 N 出现焦距 jargon,Seedance 不响应甚至 degrade,建议改 广角空间感 / 自然视角 / 人像压缩感 / 微距质感 + 画面占比」。

质量标准

  • 输入格式判定正确:紧凑格式走本 skill,导演级长稿(多行 ## 角色锚点 / ## 视觉参考池 / 字段化栏目)提示走姊妹 skill,没有混判。
  • 每个场景都被转成一个 shot;场景顺序、场景名称、场景编号一致。
  • shot.duration = 内部镜头时长之和(0.1s 精度,无四舍五入 drift);与声明时长不一致已 flag。
  • 每个 shot.duration ≤ 15s(Seedance 一次生成硬上限);超出已 flag。
  • 每个 shot.duration 落在 默认 12-15s(用户没指定时)或 用户显式指定值(如「一个视频 8-10s」)范围内;偏离已 flag。用户没指定就一律走默认,不擅自改判范围。
  • 每个 shot 的 timeline_blocks 时间戳无空隙、无重叠,从 00:00.0 起,最后一块 end = shot.duration。
  • 每个 timeline_block 单镜只有一个主运镜;出现两个已 flag。
  • fast flag 作用域已限定在 [景别/运镜] 字段全文 + 描述里运镜片段;剧情/生理/台词的 fast 用法没有误 flag。
  • 没有出现焦距/光圈/景深/85mm/f/1.4 这种技术 jargon(Seedance 不响应);出现已 flag。
  • lip-sync 台词(kind=dialogue + 引号):引号保留原样、tone 字段已填、单条 ≤ 12 个汉字 / 8 英文单词、source 不是 adaptednew_bridge 已强 flag;说: 前导已兼容解析 + flag。
  • 角色锚点 manifest 已解析;所有 shot 出场角色都在锚点里能找到;缺项目资产的角色已用 anchor_descriptor 占位 + flag。
  • 参考池单行 manifest 已解析(≥4 shot 时);reference_pack[] 三类槽位上限合规(image ≤9 / video ≤3 / audio ≤3);镜头描述里 (@xxx) 引用都能在 reference_pack 找到,找不到已 flag。
  • 场景间 handoff 已解析:第二个场景起 scene_handoff 存在性 + transition_type 枚举合法性 + repeated_tokens 非空都已校验;缺失已 flag。
  • block 内衔接行已解析(如有):transition_type / seedance_input_mode 枚举合法、非 text_to_video 模式 first_frame_ref 已填、repeated_tokens 非空。
  • concept_cut 全片计数 ≤2 处,超出已 flag。
  • 行尾负向约束已聚合到 shot.negative_constraints[],去重,全/半角分隔符都识别,没有任何条目被丢。
  • 描述里的 SFX、命名光场、微表情链、眼神锚已落到对应字段,没合并、没压缩。
  • shot list 顺序与原分镜场景顺序一致。
  • 输出能直接喂给下游 Seedance 一次成片调用,不需要再猜原意。

失败回退

  • 输入不像紧凑格式时(看到字段化栏目 / ### 镜头 NN: / ### 对话块 NN: / ## 角色锚点 多行块 / ## 视觉参考池 多行块 / ## 连续性账本 多行块),提示「输入是导演级长稿格式,应使用 lumina-flow-shot-split 处理」,不在本 skill 里硬转。
  • 场景声明时长 > 15s 时,flag「场景 X 时长 X.Xs 超过 Seedance 一次生成上限 15s,建议回 consult.storyboard-script-to-shot-prompts 拆成两个场景」,仍按原文落到结构化输出(shot.duration 用镜头之和),不擅自截断。
  • 场景声明时长偏离默认 12-15s 且用户没有显式指定其他时长时(用户没指定就一律走默认),flag「场景 X 时长 Y.Ys 偏离默认 12-15s,可能是上游格式漂移或用户未声明的特殊时长需求」,仍按原文输出。
  • 用户在 prompt 里显式指定了其他时长(如「一个视频 8-10s」)时,按用户值校验,不再用 12-15s 这条 flag。
  • 单镜时长 > 5s 时,flag「场景 X 镜头 N 时长 X.Xs 偏长,时间戳合成意义不大,建议回 consult 拆开或考虑改用姊妹 skill」,仍按原文输出。
  • lip-sync 台词超 12 字时,flag「场景 X 镜头 N 台词超载,建议回 consult 缩短」,不擅自 adapt
  • 顶部缺角色锚点 manifest 时,按现行守恒模式继续处理,flag「缺角色锚点 manifest,跨镜一致性可能下降,建议回 consult.storyboard-script-to-shot-prompts 顶部补」。
  • ≥4 shot 但缺参考池 manifest 时,按现行守恒模式继续,flag「≥4 shot 但缺参考池单行 manifest,跨镜一致性回退到纯 token 模式(适用上限约 6 shot),10+ shot 长叙事强烈建议补」。
  • 第二个场景起缺 scene_handoff 时,flag「场景 N 无场景间衔接(scene_handoff),跨场景一致性可能下降」,按 hard_cut 默认值落输出,不擅自补 token。
  • 镜头行下一行的 衔接: 行解析失败(枚举值非法 / 模式非 text_to_video 但缺首帧 / token 为空)时,按默认值(hard_cut + text_to_video)落输出 + flag,不擅自修复。
  • 镜头编号跳号/重号时,flag「场景 X 镜头编号不连续:1, 2, 4」,按原文顺序处理,不擅自补/改编号。

scene-as-shot 路径的失败模式提示

本 skill 把场景压成单次 Seedance 多镜调用,特有的失败模式(用户应该被提醒):

  • scene 内 drift:单次成片内的中间镜头容易脸飘 / 服装跳 / 场景几何变。比 shot-as-shot(每镜独立调用)更难控制中段一致性。建议:scene 内镜头数 ≤6 + 强参考池 + 强 token 重复。
  • scene 边界硬切:每个 scene 都是一次独立 Seedance 调用,scene 之间天然是硬切。如果剧情上需要 match_on_action / sound_bridge 衔接,必须在 scene_handoff 里声明,并配合下游用 image_to_video_first_frame(首帧 = 上一 scene 末帧)锁连续性。
  • 15s 硬墙不可破:scene 内总时长 > 15s 是 Seedance 单次生成的硬限,不能靠 prompt 工程绕开,只能拆 scene。

用户在 prompt 里碰到这些限制时,本 skill 不擅自修复,按原文落输出 + flag,提示用户回 consult 层决定路径。

Install via CLI
npx skills add https://github.com/HUAHUAI23/lumina-skill --skill lumina-flow-shot-split-scene-as-shot
Repository Details
star Stars 0
call_split Forks 0
navigation Branch main
article Path SKILL.md
More from Creator