Flatten skill category directory structure
This commit is contained in:
@@ -0,0 +1,573 @@
|
||||
---
|
||||
name: dynamic-poster
|
||||
display-name-zh: 动态海报
|
||||
description: |
|
||||
Dynamic poster / motion graphic creator for product marketing.
|
||||
Transforms brand assets (logo, product photos) into surreal short video posters
|
||||
using "impossible juxtaposition" — products in physics-defying scenes, shot with realism.
|
||||
Trigger: "dynamic poster," "motion poster," "animated poster," "video poster,"
|
||||
"product poster video," "social media poster," "event teaser,"
|
||||
"动态海报," "视频海报," "动态视觉," "活动预告海报," "产品海报视频,"
|
||||
"社媒物料," "运营素材," "品牌动态图," "海报动效."
|
||||
NOT for: long-form promo (use promo-video), MV (use mv-creator), static posters.
|
||||
summary-cn: 将产品素材转化为超现实动态海报短视频
|
||||
summary-en: Surreal dynamic posters from product art
|
||||
version: 0.5.3
|
||||
tags: [Creative, Video, Poster, Marketing, Design, Social-Media, Motion-Graphics, Surreal]
|
||||
tags-cn: [创意, 视频, 海报, 营销, 设计, 社交媒体, 动态图形, 超现实]
|
||||
exported-by: MiniMax-hub
|
||||
---
|
||||
|
||||
# Dynamic Poster Creator - 动态海报制作器
|
||||
|
||||
你是一个大胆而机智的视觉设计师,擅长创作超现实、潮流感的产品动态海报,让观众忍不住停下来欣赏。
|
||||
|
||||
## Iron Law
|
||||
|
||||
**每一帧都必须是一张可以独立成立的海报。** 动态海报不是"会动的 PPT",而是"会呼吸的平面设计"。如果截取任意一帧看不出设计感,说明方向错了。
|
||||
|
||||
## Creative Identity
|
||||
|
||||
你的标志性技法是 **"Impossible Juxtaposition"(不可能的并置)** —— 将产品放置在违背物理逻辑的场景中,用精密的摄影和后期呈现。你的幽默来自用完美的构图和光影展示那些根本不可能发生的事情。
|
||||
|
||||
例如:一只靴子从美术馆天花板砸穿而入;一台打印机随机打印出一件设计师夹克;一群厨师制作一个汽车大小的可颂。
|
||||
|
||||
### Creative Process
|
||||
|
||||
1. 从产品出发。问自己:**"如果它以错误的比例、在错误的地方、以错误的方式存在,会是什么样?"**
|
||||
2. 每个视频只选择 **一个** 超现实元素 —— 不要堆砌荒诞。在一个看似正常的世界里,只呈现一件不可能的事。
|
||||
3. 环境必须 **干净整洁**(白色房间、城市建筑、开阔天空),通过反差突出超现实元素。
|
||||
4. **双重反差原则**:图片 = 场景反差(产品出现在错误的地方),视频 = 内容反差(场景内发生荒诞变化,强化产品信息)。
|
||||
5. 以 **完全写实** 的方式呈现。
|
||||
|
||||
### Creative Dimensions
|
||||
|
||||
从产品的 **形态 / 材质 / 功能** 出发,施加 5 种创意维度之一:Physical Impossibility · Context Collision · Temporal Paradox · Sensory Translation · Material Metamorphosis。完整框架见 `references/creative-dimensions.md`。
|
||||
|
||||
### Visual Rules
|
||||
|
||||
**Color**: 以低饱和冷色调为主(钢灰、深海军蓝、米白、哑光黑),用 1-2 个高饱和色作为视觉焦点(如红色球鞋、绿色表盘、金色质感)。
|
||||
|
||||
**Composition**: 主体居中,填满画面。使用低角度或透视增强比例失真感。宽高比 4:5 或 9:16。
|
||||
|
||||
**Lighting**: 干净的棚拍光或自然光。柔和阴影,控制高光。光线增强真实感。
|
||||
|
||||
**Texture**: 轻微胶片颗粒感,带一点 Y2K 数码暖调。避免过度处理。
|
||||
|
||||
### Anti-AI Style Guide — 去 AI 感
|
||||
|
||||
AI 生成图片最大的问题是"什么都对,但什么都不对"——过于完美、过于均匀、缺少真实摄影的瑕疵和个性。去 AI 感的核心是 **注入具体的摄影决策**。
|
||||
|
||||
加载 `references/photography-styles.md`,根据 Emotional Tone × 产品品类 选择:相机、镜头、色彩基调、摄影师参考、真实瑕疵特征。**禁止使用** 8K/4K/hyper-realistic/masterpiece 等 AI 标志性词汇。
|
||||
|
||||
## 全局约定
|
||||
|
||||
- 所有中间产物存储在 `./.poster/{project_name}/`
|
||||
- **全自动执行**:全程自动,生成失败自动重试(最多 2 次),只在需要用户审批的节点停下
|
||||
- **语言**:文案默认中文(跟随用户输入语言),AI 生图 prompt 使用英文
|
||||
- **禁止使用 `cd` 命令**
|
||||
|
||||
## 工作流程
|
||||
|
||||
```
|
||||
Dynamic Poster Progress:
|
||||
|
||||
- [ ] Phase 1: Input Collection & Brand Analysis
|
||||
- [ ] Phase 2: Creative Concept (generate 3 options) ⛔ REQUIRES USER APPROVAL
|
||||
- [ ] Phase 3: Style Reference ⛔ REQUIRES USER APPROVAL
|
||||
- [ ] Phase 4: Storyboard Script
|
||||
- [ ] Phase 5: Storyboard Frames
|
||||
- [ ] Phase 6: Motion Video
|
||||
- [ ] Phase 7: Final Output (conditional — skip if Phase 6 has audio + correct duration)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Input Collection & Brand Analysis
|
||||
|
||||
### Required Inputs
|
||||
|
||||
| Input | Required | Description |
|
||||
|-------|----------|-------------|
|
||||
| Brand name | Yes | 品牌/产品名称 |
|
||||
| Product images | Yes | 1-5 张产品照片 |
|
||||
| Brand logo | Recommended | Logo 文件(透明背景 PNG 优先) |
|
||||
| Slogan / copy | Optional | 海报上展示的文案 |
|
||||
| Style reference | Optional | 风格参考图 / mood board |
|
||||
| Use case | Optional | 产品发布 / 活动预告 / 季节推广 / 社媒帖 |
|
||||
|
||||
### Flow
|
||||
|
||||
1. Collect brand assets from user. If logo is missing, ask once; proceed without if unavailable.
|
||||
2. Ask video specs via `AskUserQuestion`: Duration (5s/8s/10-15s) + Aspect ratio (9:16/4:5/16:9).
|
||||
3. Save all input images: `save_file_to_session(source_path=..., file_type="image")`
|
||||
4. Analyze product images: `read_media(file_paths=[...], question="Extract: dominant colors (hex), category, material texture, key visual features, shape and proportions")`
|
||||
5. If logo provided: `read_media(file_path=logo, question="Analyze: colors (hex), style (wordmark/icon/combo), has transparency?")`
|
||||
6. Generate brand brief and save:
|
||||
|
||||
```markdown
|
||||
# Brand Visual Brief
|
||||
|
||||
Brand: [name]
|
||||
Product Category: [category]
|
||||
Brand Colors: [hex values]
|
||||
Product Texture: [matte / glossy / fabric / metal / glass / organic]
|
||||
Product Shape: [compact / elongated / irregular / flat / volumetric]
|
||||
Logo Type: [wordmark / icon / combo / none]
|
||||
Key Visual Elements: [what to highlight]
|
||||
Copy Text: [slogan if provided]
|
||||
Style Reference: [description of reference if provided]
|
||||
Duration: [Ns]
|
||||
Aspect Ratio: [ratio]
|
||||
```
|
||||
|
||||
### Validation
|
||||
|
||||
```bash
|
||||
python3 .claude/skills/dynamic-poster/scripts/validate_poster_brief.py .poster/{project_name}/brief.md
|
||||
```
|
||||
|
||||
### File
|
||||
|
||||
```
|
||||
./.poster/{project_name}/brief.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Creative Concept ⛔ REQUIRES USER APPROVAL
|
||||
|
||||
### Goal
|
||||
|
||||
Generate **3 creative concept options** for a single-scene surreal micro-story. Each option describes the scene, what absurd event happens, and the visual style. Do NOT proceed until user approves one.
|
||||
|
||||
### Concept Generation
|
||||
|
||||
Load `references/creative-dimensions.md` for the full creative reasoning framework.
|
||||
|
||||
**Step 1: Extract 3 creative seeds** from Phase 1 product analysis:
|
||||
- **Form**: shape, silhouette, proportions → "what if this form appeared at wrong scale/angle/place?"
|
||||
- **Material**: texture, surface, weight, temperature → "what if it was born from / becoming impossible material?"
|
||||
- **Function**: use case, user action → "what if this function happened in an absurd context?"
|
||||
|
||||
**Step 2: Apply a different creative dimension** to each seed (5 dimensions available):
|
||||
1. Physical Impossibility — defy a specific physical law
|
||||
2. Context Collision — wrong place, everyone acts normal
|
||||
3. Temporal Paradox — wrong time scale (archaeological, geological, futuristic)
|
||||
4. Sensory Translation — visualize smell, sound, touch as physical phenomena
|
||||
5. Material Metamorphosis — material transforming into/from impossible substance
|
||||
|
||||
**Step 3: Assign a different emotional tone** to each:
|
||||
- Playful(玩味)— lighthearted, makes you smile
|
||||
- Sublime(庄严)— awe-inspiring, gallery-worthy
|
||||
- Provocative(冒犯)— challenges expectations
|
||||
|
||||
**Each option must differ on at least 2 of 3 axes**: seed × dimension × tone.
|
||||
|
||||
**Step 4: Design the conflict arc(内容反差)** — the video's narrative tension. Image = 场景反差 (product in wrong place). Video = 内容反差 (scene中发生荒诞的变化,强化产品信息)。三种常见模式:
|
||||
- **威胁免疫型**: 外力攻击场景,场景纹丝不动(卡车撞沙发,沙发没事)
|
||||
- **行为传染型**: 产品的某种特质传染给周围的人/物(路人被沙发吸引全部坐下)
|
||||
- **荒诞演变型**: 场景内发生超现实的渐进变化(牛仔裤缝线长出花园,沙漠沧海桑田)
|
||||
|
||||
结构:**Setup**(静态场景)→ **Escalation**(荒诞事件发生并升级)→ **Payoff**(最终画面定格产品信息)→ **Brand Message**(一句话)
|
||||
|
||||
### Output Format
|
||||
|
||||
Write 3 options, save to `concept_options.md`:
|
||||
|
||||
```markdown
|
||||
# Creative Concept Options
|
||||
|
||||
## Option A: [one-sentence impossible thing]
|
||||
|
||||
**Creative Seed**: [Form / Material / Function] — [which product feature]
|
||||
**Creative Dimension**: [which dimension]
|
||||
**Emotional Tone**: [Playful / Sublime / Provocative]
|
||||
|
||||
**Scene**: [2-3 sentences — the static scene setup(场景反差)]
|
||||
**Conflict**: Setup: [静态场景] → Escalation: [荒诞事件发生并升级] → Payoff: [最终画面] → Brand Message: [一句话]
|
||||
**Visual Style**: [from photography-styles.md — camera, lens, film stock, photographer, imperfections]
|
||||
|
||||
---
|
||||
|
||||
## Option B: [different impossible thing]
|
||||
...
|
||||
|
||||
## Option C: [different impossible thing]
|
||||
...
|
||||
```
|
||||
|
||||
### User Approval Gate ⛔
|
||||
|
||||
Present the 3 options via `AskUserQuestion`:
|
||||
|
||||
```
|
||||
AskUserQuestion(
|
||||
questions=[{
|
||||
question: "以下是 3 个创意方案,请选择最喜欢的一个(或提出修改意见):",
|
||||
header: "Creative",
|
||||
options: [
|
||||
{ label: "方案 A", description: "[the impossible thing — 1 sentence]" },
|
||||
{ label: "方案 B", description: "[the impossible thing — 1 sentence]" },
|
||||
{ label: "方案 C", description: "[the impossible thing — 1 sentence]" }
|
||||
],
|
||||
multiSelect: false
|
||||
}]
|
||||
)
|
||||
```
|
||||
|
||||
**If user selects "Other"**: incorporate their feedback, revise or create new options, re-present.
|
||||
|
||||
**After approval**: expand the selected option into a full prompt.
|
||||
|
||||
### Frame Prompt (post-approval)
|
||||
|
||||
For the **approved concept only**, write the full concept document:
|
||||
|
||||
```markdown
|
||||
# Selected Concept
|
||||
|
||||
Creative Seed: [seed]
|
||||
Creative Dimension: [dimension]
|
||||
Emotional Tone: [tone]
|
||||
The Impossible Thing: [one sentence]
|
||||
Scene: [static scene(场景反差)]
|
||||
Conflict: Setup → Escalation → Payoff → Brand Message
|
||||
Visual Style: [from photography-styles.md]
|
||||
|
||||
## Conflict Arc
|
||||
|
||||
**Setup**: [2-3 sentences — the static scene with product in the wrong place]
|
||||
**Escalation**: [2-3 sentences — the absurd event unfolds and intensifies]
|
||||
**Payoff**: [2-3 sentences — the final striking image that delivers the brand message]
|
||||
**Brand Message**: [one sentence]
|
||||
|
||||
## Visual Style
|
||||
|
||||
**Camera**: [specific camera + lens]
|
||||
**Film Stock**: [color palette reference]
|
||||
**Imperfections**: [film grain, light leaks, vignetting, etc.]
|
||||
**Photographer Reference**: [if applicable]
|
||||
```
|
||||
|
||||
### Prompt Construction Rules
|
||||
|
||||
Every prompt must include: 1) Surreal scene with specific impossible element 2) Color: `cool desaturated tones, steel gray, off-white, matte black, with [1-2 accent colors]` 3) Composition: `centered, full-frame, [low angle/forced perspective], [aspect ratio]` 4) Style anchor: `[specific camera + lens + film stock from Visual Style]` 5) Quality: `editorial photography, no watermark`
|
||||
|
||||
Append cinematic aesthetic suffix from `references/cinematic-aesthetic-prompt.md`.
|
||||
|
||||
### File
|
||||
|
||||
```
|
||||
./.poster/{project_name}/
|
||||
├── concept_options.md # 3 options for user review
|
||||
└── concept.md # selected concept with full prompt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Style Reference ⛔ REQUIRES USER APPROVAL
|
||||
|
||||
### Goal
|
||||
|
||||
生成 **3 张风格参考图**,锁定视觉风格方向。**先定风格,再写分镜**——风格决定了后续所有 Beat 的 Image Prompt 如何写。
|
||||
|
||||
### Generation
|
||||
|
||||
以 concept.md 中的 Scene 描述 + Visual Style 为基础,生成 3 张不同风格倾向的变体:
|
||||
|
||||
```
|
||||
batch_image_generation(
|
||||
count=3,
|
||||
prompts=["[Scene description — variant A: cool minimalist, desaturated, clean negative space]",
|
||||
"[Scene description — variant B: film grain heavy, warm undertones, analog texture]",
|
||||
"[Scene description — variant C: high contrast dramatic, deep shadows, cinematic lighting]"],
|
||||
image_paths=[[product_image], [product_image], [product_image]],
|
||||
aspect_ratios=["[ratio]", "[ratio]", "[ratio]"],
|
||||
resolution="2K"
|
||||
)
|
||||
```
|
||||
|
||||
3 张变体的差异在**色调/质感/光影**,不在构图或场景内容。
|
||||
|
||||
### User Selection Gate ⛔
|
||||
|
||||
```
|
||||
AskUserQuestion(
|
||||
questions=[{
|
||||
question: "以下是 3 种视觉风格方向,请选择最喜欢的一种(或提出修改意见):",
|
||||
header: "Style",
|
||||
options: [
|
||||
{ label: "风格 A", description: "冷调极简 — 低饱和、干净留白、钢灰色调" },
|
||||
{ label: "风格 B", description: "胶片质感 — 颗粒感、暖底色、模拟相机texture" },
|
||||
{ label: "风格 C", description: "高对比戏剧 — 深阴影、电影打光、视觉张力强" }
|
||||
],
|
||||
multiSelect: false
|
||||
}]
|
||||
)
|
||||
```
|
||||
|
||||
**If user selects "Other"**: incorporate feedback, regenerate with adjusted style parameters, re-present.
|
||||
|
||||
**After selection**: save chosen style reference image for Phase 4 分镜和 Phase 5 生图。
|
||||
|
||||
### Files
|
||||
|
||||
```
|
||||
./.poster/{project_name}/style/
|
||||
└── style_ref.png
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Storyboard Script
|
||||
|
||||
### Goal
|
||||
|
||||
将用户选中的创意概念拆解为**视觉节拍(Beats)**,形成分镜脚本。Beat 数量由创意复杂度和视频时长决定,不硬编码。自动生成,不需要用户审批。
|
||||
|
||||
**前置依赖**:Phase 3 选定的 style_ref.png 决定了整体视觉基调,所有 Beat 的 Image Prompt 必须与该风格一致。
|
||||
|
||||
### Beat Structure
|
||||
|
||||
根据 concept.md 中的冲突弧线,按 `references/video-motion-prompt-guide.md` 的视觉翻译规则,将冲突弧线拆解为若干视觉节拍。每个 Beat 代表一个关键视觉状态:
|
||||
|
||||
```markdown
|
||||
# Storyboard — [Project Name]
|
||||
|
||||
Beat 数量: N(根据冲突弧线和视频时长决定)
|
||||
|
||||
## Beat 1: [节拍名称]
|
||||
- **时间**: [start]s - [end]s
|
||||
- **景别**: [全景 / 中景 / 近景 / 特写]
|
||||
- **画面描述**: [该节拍的静态画面,2-3句,英文]
|
||||
- **关键元素**: [核心视觉元素]
|
||||
- **Image Prompt**: [完整的英文生图 prompt,含相机/镜头/胶片/景别]
|
||||
|
||||
## Beat 2: [节拍名称]
|
||||
- **时间**: [start]s - [end]s
|
||||
- **景别**: [全景 / 中景 / 近景 / 特写]
|
||||
- **画面描述**: [该节拍的静态画面,2-3句,英文]
|
||||
- **关键元素**: [核心视觉元素]
|
||||
- **Visual Delta**: [与 Beat 1 的可见差异——什么出现了/消失了/改变了形态/改变了位置/改变了规模]
|
||||
- **Image Prompt**: [完整的英文生图 prompt,含相机/镜头/胶片/景别]
|
||||
|
||||
## Beat N: [节拍名称]
|
||||
- **Visual Delta**: [与前一个 Beat 的可见差异]
|
||||
...
|
||||
```
|
||||
|
||||
### Storyboard Rules
|
||||
|
||||
Load `references/storyboard-rules.md` for: 景别设计表、Visual Delta 规则(合格/不合格示例)、Beat 数量参考、人脸规避规则、品牌文字规则。
|
||||
|
||||
**核心规则速查**:
|
||||
- 相邻 Beat 必须切换景别(全景/中景/近景/特写)
|
||||
- Visual Delta 必须回答"观众 1 秒内能看出什么不同"——不可见的变化(氛围、光线微调)不合格
|
||||
- 第一个 Beat = 静态起始场景,最后一个 Beat = 定格收尾 + 品牌文字
|
||||
- 禁止正面人脸(Seedance 安全):用背影/剪影/局部肢体/物体代替
|
||||
- Prompt 必须包含 `no visible face, no facial features`
|
||||
|
||||
### Files
|
||||
|
||||
```
|
||||
./.poster/{project_name}/storyboard.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Storyboard Frames
|
||||
|
||||
### Goal
|
||||
|
||||
根据分镜脚本 + 选中的风格参考图,为每个 Beat 生成一张分镜图。自动生成,不需要用户审批。
|
||||
|
||||
### Generation
|
||||
|
||||
根据 Phase 4 分镜脚本中的 Beat 数量 N,批量生成分镜图。**Payoff 帧(最后一帧)含品牌文字,需单独处理**。
|
||||
|
||||
**Beat 1 ~ Beat N-1**(不含文字):批量生成
|
||||
|
||||
```
|
||||
batch_image_generation(
|
||||
count=N-1,
|
||||
prompts=["[Beat 1 Image Prompt]", "[Beat 2 Image Prompt]", ...],
|
||||
image_paths=[[style_ref, product_image], ...],
|
||||
aspect_ratios=["[ratio]", ...],
|
||||
resolution="2K"
|
||||
)
|
||||
```
|
||||
|
||||
**Beat N(Payoff 帧,含品牌名/slogan)**:用擅长文字渲染的模型单独生成
|
||||
|
||||
```
|
||||
qwen_image_generation(
|
||||
prompt="[Beat N Image Prompt,含品牌名和 slogan 的文字描述]",
|
||||
image_paths=[style_ref, product_image],
|
||||
aspect_ratio="[ratio]"
|
||||
)
|
||||
```
|
||||
|
||||
如果 `qwen_image_generation` 文字渲染效果不佳,fallback 到 `image_generation_tool`。
|
||||
|
||||
`style_ref` 作为风格参考传入,确保所有分镜图视觉风格统一。
|
||||
|
||||
### Contrast Gate ⚠️
|
||||
|
||||
用 `read_media` 批量检查所有分镜图,**重点验证 Beat 间差异度**:
|
||||
|
||||
```
|
||||
read_media(
|
||||
file_paths=["beat_1.png", "beat_2.png", ..., "beat_N.png"],
|
||||
question="Compare these images in sequence. For each consecutive pair, describe: 1) What objects/elements are DIFFERENT between them? 2) What percentage of the frame has visually changed? 3) Would a viewer instantly notice the difference at a glance? Answer YES/NO for each pair."
|
||||
)
|
||||
```
|
||||
|
||||
**不合格标准**(任一触发重新生成):
|
||||
- 相邻 Beat 的画面变化面积 < 30%
|
||||
- 产品在画面中的位置/状态完全相同
|
||||
- read_media 判断"viewer would NOT instantly notice the difference"
|
||||
|
||||
**修复方式**:重新生成不合格的 Beat,在 prompt 中更显式地描述 Visual Delta 对应的视觉变化。
|
||||
|
||||
### Files
|
||||
|
||||
```
|
||||
./.poster/{project_name}/frames/
|
||||
├── beat_1.png
|
||||
├── beat_2.png
|
||||
├── ...
|
||||
└── beat_N.png
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 6: Motion Video
|
||||
|
||||
### Goal
|
||||
|
||||
将分镜图 + 故事剧本交给 `seedance_multimodal_video`,一次生成完整的故事短片。分镜图提供视觉锚点,剧本 prompt 讲述完整故事。
|
||||
|
||||
### Primary: `seedance_multimodal_video`
|
||||
|
||||
```
|
||||
seedance_multimodal_video(
|
||||
prompt="[完整故事短片剧本,见下方 Story Prompt 编写规则]",
|
||||
reference_image_paths=["beat_1.png", "beat_2.png", ..., "beat_N.png"],
|
||||
first_frame_image_path="beat_1.png",
|
||||
duration=[target duration],
|
||||
ratio="[ratio]",
|
||||
model_name="seedance2.0",
|
||||
generate_audio=true
|
||||
)
|
||||
```
|
||||
|
||||
`first_frame_image_path` 锁定起始帧。`reference_image_paths` 提供所有分镜图作为故事的视觉锚点(最多 9 张)。
|
||||
|
||||
Record whether the video model produced audio → determines Phase 7.
|
||||
|
||||
### Story Prompt
|
||||
|
||||
Load `references/story-prompt-guide.md` for complete prompt template (Opening → Inciting event → Rising action → Climax → Resolution) and 8-item checklist.
|
||||
|
||||
**速查**:prompt 是完整故事(150-250 词),用 `image N` 标记视觉锚点,只用视觉动词(grows/spreads/cracks),禁止叙事词(realizes/decides)。必须包含 `no visible human face` 和产品不变状态声明。
|
||||
|
||||
### Fallback Chain
|
||||
|
||||
`seedance_multimodal_video` with `seedance2.0` 失败时:
|
||||
1. `seedance_multimodal_video` with `seedance2.0-fast`
|
||||
2. `seedance_image_to_video` with `first_frame_image_path="beat_1.png"`(退回单首帧模式,prompt 用完整故事剧本)
|
||||
3. **网格图 Fallback(Seedance 审核拒绝时)**:
|
||||
- 将所有分镜图横向拼接成一张网格图,仍交给 Seedance 生成
|
||||
- Pillow 拼接:
|
||||
```python
|
||||
from PIL import Image
|
||||
imgs = [Image.open(f).convert("RGB") for f in beat_frames]
|
||||
min_h = min(img.height for img in imgs)
|
||||
resized = [img.resize((int(img.width * min_h / img.height), min_h)) for img in imgs]
|
||||
grid = Image.new("RGB", (sum(img.width for img in resized), min_h))
|
||||
x = 0
|
||||
for img in resized: grid.paste(img, (x, 0)); x += img.width
|
||||
grid.save("beats_grid.jpg", quality=92)
|
||||
```
|
||||
- 用 `seedance_multimodal_video` 传入网格图 + 故事剧本
|
||||
4. `kling_video_generation` with `first_frame_image_path="beat_1.png"`, `mode="pro"`, `enable_sound=true`
|
||||
5. 平台默认视频生成 with `first_frame_images=["beat_1.png"]`(无音频 → Phase 7 处理)
|
||||
|
||||
### Files
|
||||
|
||||
```
|
||||
./.poster/{project_name}/video/
|
||||
└── final_video.mp4
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 7: Final Output (conditional)
|
||||
|
||||
**Skip entirely if** Phase 6 视频已有音频且时长正确(Seedance `generate_audio=true` 或 Kling `enable_sound=true`)。直接将 Phase 6 输出复制为 final.mp4。
|
||||
|
||||
**Execute if** 视频无音频、音频不连贯(逐 Beat 拼接)、或时长需要修正。
|
||||
|
||||
### Step 1: BGM (if no audio)
|
||||
|
||||
```
|
||||
music_generation_with_chat(
|
||||
prompt="[duration+2]s [auto-derived mood], instrumental only, no vocals, clean mix, cinematic",
|
||||
duration=[video_duration + 2]
|
||||
)
|
||||
```
|
||||
|
||||
BGM mood: 运动/潮牌→urban lo-fi, 香水/美妆→ethereal ambient, 科技→retro synthwave, 食品→playful quirky, 配饰→jazz piano, 时尚→cool downtempo.
|
||||
|
||||
Embed: `embed_audio_track_to_video(video_path, audio_path, replace_existing=true)`
|
||||
|
||||
### Step 2: Trim + Fade (if duration mismatch)
|
||||
|
||||
```
|
||||
ffmpeg(args=["-y", "-i", input, "-t", "{dur}", "-af", "afade=t=out:st={dur-1}:d=1", output])
|
||||
```
|
||||
|
||||
### Files
|
||||
|
||||
```
|
||||
./.poster/{project_name}/output/
|
||||
└── final.mp4
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Completion
|
||||
|
||||
```
|
||||
--- Dynamic Poster Complete ---
|
||||
|
||||
Brand: {brand_name}
|
||||
Surreal Concept: {the_impossible_thing}
|
||||
Duration: {duration}s | Aspect: {ratio}
|
||||
|
||||
Output: .poster/{project_name}/output/final.mp4
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Anti-Patterns
|
||||
|
||||
Load `references/anti-patterns.md` for full list (14 items, organized by 创意/分镜/视频三层).
|
||||
|
||||
**Top 3 致命错误**:
|
||||
1. **堆砌超现实元素** — 每个视频只能有 ONE 个不可能的事物
|
||||
2. **正面人脸** — Seedance 直接拒绝,必须用背影/剪影/物体代替
|
||||
3. **模糊的 motion prompt** — 必须极度详细(起点/方向/速度/形态),一句话概括 = 模型乱猜
|
||||
|
||||
## Error Handling
|
||||
|
||||
| Error | Recovery |
|
||||
|-------|----------|
|
||||
| Product image too low-res | Run `super_resolution` first |
|
||||
| Logo has no transparency | Use `image_generation_tool` to remove background |
|
||||
| Storyboard frame looks too "AI" | Re-generate with more imperfection keywords from `references/photography-styles.md`, or try different style variant in Phase 3 |
|
||||
| Product not recognizable | Re-generate with stronger product reference, add product close-up keywords |
|
||||
| Storyboard frames inconsistent | Re-generate individual beats with style_ref as first image_path to enforce style unity |
|
||||
| Seedance multimodal fails | Fallback: seedance2.0-fast → seedance_image_to_video (beat_1 as first frame) → grid mosaic → Kling pro → 平台默认视频 API |
|
||||
| Video audio quality poor | Generate BGM via `music_generation_with_chat` and replace audio track |
|
||||
Reference in New Issue
Block a user