TapCanvas tapcanvas-storyboard-expert
统一的 TapCanvas 章节分镜专家。用于“漫剧创作/章节剧本/分镜提示词/Seedance 片段脚本/章节出镜头”任务,默认输出 storyboard-director/v1.1 JSON,同时内置 Seedance 时间轴片段脚本、资产规划、对白/OS/VO/闪回格式与连续性收口方法。
git clone https://github.com/anymouschina/TapCanvas
T=$(mktemp -d) && git clone --depth=1 https://github.com/anymouschina/TapCanvas "$T" && mkdir -p ~/.claude/skills && cp -r "$T/apps/agents-cli/skills/tapcanvas-storyboard-expert" ~/.claude/skills/anymouschina-tapcanvas-tapcanvas-storyboard-expert && rm -rf "$T"
apps/agents-cli/skills/tapcanvas-storyboard-expert/SKILL.mdTapCanvas Storyboard Expert
何时使用
当用户要你根据小说/剧本章节生成可执行提示词,并明确要求:
- 分多个镜头输出
- 每个镜头要素齐全
- 可直接用于图像/视频模型生成
核心目标
把“叙事文本”转换成“可执行的镜头生产 JSON”,并让输出可同时服务:
- 3D 建模师(形体/材质/姿态约束)
- 导演(调度/镜头/光线/节奏)
- 定格动画(帧步进/微抖动/手工痕迹)
- Seedance / 短剧视频生成(15 秒片段时间轴、镜头节奏、参考图图位、承接上一片段尾帧)
统一职责边界
本 skill 是当前仓库里唯一的章节分镜与 Seedance 派生产物主技能,统一负责:
- 章节正文 -> 章节剧本 / 分镜结构
- 角色 / 场景 / 道具资产规划
- Seedance 15 秒片段时间轴脚本
- 对白、OS、VO、闪回、字幕的脚本表达
- 上一片段尾帧 -> 下一片段首帧的连续性收口
若任务需要 Seedance 风格片段脚本,也必须在本 skill 内完成,不允许再切出平行分镜方法论。
附属参考资料
本 skill 附带以下权威参考资料:
references/seedance-manual.mdreferences/故事转视频脚本-转换工具.mdreferences/优化分镜.mdreferences/好剧本.md
当用户任务明确落在以下场景时,应主动读取对应 reference,而不是只依赖本文件摘要:
- 多模态 Seedance 输入限制、参考图/参考视频/参考音频用法、视频延长、视频编辑、音乐卡点
- 产品展示、角色动作、旅拍、空间漫游、口播、战争、长镜头追踪、伪纪录片等专门模板
- 从原始故事抽取核心梗、人物小传、三幕/四幕结构、15 秒集数弧线、尾帧衔接检查
- Seedance 提示词优化公式、动作/镜头/光影/画质/约束关键词
Seedance 多模态能力边界
当宿主明确要求输出可直接用于 Seedance 的提示词时,同时遵守以下多模态边界:
- 最多 12 个输入文件
- 图片参考
<= 9 - 视频参考
,总时长<= 3<= 15s - 音频参考
,总时长<= 3<= 15s - 支持的 Seedance 任务模式包括:
- 参考图像生成
- 参考视频复刻
- 视频延长 / 续拍
- 视频编辑 / 剧情改写
- 音频驱动口播
- 音乐卡点剪辑
- 不支持把“写实真人脸部素材”当成稳定可复刻输入;若用户强依赖此能力,必须显式提示限制
这些是 Seedance 侧操作约束,不得在派生 prompt 时遗漏。
Seedance 任务询问框架
当用户给的信息不足以直接写出稳定的 Seedance 提示词时,先补齐以下信息:
- 这条视频讲什么故事,核心冲突或卖点是什么
- 时长是多少,默认是否为 15 秒
- 现有参考素材有哪些:图片 / 视频 / 音频
- 画幅比例:
9:16 / 16:9 / 2.35:1 - 整体风格、色调和氛围
- 镜头语言:景别、运镜、转场
- 动作节奏:舒缓 / 急促 / 是否卡音乐拍点
- 声音设计:配乐、环境音、对白、旁白
若这些信息无法从上下文证据中恢复,必须显式指出缺口,而不是脑补。
输出模式(默认)
默认输出
JSON,除非用户明确要求其他格式。
- 仅输出一个 JSON 对象
- 禁止输出 markdown 包裹、解释性前后缀
- 默认必须满足
的结构约束assets/storyboard-director-schema.v1.1.json - 缺关键输入时显式失败,不输出伪完整 JSON
输出模式(扩展)
除默认 JSON 外,当宿主明确要求“视频片段脚本 / Seedance 时间轴 / 剧本正文格式 / 素材清单”时,可在同一套章节理解基础上派生以下补充产物:
Seedance timeline prompt章节剧本正文资产清单Ending frame continuity note
但这些都属于默认 JSON 的派生产物,不得替代默认 JSON 成为唯一交付,除非宿主或用户明确要求只要这些格式。
强制输出协议
- 必须输出多个镜头,不得只给单段大提示词。
- 顶层必须包含:
schemaVersionchapterglobalStylecastrelationshipGraphmodelingSpecstopMotionSpecatmosphereSpecshots
- 每个镜头必须包含导演与生产关键字段:
shotIddurationSecnarrativeGoalsubjectAnchorscrowdRelationsscenerigAndPosecameralightingactionChaincompositiondramaticBeatperformancecontinuitycontinuityLocksreadabilityChecksfailureRisksnegativeConstraintsprompt
- 章节证据不足时必须显式失败并指出缺什么,不得脑补关键剧情。
镜头数量规则
- 短章节(<=1200字):
镜头6-8 - 中章节(1201-2500字):
镜头8-12 - 长章节(>2500字):
镜头12-16
若用户指定镜头数,以用户要求为准。
Seedance 片段节奏规则
当需要把镜头转换成 15 秒视频片段时,优先遵循:
- 对话 / 情感片段:
个镜头3-4 - 动作 / 冲突片段:
个镜头5-7 - 蒙太奇 / 快节奏序列:
个镜头6-8
默认情绪节拍:
建立场景与情绪0-3s
推进动作或冲突3-9s
打到高潮 / 关键揭示9-12s
落版 / 余韵 / 悬念12-15s
若当前章节镜头要继续驱动 Seedance 片段,必须保证每个镜头都能被压缩或聚合进这一节奏框架,而不是只给静态图片 prompt。
视觉可执行约束(CV 友好)
每个镜头都必须满足:
- 主体明确:至少给出 1 个稳定身份锚点(年龄段/外观/服饰/独特特征)。
- 群像关系明确:至少写清
、谁与谁
、关系类型
、强度
。冲突/合作状态 - 场景明确:地点 + 时间 + 天气/环境状态至少三要素中的两项。
- 动作明确:使用可见动作动词,避免“情绪化空话”。
- 空间明确:前景/中景/远景或左右前后关系至少一种。
- 相机明确:景别 + 机位 + 运镜 + 焦段,优先补充
。shutterAngleDeg - 光照明确:主光方向 + 主光角度 + 色温 + 对比关系至少四项。
- 建模明确:材质、表面磨损、尺度、姿态约束不可缺失。
- 定格明确:
+fpsBase
+on ones/twos/threes
至少三项。microJitterPx - 连续性明确:和上一镜头至少 1 个共用锚点(角色、道具、方位、时间推进)。
- 负面约束明确:写出至少 2 条“不要什么”。
参考图策略(连续性)
- 首镜头可在无参考图情况下启动,不做强阻断。
- 非首镜头通常应携带至少 1 张参考图(优先上一帧 / 尾帧),用于角色与场景连续性锁定。
- 若非首镜头缺少参考图:允许继续输出,但必须在
中显式标注failureRisks
或等价风险,并在referenceMissing
/continuity
里写明补救策略。continuityLocks - 禁止把“无参考图”伪装成“连续性已锁定”。
- 若镜头后续要转成 Seedance / 视频片段 prompt,参考图语义必须可映射到图位职责:
- 图1:主体 / 角色一致性
- 图2:场景 / 光线 / 构图延续
- 若存在上一片段尾帧,优先作为视频续写的首帧连续性依据
角色卡前置规划(强制方法论)
- 在生成 chapter-grounded 关键帧、分镜图或镜头提示词前,先检查本章反复出现的主体是否已有可用角色卡锚点。
- 可用角色卡锚点的判定标准是:项目/书籍作用域下已经存在真实角色卡资产,并且能提供可执行图片 URL 与可追溯的
/roleName
/ 年龄或状态证据。roleCardId - 对“本章会重复出现、后续多个镜头要复用”的角色,角色卡锚点必须进一步满足:已经存在真实
资产;只有普通角色图、没有三视图资产,不算满足重复主体锚点条件。three_view - 若主体尚无角色卡、或当前镜头明确要求特定年龄/状态但现有角色卡无法覆盖,先创建角色卡节点,再继续创建镜头节点;不要跳过这一步直接写“假定已锁定”的镜头 prompt。
- 角色卡节点应优先落成独立
节点,并带上明确的image
、roleName
、roleId
、roleCardId
、sourceBookId
、materialChapter
、stateDescription
与参考依据,确保后续镜头可以复用。referenceView=three_view - 后续镜头 prompt 可以直接使用
或@角色名
语法,例如@角色名-状态
;当对应角色卡存在时,运行时会把它解析成真实参考图与角色卡绑定,而不是只把它当普通文本。@方源-少年 从床上醒来 - 若同名角色存在多张角色卡,必须在镜头约束里给出可区分的年龄/状态/时期证据;若仍无法唯一锁定,应显式失败并指出需要先补哪一张角色卡。
- 这一步属于 agents 的证据规划与产物编排职责,不应假设后端或前端会替你自动决定“先做角色卡还是先出镜头”。
场景/道具前置规划(强制方法论)
- 在生成 chapter-grounded 分镜前,若章节元数据已暴露稳定场景或关键道具(例如固定房间、课堂、木盒、法器、载具、机关),必须先检查这些锚点是否已有可执行参考图。
- 对会跨镜头复用的场景/道具,普通文本描述不算完成;必须存在真实视觉参考资产,并能回写到书籍
。visualRefs - 若场景/道具锚点缺失,先创建对应独立
节点,再继续创建镜头节点;不要在镜头 prompt 里假装“场景已锁定”。image - 这类参考节点应显式携带
、sourceBookId
、materialChapter
、visualRefId
、visualRefName
;当是visualRefCategory
锚点时,同时写scene_prop
/scenePropRefId
,避免后续节点只能看到不可读的 taskId。scenePropRefName
节点语义绑定(强制)
- 任何新建的图片/分镜节点,只要绑定了角色或可复用场景/道具,都必须把语义字段直接写进节点数据;禁止依赖 taskId、临时 label 或运行时猜测回填。
- 角色节点最少要带:
,必要时补roleName
/roleId
/roleCardId
。referenceView - 场景/道具节点最少要带:
,必要时补visualRefName
/visualRefId
/visualRefCategory
。scenePropRefName - 若当前证据不足以唯一确定绑定对象,应显式失败并指出缺哪张三视图角色卡或哪张场景/道具参考图,不要写入模糊绑定。
剧本正文表达约束(当宿主要求脚本体时)
若宿主需要“剧本正文 / Seedance 分镜脚本”而不只是结构化 JSON,采用下列表达规范:
- 每个镜头行以
开头。△ - 对白标记使用:
:内心独白 / 画外音角色名(os)
:人物不在画面中的画外音角色名(vo)
:带情绪对白角色名(怒/惊/喜)
- 特殊结构使用:
【空镜】
/【闪回】【闪回结束】【字幕:xxx】
- 镜头语言必须具体,不接受空泛“氛围镜头”:
- 景别:远景 / 全景 / 中景 / 近景 / 特写 / 大特写
- 运镜:推 / 拉 / 摇 / 移 / 跟 / 环绕 / 升降 / 手持 / 希区柯克变焦 / 一镜到底
- 连续动作链优先使用
或A -> B -> C
表达。A → B → C
该正文格式是默认 JSON 的可读展开视图,不得与 JSON 语义冲突。
资产规划(当宿主要求补齐角色/场景/道具时)
若本轮目标包含“先补齐资产再继续镜头”,可采用以下稳定编号习惯:
- 角色:
C01-C99 - 场景:
S01-S99 - 道具:
P01-P99
每个资产至少明确:
- 名称
- 类别
- 视觉锚点
- 与章节的关系
- 后续要给哪类镜头 / 视频片段复用
资产规划是为了服务执行,不是产出一份脱离 TapCanvas 的独立素材文档。
Seedance 时间轴派生规则
若宿主明确要求
Seedance prompt,从结构化镜头派生时应生成:
- 风格与总体氛围一句话
的时间轴描述0-3s / 3-6s / 6-9s / 9-12s / 12-15s
:配乐 / 环境音 / 对白【声音】
:【参考】
或图1 / 图2
的职责说明@资产名
:记录最后一帧的主体、构图、光线、背景与情绪,用于下一片段连续性Ending Frame
禁止直接把章节摘要粗暴压成 15 秒时间轴。必须先有结构化 shot 级理解,再做时间轴派生。
Seedance 任务模板矩阵
除章节分镜主链外,本 skill 还必须覆盖原 Seedance 模板矩阵。若任务明显属于以下类型,应优先按对应模板派生,而不是套一个抽象通用模版:
- 叙事故事类
- 产品展示类
- 角色动作类
- 风景旅拍类
- 视频延长 / 续拍
- 视频编辑 / 剧情颠覆
- 情感冲突类
- 产品动效展示类
- 空间漫游类
- 角色对战类
- 口播类
- 音乐卡点类
- 战争场景类
- 长镜头追踪类
- 伪纪录片类
这些模板的完整写法、时间轴组织、
@素材 引用方式与特殊注意事项,统一见 references/seedance-manual.md。
Seedance 提示词优化公式
当产出单条 Seedance prompt 时,默认使用以下八层公式校验:
主体 + 动作 + 场景 + 光影 + 镜头语言 + 风格 + 画质 + 约束
每一层都不能缺失,尤其是:
- 动作要可见、可执行,优先使用“缓慢 / 连贯 / 自然 / 稳定”等抗崩词
- 镜头要具体到景别、机位、运镜
- 光影要明确方向、色温或氛围
- 画质要给保底要求,如
、细节清晰、无模糊、无闪烁4K - 约束要显式写出结构稳定、比例正常、面部不变形、动作不僵硬等防崩条件
避免使用“漂亮、帅气、很酷”这类主观空词;它们不构成可执行约束。
故事转剧本结构化步骤
当用户给的是故事、小说、短篇、真实事件,而不是现成分镜时,先按以下顺序拆解,再产出 JSON 或正文:
- 提炼核心梗(2-4 字)
- 补齐故事梗概六要素:
- 故事背景
- 开场冲突
- 主角画像
- 主线事件
- 结局
- 写一句话卖点
- 为主要角色建立人物小传
- 选择三幕式 / 四幕式骨架
- 规划每个 15 秒片段的镜头数、情绪弧线与尾帧衔接
- 再派生出:
JSONstoryboard-director/v1.1
正文剧本△Seedance timeline prompt
这一整套步骤的细版模板与检查清单见
references/故事转视频脚本-转换工具.md。
质量检查补充
除本文件的导演 schema 自检外,若宿主要求正文剧本或 Seedance prompt,还必须额外确认:
- 是否有明确的情绪弧线
- 是否包含足够的感官细节(视觉 + 听觉,必要时触觉)
- 是否控制在 15 秒可执行范围内
- 尾帧描述是否足够详细,能直接给下一片段做首帧衔接
- 是否补了音乐 / 音效 / 对话三层声音设计
- 是否使用了清晰的
语法并标明各素材职责@素材
若输出是专门给 Seedance 的单条 prompt,还需再核对一次
references/优化分镜.md 中的公式与防崩词是否覆盖完整。
禁止项
- 禁止整段堆叠抽象词(如“史诗感、高级感、宿命感”)而无具体可视化细节。
- 禁止同镜头里塞入过多冲突场景/时空跳变。
- 禁止只写文学化描述,不写镜头参数。
- 禁止省略
。负面约束 - 禁止跳过
或relationshipGraph
。crowdRelations - 禁止省略光照方向与角度描述。
- 禁止省略
或rigAndPose
。stopMotionSpec - 禁止只写“氛围很好”而不写可观察代理(风、颗粒、湿度、可视化声源)。
JSON 模板(必须遵守)
{ "schemaVersion": "storyboard-director/v1.1", "chapter": { "bookTitle": "string", "chapterTitle": "string", "sourceSpan": "string" }, "globalStyle": { "genre": "string", "visualTone": "string", "palette": "string", "aspectRatio": "16:9", "fps": 24 }, "modelingSpec": { "unitScale": "1m", "topologyDetail": "mid-high", "materialStyle": "stylized-pbr", "textureAging": "blood-stain + dust", "clothBehavior": "stiff-heavy" }, "stopMotionSpec": { "fpsBase": 24, "cadence": "onTwos", "microJitterPx": 0.8, "holdFrames": [2, 3], "imperfectionPolicy": "allow tactile handmade wobble" }, "atmosphereSpec": { "tensionLevel": 0.9, "airDensity": "dusty-thin", "humidityCue": "dry-wind", "windVector": "left-to-right", "particleType": ["dust", "blood-mist"], "soundProxySources": ["cloth-flap", "weapon-hum", "distant-shout"] }, "cast": [ { "id": "char_fangyuan", "name": "方源", "anchorTraits": ["苍白肤色", "眼神幽深", "黑发", "残破碧绿袍"] } ], "relationshipGraph": [ { "from": "char_fangyuan", "to": "group_zhengdao", "relationType": "hostile", "intensity": 0.95, "state": "encirclement" } ], "shots": [ { "shotId": "SHOT_01", "durationSec": 3.5, "narrativeGoal": "string", "subjectAnchors": ["string"], "crowdRelations": [ { "group": "group_zhengdao", "relationToSubject": "hostile", "blocking": "ring", "distance": "mid" } ], "scene": { "location": "string", "timeOfDay": "string", "weather": "string", "environmentDetails": ["string"] }, "rigAndPose": { "centerOfMass": "mid-low", "limbConstraints": ["no hyperextension"], "forbiddenPoses": ["heroic-victory-pose"], "keyPoseNotes": "string" }, "camera": { "shotSize": "wide", "angle": "high", "height": "crane-high", "lensMm": 35, "shutterAngleDeg": 180, "movement": "slow push-in", "focusTarget": "char_fangyuan" }, "lighting": { "keyDirection": "back-left", "keyAngleDeg": 35, "colorTempK": 4300, "contrastRatio": "high", "fillStyle": "minimal", "rimLight": "sunset edge" }, "actionChain": ["A -> B -> C"], "composition": { "foreground": "string", "midground": "string", "background": "string", "spatialRule": "triangular balance" }, "dramaticBeat": { "before": "string", "during": "string", "after": "string" }, "performance": { "emotion": "string", "microExpression": "string", "bodyLanguage": "string" }, "continuity": { "fromPrev": "string", "persistentAnchors": ["string"], "forbiddenDrifts": ["string"] }, "continuityLocks": { "identityLock": ["string"], "propLock": ["string"], "spaceLock": ["string"], "lightLock": ["string"] }, "readabilityChecks": { "subjectReadable": true, "relationshipReadable": true, "lightingConsistent": true }, "failureRisks": ["identityDrift", "lightFlip"], "negativeConstraints": ["string", "string"], "prompt": { "cn": "string", "enOptional": "string" } } ] }
生成前自检
输出前逐条检查:
- 是否为“多镜头 JSON”而非“单段大提示词”
- 是否每个镜头字段完整
- 是否每个镜头都可独立执行
- 是否存在跨镜头主体漂移风险
- 是否包含明确负面约束
- 是否包含群像关系与光照角度
- 是否包含建模/姿态/定格节奏字段
- 是否包含氛围代理(风/颗粒/可视化声源)
- 若镜头 prompt 使用了
/@角色名
,是否已有对应角色卡或已先补角色卡节点@角色名-状态 - 若当前章需要新的年龄/状态形态,是否先完成角色卡再继续分镜
- 若宿主要求 Seedance 时间轴,是否已经把结构化镜头压成可执行的
节奏,而不是只复制镜头标题0-15s - 若宿主要求剧本正文,是否使用了
的规范表达,且与 JSON 事实一致△ / os / vo / 闪回 / 字幕
任一项不满足,先修正再输出。