video-flow-toon/data/skills/references/storyboard_generation.md
2026-03-26 11:34:56 +08:00

249 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 分镜面板生成(从剧本 + 资产 → storyboard
本指南只做一件事:
根据剧本内容和已有资产,将剧本拆分为一系列分镜,生成结构化的分镜面板。
> **核心概念**:分镜面板是将剧本转化为视觉画面的中间产物。每条分镜对应一个独立的画面/镜头,包含画面描述、镜头语言、台词、音效和关联资产等信息,用于后续图片生成。
## 1. 输入与输出
### 输入
- 剧本文本(字符串),通过 `get_flowData("script")` 获取
- 已有资产列表(数组),通过 `get_flowData("assets")` 获取
### 输出
调用 `set_flowData` 将分镜面板写入工作区:
```ts
set_flowData({
key: "storyboard",
value: [
{
id: 1,
title: "分镜标题",
description: "画面描述",
camera: "镜头语言",
duration: 3,
frameMode: "firstFrame",
prompt: "图片生成提示词",
lines: "台词文本",
sound: "音效描述",
associateAssetsIds: [0, 2]
},
// ...更多分镜
]
})
```
### 字段说明
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | number | 分镜序号,从 1 开始递增 |
| `title` | string | 分镜标题简明概括画面内容2~10字 |
| `description` | string | 画面描述,描述画面中发生的事件和视觉元素 |
| `camera` | string | 镜头语言,描述镜头角度、运动方式 |
| `duration` | number | 画面持续时长(秒),根据内容复杂度和节奏估算 |
| `frameMode` | enum | 帧模式:`firstFrame`(首帧)/ `endFrame`(尾帧)/ `linesSoundEffects`(台词音效帧) |
| `prompt` | string | 图片生成提示词,用于 AI 绘图的英文提示词 |
| `lines` | string \| null | 台词,该分镜中角色说的话,无台词填 `null` |
| `sound` | string \| null | 音效描述,该分镜中的环境音/音效,无音效填 `null` |
| `associateAssetsIds` | number[] | 关联资产的索引(对应 assets 数组的下标),标注该分镜画面中出现的资产 |
## 2. 分镜拆分原则
### 2.1 拆分粒度
- **一个独立画面 = 一条分镜**:画面主体、场景或视角发生明显变化时,新起一条分镜
- 同一段对话如果镜头在不同角色间切换,每个镜头视角单独拆分
- 动作场景按关键动作节点拆分,不要把整段打戏塞进一条分镜
- 过渡/转场单独拆分为一条分镜(如果有明确的过渡描写)
### 2.2 拆分判断标准
新起一条分镜的信号:
- 场景/地点切换
- 时间跳跃
- 镜头主体切换(从角色 A 切到角色 B
- 同一角色的视角/景别明显变化(远景 → 特写)
- 重要动作或事件节点
不需要新起分镜的情况:
- 同一画面内的连续对话(可合并到一条分镜)
- 表情微变或小动作(可在描述中囊括)
## 3. 各字段填写指引
### 3.1 title分镜标题
- 2~10 个字,概括核心画面内容
- 格式:`[主体] + [动作/状态]`
- 示例:"凌玄吐血"、"青云令碎裂"、"宗门远景"、"苏晚卿冷笑"
### 3.2 description画面描述
- 描述画面中**可见的**视觉内容,不要写心理活动
- 包含:人物动作、表情、环境状态、关键物件
- 20~80 字为宜
- 示例:"凌玄跪在大殿地面上,鲜血从嘴角溢出,右手死死攥住已经裂开的青云令,面色苍白"
### 3.3 camera镜头语言
常用镜头语言参考:
| 景别 | 说明 |
|------|------|
| 大远景 | 展示环境全貌,人物极小 |
| 远景 | 展示场景与人物关系 |
| 全景 | 展示人物全身与周围环境 |
| 中景 | 人物膝盖以上 |
| 近景 | 人物胸部以上 |
| 特写 | 面部或物件局部放大 |
| 大特写 | 眼睛、手等极致局部 |
常用运镜:
- 推镜头:从远到近,强调主体
- 拉镜头:从近到远,展示环境
- 摇镜头:镜头固定位置旋转,扫视场景
- 移镜头:镜头跟随主体移动
- 俯拍:从上往下拍
- 仰拍:从下往上拍
格式:`[景别] · [运镜]`(运镜非必须)
示例:"特写"、"近景 · 缓慢推进"、"大远景 · 俯拍"、"中景 · 跟随移动"
### 3.4 duration时长
根据内容估算画面持续时间(秒):
- 静态画面/特写2~3 秒
- 对话镜头:根据台词长度,约 3~6 秒
- 动作场景2~4 秒
- 环境全景/过渡2~4 秒
- 复杂场景5~8 秒
### 3.5 frameMode帧模式
根据分镜内容选择合适的帧模式:
| 模式 | 使用场景 |
|------|----------|
| `firstFrame` | 最常见。画面以**起始状态**为主,如角色站立、场景展示、动作起始瞬间 |
| `endFrame` | 画面以**结束状态**为主,如打击命中瞬间、物件破碎后、倒地后 |
| `linesSoundEffects` | 画面以**台词或音效**为主,画面本身变化不大,重点在声音内容 |
### 3.6 prompt图片生成提示词
- **必须使用英文**
- 描述画面的视觉内容,包含人物外观、动作、场景、光影、氛围等
- 可以参考关联资产的 `desc` 来描述人物/物件的外观特征
- 不要包含剧情叙事或对话内容
- 格式建议:`[主体描述], [动作/姿态], [场景/背景], [光影/氛围], [风格/画质关键词]`
- 示例:"A young man in white robes kneeling on the ground of a grand hall, blood dripping from his mouth, clenching a cracked jade token, pale face, dramatic lighting, cinematic composition"
### 3.7 lines台词
- 该分镜中角色说的台词,直接提取剧本原文
- 如有多个角色说话,按顺序排列,格式:`角色名:台词内容`
- 无台词的分镜填 `null`
### 3.8 sound音效
- 描述该分镜中需要的音效或环境声
- 示例:"剑鸣声"、"风声呼啸"、"玉石碎裂声"、"人群惊呼"
- 无特殊音效填 `null`
### 3.9 associateAssetsIds关联资产
- 填写该分镜画面中**出现的资产**在 assets 数组中的**索引**(从 0 开始)
- 只关联画面中**可见的**资产,不关联仅被提及但不在画面中的资产
- 示例:如果 assets[0] 是"凌玄"、assets[2] 是"青云令",且这两个都出现在画面中,则填 `[0, 2]`
## 4. 示例
### 输入剧本片段
```
苏晚卿冷笑:「还有你当宝贝的青云令」
「若不是我趁你养伤时,偷偷在令牌上动了手脚」
△ 凌玄气血逆流,再次一口鲜血喷出
△ 青云令表面灵纹暗淡,隐约可见细微裂痕
```
### 输入资产
```json
[
{ "assetsId": "char-1", "name": "凌玄", "desc": "男主 · 青云宗宗主 · 白发修长 · 身着白色宗主袍" },
{ "assetsId": "char-2", "name": "苏晚卿", "desc": "女配 · 凌玄未婚妻 · 红衣 · 冷艳" },
{ "assetsId": "item-1", "name": "青云令", "desc": "宗主信物 · 青玉材质 · 灵纹浮刻" }
]
```
### 输出
```ts
set_flowData({
key: "storyboard",
value: [
{
id: 1,
title: "苏晚卿冷笑",
description: "苏晚卿站在大殿中,嘴角勾起冷笑,目光居高临下看着跪在地上的凌玄",
camera: "近景",
duration: 4,
frameMode: "linesSoundEffects",
prompt: "A beautiful woman in red robes standing in a grand hall, cold smirk on her face, looking down at someone, dramatic indoor lighting, cinematic",
lines: "苏晚卿:还有你当宝贝的青云令,若不是我趁你养伤时,偷偷在令牌上动了手脚",
sound: null,
associateAssetsIds: [1]
},
{
id: 2,
title: "凌玄吐血",
description: "凌玄气血逆流,猛然喷出一口鲜血,身体摇摇欲坠",
camera: "中景 · 缓慢推进",
duration: 3,
frameMode: "endFrame",
prompt: "A white_haired young man in white robes kneeling on the floor, spitting blood, trembling body, pale face, dramatic lighting, cinematic composition",
lines: null,
sound: "喷血声",
associateAssetsIds: [0]
},
{
id: 3,
title: "青云令裂痕",
description: "青云令表面灵纹逐渐暗淡,青玉上浮现细微裂痕",
camera: "大特写",
duration: 3,
frameMode: "firstFrame",
prompt: "Close_up of a jade token with glowing runes fading, fine cracks appearing on the surface, dark moody lighting, cinematic detail shot",
lines: null,
sound: "玉石碎裂声",
associateAssetsIds: [2]
}
]
})
```
## 5. 工具调用顺序
1. `get_flowData("script")` — 获取剧本内容
2. `get_flowData("assets")` — 获取已有资产列表
3. 分析剧本,按照拆分原则划分分镜,并为每条分镜填写所有字段
4. 调用 `set_flowData({ key: "storyboard", value: 分镜数组 })` 一次性保存完整分镜面板
5. 向用户汇报分镜面板概要(总共多少条分镜,覆盖的场景概括)
6. **询问用户是否需要生成分镜图片**
- 如果用户确认,调用 `generate_storyboard_images({ script: 剧本文本 })` 生成分镜图
- 如果用户拒绝,跳过此步骤,流程结束
## 6. 注意事项
- 分镜数量与剧本长度成正比,一般每 50~100 字剧本对应 1~2 条分镜
- prompt 必须使用英文,且只描述视觉内容
- `associateAssetsIds` 使用资产数组的索引0-based确保索引不越界
- 如果剧本中出现了资产列表中不存在的角色/物件,仍要在分镜中描述,但不要在 `associateAssetsIds` 中编造不存在的索引
- 分镜的顺序应与剧本的叙事顺序一致
- 合理使用三种 frameMode大部分分镜使用 `firstFrame`,涉及动作结果的用 `endFrame`,以对话为主的用 `linesSoundEffects`