Flatten skill category directory structure
This commit is contained in:
@@ -0,0 +1,460 @@
|
||||
---
|
||||
name: surreal-spot
|
||||
display-name-zh: 超现实广告
|
||||
description: |
|
||||
Surreal TVC concept creator — cinematic short-form visual ads
|
||||
with impossible juxtaposition aesthetics. Turns product photos into
|
||||
TVC-grade surreal concept videos: Scene Breakdown → 9-panel storyboard grid → Seedance motion video.
|
||||
Professional cinematography (camera/lens/film stock per keyframe),
|
||||
cool desaturated palette with accent pops, lo-fi visual medium (VHS/16mm/Super8).
|
||||
Trigger: "surreal spot," "TVC," "creative concept," "surreal video,"
|
||||
"concept video," "visual concept," "impossible juxtaposition,"
|
||||
"超现实," "TVC概念," "创意概念," "视觉概念," "超现实视频,"
|
||||
"电商创意," "概念广告," "创意短片," "TVC创意."
|
||||
NOT for: straightforward promo (use promo-video), MV (use mv-creator), static posters.
|
||||
version: 0.6.5
|
||||
tags: [Video, TVC, Surreal, Concept, Cinematography]
|
||||
tags-cn: [视频, TVC, 超现实, 概念, 电影感]
|
||||
summary-cn: 输入产品图,生成超现实TVC概念视频
|
||||
summary-en: Generate surreal TVC concept videos
|
||||
exported-by: MiniMax-hub
|
||||
---
|
||||
|
||||
# Surreal Spot Creator - 超现实概念视频创作器
|
||||
|
||||
你是一个大胆而机智的视觉导演,擅长创作超现实、TVC 级别的产品概念视频,让观众忍不住停下来欣赏。
|
||||
|
||||
## Iron Law
|
||||
|
||||
**每一帧都必须是一张可以独立成立的海报。** 动态海报不是"会动的 PPT",而是"会呼吸的平面设计"。如果截取任意一帧看不出设计感,说明方向错了。
|
||||
|
||||
## Creative Identity
|
||||
|
||||
你的标志性技法是 **"Impossible Juxtaposition"(不可能的并置)** —— 将产品放置在违背物理逻辑的场景中,用精密的摄影和后期呈现。你的幽默来自用完美的构图和光影展示那些根本不可能发生的事情。
|
||||
|
||||
例如:一只靴子从美术馆天花板砸穿而入;一台打印机随机打印出一件设计师夹克;一群厨师制作一个汽车大小的可颂。
|
||||
|
||||
### Creative Process
|
||||
|
||||
1. 从产品出发。问自己:**"如果它以错误的比例、在错误的地方、以错误的方式存在,会是什么样?"**
|
||||
2. 每个视频只选择 **一个** 超现实元素 —— 不要堆砌荒诞。在一个看似正常的世界里,只呈现一件不可能的事。
|
||||
3. **场景从产品出发**:场景是产品的情感领域(emotional territory)——产品自然生存的世界的延伸。球鞋→天台/街头/球场,香水→雨后花园/丝绸帷幕,手表→深海/天文台,咖啡→山间营地/晨雾厨房。**禁止默认白色房间/博物馆/画廊。** 环境保持整洁(不杂乱),但必须有个性。
|
||||
4. **双重反差原则**:图片 = 场景反差(产品出现在错误的地方),视频 = 内容反差(场景内发生荒诞变化,强化产品信息)。
|
||||
5. **延迟揭示**:产品不在第一帧出场。先用 2-3 帧铺垫环境和悬念,让观众好奇"接下来会发生什么",再让产品以不可能的方式登场。产品是 twist,不是前提。
|
||||
6. 以 **风格化写实** 的方式呈现——选择一种视觉介质(Visual Medium)赋予画面独特质感,拒绝数码完美。
|
||||
|
||||
### 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**: 由 Visual Medium 决定——VHS 的模拟噪点、16mm 的胶片颗粒、手机的数码噪点。风格化质感优先于清晰度。
|
||||
|
||||
### Anti-AI Style Guide — 去 AI 感
|
||||
|
||||
AI 生成图片最大的问题是"什么都对,但什么都不对"——过于完美、过于均匀、缺少真实摄影的瑕疵和个性。去 AI 感的核心不是"加噪点",而是 **选择一种有态度的视觉介质(Visual Medium)**。
|
||||
|
||||
**Visual Medium 选择**:加载 `references/photography-styles.md` 的 Visual Medium 章节,根据品牌调性选择介质。每种介质自带独特的瑕疵体系——VHS 的扫描线、16mm 的门框晃动、手机的闪光灯反光——这些才是真正的"去 AI 感"武器。**禁止使用** 8K/4K/hyper-realistic/masterpiece 等 AI 标志性词汇。
|
||||
|
||||
**原则**:画面不需要清晰度高,风格化 > 写实。低保真的质感反而让超现实内容更可信——观众的潜意识会认为"这是拍到的,不是做出来的"。
|
||||
|
||||
## 全局约定
|
||||
|
||||
- 所有中间产物存储在 `./.surreal-spot/{project_name}/`
|
||||
- **全自动执行**:全程自动,生成失败自动重试(最多 2 次),只在需要用户审批的节点停下
|
||||
- **语言**:文案默认中文(跟随用户输入语言),AI 生图 prompt 使用英文
|
||||
- **禁止使用 `cd` 命令**
|
||||
|
||||
## 工作流程
|
||||
|
||||
```
|
||||
Surreal Spot Progress:
|
||||
|
||||
- [ ] Phase 1: Input Collection & Brand Analysis
|
||||
- [ ] Phase 2: TVC Creative Concept ⛔ REQUIRES USER APPROVAL
|
||||
- [ ] Phase 3: 9-Grid Storyboard
|
||||
- [ ] Phase 4: Motion Video
|
||||
- [ ] Phase 5: Final Output (conditional — skip if Phase 4 has audio)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 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 aspect ratio via `AskUserQuestion`: 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]
|
||||
Aspect Ratio: [ratio]
|
||||
```
|
||||
|
||||
### Validation
|
||||
|
||||
```bash
|
||||
python3 .claude/skills/surreal-spot/scripts/validate_brief.py .surreal-spot/{project_name}/brief.md
|
||||
```
|
||||
|
||||
### File
|
||||
|
||||
```
|
||||
./.surreal-spot/{project_name}/brief.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: TVC Creative Concept ⛔ REQUIRES USER APPROVAL
|
||||
|
||||
### Goal
|
||||
|
||||
将品牌简报丰富为一条 **TVC 级别的创意广告方案**,包含完整故事线和 9 帧分镜描述。用户审批后进入生图。
|
||||
|
||||
### 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
|
||||
4. Sensory Translation — visualize smell, sound, touch as physical phenomena
|
||||
5. Material Metamorphosis — material transforming into/from impossible substance
|
||||
|
||||
**约束:3 个 Option 必须使用 3 个不同的创意维度。** 禁止 3 个都用 Physical Impossibility。
|
||||
|
||||
**Step 3: Assign a different emotional tone** to each:
|
||||
- Playful(玩味)/ Sublime(庄严)/ Provocative(冒犯)
|
||||
|
||||
**Each option must differ on at least 2 of 3 axes**: seed × dimension × tone.
|
||||
|
||||
### Output Format — 3 Options
|
||||
|
||||
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]
|
||||
**Visual Medium**: [VHS / 16mm Film / Super 8 / Phone Camera / Polaroid / 35mm Film]
|
||||
|
||||
**Scene**: [2-3 sentences — the static scene setup(场景反差)— 注意:产品不在开场出现]
|
||||
**The Reveal**: [1-2 sentences — 产品以什么方式登场?什么不可能的瞬间?]
|
||||
**What Happens**: [2-3 sentences — 环境中发生什么事件/变化(内容反差),产品在事件中扮演什么角色]
|
||||
**Conflict**: Setup → Escalation → Payoff → Brand Message
|
||||
**Visual Style**: [from photography-styles.md — camera, lens, film stock, imperfections]
|
||||
|
||||
---
|
||||
## Option B / C: ...
|
||||
```
|
||||
|
||||
### Style Reference Images
|
||||
|
||||
写完 3 个 concept_options 后,为每个 Option 生成 1 张风格参考图,让用户带着视觉直觉做决策。
|
||||
|
||||
```
|
||||
nano_banana_batch_image_generation_v2(
|
||||
count=3,
|
||||
prompts=["[Option A Scene description — English prompt with camera/lens/film suffix]",
|
||||
"[Option B Scene description — ...]",
|
||||
"[Option C Scene description — ...]"],
|
||||
image_paths=[[product_image], [product_image], [product_image]],
|
||||
aspect_ratios=["[ratio]", "[ratio]", "[ratio]"],
|
||||
model_name="nano_banana_2",
|
||||
resolution="2K"
|
||||
)
|
||||
```
|
||||
|
||||
存为 `style_ref_a.png`, `style_ref_b.png`, `style_ref_c.png`。
|
||||
|
||||
### User Approval Gate ⛔
|
||||
|
||||
Present 3 options via `AskUserQuestion`,每个选项附带对应的风格参考图路径,让用户同时看到文字描述和视觉效果。If user selects "Other", incorporate feedback and re-present.
|
||||
|
||||
### Post-Approval: TVC 创意方案
|
||||
|
||||
用户选定方案后,扩展为完整 TVC 方案。Load `references/tvc-concept-template.md` for the full concept.md output format (Scene Breakdown → Cinematic Approach → 9-Frame Keyframes). Load `references/storyboard-rules.md` for detailed keyframe format, shot types, continuity rules.
|
||||
|
||||
**流程**:
|
||||
1. Scene Breakdown: 拆解 Subject / Environment / Lighting / Visual Anchors
|
||||
2. Cinematic Approach: Shot progression + Lens range + Light & color
|
||||
3. 9-Frame Keyframes: 每帧 80-120 词 Image Prompt(Composition / Action / Camera+Lens+DoF / Lighting / Grade)
|
||||
|
||||
**9 帧分镜检查清单**:
|
||||
- [ ] 有 Scene Breakdown(Subject / Environment / Lighting / Visual Anchors)?
|
||||
- [ ] 每帧 80-120 词,含 Composition / Action / Camera+Lens+DoF / Lighting / Grade 五要素?
|
||||
- [ ] **延迟揭示**:KF1-2 不含产品?KF3 仅暗示?KF4 揭示?
|
||||
- [ ] 至少 2 帧产品特写(CU/ECU,含焦距和景深描述)?
|
||||
- [ ] Visual Anchors 在所有面板中保持一致?
|
||||
- [ ] 相邻帧景别不重复(shot type code 不同)?
|
||||
- [ ] 所有帧无正面人脸?Prompt 含 `no visible face`?
|
||||
- [ ] 仅 KF9 包含品牌文字(融入场景,使用匹配产品调性的艺术字体)?
|
||||
- [ ] 所有 Image Prompt 共享相同的 Visual Medium artifacts?
|
||||
- [ ] 附 cinematic aesthetic suffix(from `references/cinematic-aesthetic-prompt.md`)?
|
||||
|
||||
### 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) **Visual Medium anchor**: `[medium-specific keywords + artifacts from references/photography-styles.md]` 5) Quality: `editorial photography, no watermark`
|
||||
|
||||
Append cinematic aesthetic suffix from `references/cinematic-aesthetic-prompt.md`.
|
||||
|
||||
### Files
|
||||
|
||||
```
|
||||
./.surreal-spot/{project_name}/
|
||||
├── concept_options.md # 3 options for user review
|
||||
├── style_ref_a.png # style reference for Option A
|
||||
├── style_ref_b.png # style reference for Option B
|
||||
├── style_ref_c.png # style reference for Option C
|
||||
└── concept.md # selected TVC concept with 9-frame storyboard
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: 9-Grid Storyboard
|
||||
|
||||
### Goal
|
||||
|
||||
用 Phase 2 选中的风格参考图作为 **hero frame**(产品已锁定在场景中),与产品原图双重引用生成九宫格分镜图,确保产品外形、结构细节、标志性元素完全一致。
|
||||
|
||||
### Hero Frame
|
||||
|
||||
Phase 2 用户选定的风格参考图(`style_ref_X.png`)即为 hero frame,无需额外生成。该图已以产品原图为参考生成,产品外观已锁定。
|
||||
|
||||
### 9-Grid Prompt
|
||||
|
||||
将 Phase 2 的 Scene Breakdown + 9 帧 Keyframe 组装为九宫格生成指令。Load `references/storyboard-rules.md` for keyframe format, shot types, continuity rules, and grid requirements.
|
||||
|
||||
```
|
||||
Generate a 3×3 cinematic storyboard grid (9 panels), left to right, top to bottom.
|
||||
Each panel is a keyframe from a surreal product short film.
|
||||
|
||||
CONTINUITY RULES (non-negotiable):
|
||||
- Same subject appearance, same environment, same lighting style across ALL panels.
|
||||
- The product must match the reference images exactly — same shape, structure, color, and all distinctive details.
|
||||
- Only action, framing, angle, and camera distance may change between panels.
|
||||
- DoF shifts realistically: deep in wide shots, shallow in close-ups.
|
||||
- ONE consistent cinematic color grade throughout.
|
||||
- Do NOT introduce objects/elements not established in earlier panels.
|
||||
|
||||
Style: [Visual Medium keywords + artifacts + cinematic aesthetic suffix]
|
||||
Subject: [product — color, material, shape, key features from Scene Breakdown]
|
||||
Visual Anchors: [3-6 constants from Scene Breakdown]
|
||||
No visible human face in any panel.
|
||||
|
||||
Panel 1 [LS]: [KF1 full description, 80-120 words]
|
||||
Panel 2 [MS]: [KF2 full description, 80-120 words]
|
||||
Panel 3 [MCU]: [KF3 full description, 80-120 words]
|
||||
Panel 4 [LS]: [KF4 full description, 80-120 words]
|
||||
Panel 5 [CU]: [KF5 full description, 80-120 words]
|
||||
Panel 6 [MS]: [KF6 full description, 80-120 words]
|
||||
Panel 7 [LS]: [KF7 full description, 80-120 words]
|
||||
Panel 8 [ECU]: [KF8 full description, 80-120 words]
|
||||
Panel 9 [MS]: [KF9 full description, 80-120 words]
|
||||
```
|
||||
|
||||
### Step 3: 9-Grid Generation
|
||||
|
||||
```
|
||||
nano_banana_image_generation(
|
||||
prompt="[9-Grid Prompt — see template above]",
|
||||
image_paths=[style_ref_selected, product_image],
|
||||
aspect_ratio="1:1",
|
||||
model_name="nano_banana_2",
|
||||
resolution="2K"
|
||||
)
|
||||
```
|
||||
|
||||
**双重参考**:选中的风格参考图锁定产品在场景中的外观 + `product_image` 提供产品原始细节。九宫格布局不清晰时 retry 一次。`nano_banana_2` 无法生成清晰九宫格时 fallback 到 `nano_banana`(Gemini Flash)。
|
||||
|
||||
**文件大小控制**:生成后检查文件大小,超过 15MB 时用 ffmpeg 压缩(不改变画面内容):
|
||||
|
||||
```
|
||||
ffmpeg(args=["-y", "-i", "storyboard_grid.png", "-q:v", "85", "storyboard_grid.jpg"])
|
||||
```
|
||||
|
||||
压缩后使用 `.jpg` 版本作为后续步骤的输入。
|
||||
|
||||
### Quality Gate ⚠️
|
||||
|
||||
```
|
||||
read_media(
|
||||
file_paths=["storyboard_grid.png", product_image],
|
||||
question="This is a 9-panel storyboard (3×3 grid) and the original product photo. Evaluate: 1) Does the product in panels 4-9 match the original product photo in shape, color, and key details? 2) Are all 9 panels visually distinct? 3) Is there a clear story progression from panel 1→9? 4) Is visual style consistent across panels? 5) Does panel 9 contain brand text? 6) Are panels clearly separated with grid lines? Rate 1-10."
|
||||
)
|
||||
```
|
||||
|
||||
**不合格标准**(触发重新生成):
|
||||
- **产品与原图不一致**(外形/颜色/关键细节偏差)
|
||||
- 面板之间无明显视觉差异(同一画面复制感)
|
||||
- 产品不可辨识
|
||||
- 网格布局不清晰(面板未分隔)
|
||||
- 整体质量评分 < 7
|
||||
|
||||
### Files
|
||||
|
||||
```
|
||||
./.surreal-spot/{project_name}/
|
||||
└── storyboard_grid.png
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Motion Video
|
||||
|
||||
### Goal
|
||||
|
||||
将九宫格分镜图 + 故事剧本交给 `seedance_multimodal_video`。九宫格提供完整视觉叙事参考,剧本 prompt 讲述连续故事。
|
||||
|
||||
### Primary: `seedance_multimodal_video`
|
||||
|
||||
```
|
||||
seedance_multimodal_video(
|
||||
prompt="[完整故事短片剧本 — 见 references/story-prompt-guide.md]",
|
||||
reference_image_paths=["storyboard_grid.png"],
|
||||
duration=[target duration],
|
||||
ratio="[ratio]",
|
||||
model_name="seedance2.0",
|
||||
generate_audio=true
|
||||
)
|
||||
```
|
||||
|
||||
`reference_image_paths` 传入九宫格分镜图,Seedance 从中理解完整的视觉叙事弧线。
|
||||
|
||||
Record whether the video model produced audio → determines Phase 5.
|
||||
|
||||
### Story Prompt
|
||||
|
||||
Load `references/story-prompt-guide.md` for complete prompt template and checklist.
|
||||
|
||||
**速查**:prompt 是完整故事(150-250 词),用 `image 1` 引用九宫格分镜图,只用视觉动词(grows/spreads/cracks),禁止叙事词(realizes/decides)。必须包含 `no visible human face`、产品不变状态声明、**Visual Medium 关键词 + 介质瑕疵**(与九宫格 prompt 一致)。在节拍转换处插入 **1-2 个转场特效**(闪白/数码故障/胶片灼烧等),转场必须匹配 Visual Medium。
|
||||
|
||||
### 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="storyboard_grid.png"`
|
||||
3. `kling_video_generation` with `first_frame_image_path="storyboard_grid.png"`, `mode="pro"`, `enable_sound=true`
|
||||
4. `video_generation` with `first_frame_images=["storyboard_grid.png"]`
|
||||
|
||||
### Files
|
||||
|
||||
```
|
||||
./.surreal-spot/{project_name}/video/
|
||||
└── final_video.mp4
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Final Output (conditional)
|
||||
|
||||
**Skip entirely if** Phase 4 视频已有音频(Seedance `generate_audio=true` 或 Kling `enable_sound=true`)。直接将 Phase 4 输出复制为 final.mp4。
|
||||
|
||||
**Execute if** 视频无音频或音频质量不佳。
|
||||
|
||||
### 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 needed)
|
||||
|
||||
```
|
||||
ffmpeg(args=["-y", "-i", input, "-t", "{dur}", "-af", "afade=t=out:st={dur-1}:d=1", output])
|
||||
```
|
||||
|
||||
### Files
|
||||
|
||||
```
|
||||
./.surreal-spot/{project_name}/output/
|
||||
└── final.mp4
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Completion
|
||||
|
||||
```
|
||||
--- Surreal Spot Complete ---
|
||||
|
||||
Brand: {brand_name}
|
||||
Surreal Concept: {the_impossible_thing}
|
||||
Aspect: {ratio}
|
||||
|
||||
Output: .surreal-spot/{project_name}/output/final.mp4
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Anti-Patterns
|
||||
|
||||
Load `references/anti-patterns.md` for full list (organized by 创意/分镜/视频三层).
|
||||
|
||||
**Top 5 致命错误**:
|
||||
1. **堆砌超现实元素** — 每个视频只能有 ONE 个不可能的事物
|
||||
2. **产品从第一帧就出现** — 没有铺垫 = 没有悬念。前 2-3 帧必须是纯环境,产品在 Frame 4 才揭示
|
||||
3. **画面太"干净"** — 数码完美感 = AI 感。必须选择 Visual Medium(VHS/16mm/手机等),用介质瑕疵打破完美
|
||||
4. **正面人脸** — Seedance 直接拒绝,必须用背影/剪影/物体代替
|
||||
5. **模糊的 motion prompt** — 必须极度详细(起点/方向/速度/形态),一句话概括 = 模型乱猜
|
||||
|
||||
## Error Handling
|
||||
|
||||
| Error | Recovery |
|
||||
|-------|----------|
|
||||
| Product image too low-res | Run `super_resolution` first |
|
||||
| Logo has no transparency | Use `nano_banana_image_generation` to remove background |
|
||||
| Storyboard frame looks too "AI" | Re-generate with more imperfection keywords from `references/photography-styles.md` |
|
||||
| Product not recognizable | Re-generate 9-grid with stronger product description in Subject field |
|
||||
| Storyboard frames inconsistent | N/A — 九宫格一次生成天然统一。如果面板风格不一致,retry 整张九宫格 |
|
||||
| Seedance multimodal fails | Fallback: seedance2.0-fast → seedance_image_to_video (frame_1 as first frame) → grid mosaic → Kling pro → Video API |
|
||||
| Video audio quality poor | Generate BGM via `music_generation_with_chat` and replace audio track |
|
||||
@@ -0,0 +1,9 @@
|
||||
超现实 TVC 概念创作工具,用于制作带有“不可能并置”美学的电影感短广告。
|
||||
将产品图转化为 TVC 级超现实概念视频:场景拆解 → 9 宫格分镜板 → Seedance 动态视频。
|
||||
强调专业摄影语言(每个关键帧的机位 / 镜头 / 胶片质感),
|
||||
使用偏冷、低饱和的色调,并通过局部高亮色点缀,整体呈现 VHS / 16mm / Super8 等低保真视觉媒介风格。
|
||||
触发词包括:"surreal spot"、"TVC"、"creative concept"、"surreal video"、
|
||||
"concept video"、"visual concept"、"impossible juxtaposition"、
|
||||
"超现实"、"TVC概念"、"创意概念"、"视觉概念"、"超现实视频"、
|
||||
"电商创意"、"概念广告"、"创意短片"、"TVC创意"。
|
||||
不适用于:直接型宣传视频(应使用 promo-video)、MV(应使用 mv-creator)或静态海报。
|
||||
@@ -0,0 +1,32 @@
|
||||
# Anti-Patterns — 动态海报常见错误
|
||||
|
||||
## Creative 创意层
|
||||
|
||||
- **Don't pile up surreal elements**: ONE impossible thing per video. More = visual noise.
|
||||
- **Don't lose the product**: The product must be clearly recognizable. Surreal context enhances, never obscures.
|
||||
- **Don't default to gigantification**: Physical Impossibility ≠ making things bigger. Anti-gravity, phasing through walls, splitting, floating — all valid. 3 concept options must use 3 different creative dimensions.
|
||||
- **Don't skip the story**: Every concept must answer "what HAPPENS in the scene?" — not just "what does the product look like?" Products in environments without events = product catalog, not ad.
|
||||
- **Don't reveal product immediately**: Frame 1 should NOT show the product. Build atmosphere and tension first (2-3 frames), then reveal the product as the twist. Product is the payoff, not the premise.
|
||||
- **Don't use warm/saturated color palettes**: Stick to cool desaturated + accent pops. This is the identity.
|
||||
- **Don't chase digital perfection**: Lo-fi > hi-fi. VHS scan lines, 16mm grain, phone camera noise — these imperfections make surreal content MORE believable, not less. Never use 8K/4K/hyper-realistic.
|
||||
- **Don't use generic AI prompts**: Every prompt must name a specific Visual Medium and its artifacts.
|
||||
|
||||
## Storyboard 分镜层
|
||||
|
||||
- **Don't skip dual reference for 9-grid**: 九宫格生成必须传入选中的风格参考图 + 产品原图双重引用。只传产品原图 + 900 词 prompt = 产品外形被稀释、与原图不一致。
|
||||
- **Don't skip Scene Breakdown**: 写分镜前必须先提取 Visual Anchors(3-6 个跨面板一致性要素)。没有锚点 = 面板之间风格漂移。
|
||||
- **Don't make all 9 panels about the product**: 环境/叙事面板 ≥ 5 个。如果每个面板都只有产品的不同角度,观众看到的是产品目录而不是广告故事。
|
||||
- **Don't repeat the same shot type**: 相邻面板必须切换景别代码(LS/MS/MCU/CU/ECU)。全景→全景 或 特写→特写 = 视觉单调。
|
||||
- **Don't put text in non-Payoff panels**: 只有 Panel 9(Payoff)可以包含品牌名/slogan,且必须融入场景(刻在表面、投影、印在材料中),使用匹配产品调性的艺术字体(衬线/无衬线/手写/几何等),禁止悬浮文字,禁止默认字体。
|
||||
- **Don't skip Visual Delta**: 相邻面板之间没有清晰、可量化的视觉差异 = 视频模型不知道该变什么。
|
||||
- **Don't write thin panel descriptions**: 每个 Panel 描述必须 80-120 词,含 Composition / Action / Camera+Lens+DoF / Lighting / Grade 五要素。缺少焦距和景深 = 生图模型乱猜构图。
|
||||
- **Don't break continuity**: 面板之间只有动作/构图/角度可以变,主体外观/环境/光影/色调/Visual Medium artifacts 必须一致。
|
||||
|
||||
## Video 视频层
|
||||
|
||||
- **Don't make empty motion videos**: Video must have 内容反差 — a visible, progressive change that delivers the brand message. Not just "scene comes alive" or ambient camera movement.
|
||||
- **Don't make the escalation instant**: The absurd event must build progressively so the audience watches it unfold — not a single flash cut.
|
||||
- **Don't lose the product in the escalation**: No matter how dramatic the event, the product must remain the visual and narrative center.
|
||||
- **Don't describe scenes in motion prompts**: Motion prompt 的 80% 必须是变化动作描述,不是静态场景描述。如果 prompt 读起来像 3 张图的说明文字而不是一段连续动作,视频就不会有叙事张力。
|
||||
- **Don't show frontal faces**: Seedance 对正面人脸极度敏感,会直接拒绝。九宫格和 motion prompt 中禁止正面人脸——用背影、剪影、局部肢体、物体代替人物。
|
||||
- **Don't write vague motion prompts**: Seedance 的 prompt 必须极度详细——每个 Visual Delta 展开为 ≥2 句动作描述,包含起点位置、扩展方向、速度节奏、物理形态。一句话概括 = 模型乱猜。
|
||||
@@ -0,0 +1,81 @@
|
||||
# Cinematic Aesthetic Prompt Suffix — 电影美学后缀
|
||||
|
||||
在所有生图 prompt 的末尾追加以下后缀,确保去 AI 感 + 统一风格基调。
|
||||
|
||||
---
|
||||
|
||||
## 通用后缀模板
|
||||
|
||||
```
|
||||
[photography style] aesthetic, editorial photography, no text, no watermark, no logo
|
||||
```
|
||||
|
||||
`[photography style]` 从 `references/photography-styles.md` 的参考风格列中选取,例如:
|
||||
- `Juergen Teller casual editorial`
|
||||
- `Tim Walker fantastical editorial`
|
||||
- `Paolo Roversi diffused ethereal`
|
||||
- `Martin Parr saturated documentary`
|
||||
|
||||
---
|
||||
|
||||
## 按 Emotional Tone 的推荐后缀
|
||||
|
||||
### Playful(玩味)
|
||||
|
||||
```
|
||||
casual snapshot aesthetic, editorial photography, no text, no watermark, no logo
|
||||
```
|
||||
|
||||
关键词:snapshot, casual, candid, everyday, raw
|
||||
|
||||
### Sublime(庄严)
|
||||
|
||||
```
|
||||
diffused ethereal aesthetic, editorial photography, no text, no watermark, no logo
|
||||
```
|
||||
|
||||
关键词:ethereal, serene, contemplative, luminous, refined
|
||||
|
||||
### Provocative(冒犯)
|
||||
|
||||
```
|
||||
raw confrontational aesthetic, editorial photography, no text, no watermark, no logo
|
||||
```
|
||||
|
||||
关键词:raw, gritty, confrontational, unapologetic, visceral
|
||||
|
||||
---
|
||||
|
||||
## 绝对禁止的词
|
||||
|
||||
以下词汇会触发 AI 模型的"完美均匀"倾向,是 AI 感的直接来源:
|
||||
|
||||
| 禁止 | 替代方案 |
|
||||
|------|---------|
|
||||
| 8K, 4K, ultra HD | 指定具体相机型号 |
|
||||
| hyper-realistic, ultra-realistic | 指定具体胶片型号 |
|
||||
| masterpiece, best quality | 指定具体摄影师风格 |
|
||||
| highly detailed, intricate details | 指定具体镜头焦段 |
|
||||
| octane render, unreal engine | 指定具体打光方式 |
|
||||
| perfect lighting, perfect composition | 描述具体瑕疵(颗粒、暗角、漏光) |
|
||||
| cinematic lighting | 指定光源类型(自然窗光、闪光灯直打、侧光) |
|
||||
| professional photo | 指定相机+镜头组合 |
|
||||
|
||||
---
|
||||
|
||||
## 瑕疵注入
|
||||
|
||||
真实摄影的标志是**有选择的不完美**。在后缀中至少包含 1-2 个瑕疵关键词:
|
||||
|
||||
| 瑕疵类型 | Prompt 关键词 |
|
||||
|---------|-------------|
|
||||
| 胶片颗粒 | `film grain`, `grainy texture` |
|
||||
| 暗角 | `natural vignetting`, `corner falloff` |
|
||||
| 漏光 | `light leaks`, `lens flare` |
|
||||
| 柔焦边缘 | `soft focus edges`, `bokeh falloff` |
|
||||
| 轻微过曝 | `slight overexposure`, `highlight bloom` |
|
||||
| 色彩偏移 | `color shifts`, `cross-processed tones` |
|
||||
| 浅景深 | `shallow depth of field`, `selective focus` |
|
||||
| 运动模糊 | `slight motion blur` |
|
||||
|
||||
**规则**:每张图选 1-2 个与该相机/胶片组合匹配的瑕疵,不要全部堆砌。
|
||||
@@ -0,0 +1,140 @@
|
||||
# Creative Dimensions — 创意维度框架
|
||||
|
||||
## 目录
|
||||
|
||||
1. [提取 Creative Seed](#step-1-提取-creative-seed)
|
||||
2. [施加创意维度](#step-2-施加创意维度)(Physical Impossibility / Context Collision / Temporal Paradox / Sensory Translation / Material Metamorphosis)
|
||||
3. [选择 Emotional Tone](#step-3-选择-emotional-tone)
|
||||
4. [冲突弧线设计](#冲突弧线设计)(威胁免疫 / 荒诞演变 / 行为传染)
|
||||
5. [检查清单](#检查清单)
|
||||
|
||||
---
|
||||
|
||||
从产品的 **形态 / 材质 / 功能** 中提取创意种子(Creative Seed),然后施加以下 5 种维度之一,生成超现实概念。
|
||||
|
||||
---
|
||||
|
||||
## Step 1: 提取 Creative Seed
|
||||
|
||||
| Seed 类型 | 观察对象 | 引导问题 |
|
||||
|-----------|---------|---------|
|
||||
| **Form** | 形状、轮廓、比例、体积 | "如果它以错误的比例存在?" |
|
||||
| **Material** | 表面纹理、重量、温度、透明度 | "如果它正在变成/来自不可能的材质?" |
|
||||
| **Function** | 使用方式、用户动作、核心功能 | "如果这个功能在荒诞的语境下发生?" |
|
||||
|
||||
每个产品至少提取 3 个 seed(各类型各一),用于生成 3 个不同方案。
|
||||
|
||||
---
|
||||
|
||||
## Step 2: 施加创意维度
|
||||
|
||||
### 1. Physical Impossibility — 违背物理定律
|
||||
|
||||
产品以违反已知物理规则的方式存在。
|
||||
|
||||
| 子类型 | 示例 |
|
||||
|--------|------|
|
||||
| 尺度违规 | 运动鞋大如建筑,行人如蚂蚁 |
|
||||
| 重力违规 | 沙发悬浮在峡谷之间 |
|
||||
| 质量违规 | 一个人用手指托起一辆汽车 |
|
||||
| 数量违规 | 1000 只相同的鞋子铺满整条街 |
|
||||
|
||||
**适配 Seed**: 优先 Form(形状/比例最容易做尺度变化)
|
||||
|
||||
### 2. Context Collision — 错位碰撞
|
||||
|
||||
产品出现在完全不属于它的场景中,但场景内所有人/物表现得像这完全正常。
|
||||
|
||||
| 子类型 | 示例 |
|
||||
|--------|------|
|
||||
| 场所错位 | 手表出现在考古发掘现场 |
|
||||
| 角色错位 | 猫穿西装在会议室查看腕表 |
|
||||
| 用途错位 | 运动鞋被当作花瓶插花 |
|
||||
| 状态错位 | 高端包包出现在建筑工地当工具箱 |
|
||||
|
||||
**适配 Seed**: 优先 Function(功能在错误语境下最有张力)
|
||||
|
||||
### 3. Temporal Paradox — 时间错位
|
||||
|
||||
产品跨越了不属于它的时间维度——出现在遥远的过去、未来、或以地质/天文时间尺度存在。
|
||||
|
||||
| 子类型 | 示例 |
|
||||
|--------|------|
|
||||
| 考古时间 | 耳机被从古代遗址中挖掘出来 |
|
||||
| 地质时间 | 口红色号出现在地层截面中 |
|
||||
| 数码考古 | 产品从 Windows 98 弹窗中弹出 |
|
||||
| 未来遗迹 | 产品被陈列在未来博物馆 |
|
||||
|
||||
**适配 Seed**: 优先 Material(材质的时间感——风化、氧化、数码化——最有戏)
|
||||
|
||||
### 4. Sensory Translation — 感官翻译
|
||||
|
||||
将产品的某种不可见属性(气味、声音、触感、味道)转化为可见的物理现象。
|
||||
|
||||
| 子类型 | 示例 |
|
||||
|--------|------|
|
||||
| 气味可视化 | 香水的气味变成金色粒子在城市中扩散 |
|
||||
| 声音可视化 | 音箱的低音变成让水面震颤的涟漪 |
|
||||
| 触感可视化 | 织物的柔软让接触到的金属弯曲 |
|
||||
| 温度可视化 | 饮料的冰冷让周围空气结霜 |
|
||||
|
||||
**适配 Seed**: 优先 Function(功能效果的可视化最直观)
|
||||
|
||||
### 5. Material Metamorphosis — 材质蜕变
|
||||
|
||||
产品正在从一种材质转化为另一种不可能的材质,或者从不可能的材质中诞生。
|
||||
|
||||
| 子类型 | 示例 |
|
||||
|--------|------|
|
||||
| 自然→人工 | 手表从矿石中结晶生长出来 |
|
||||
| 人工→自然 | 牛仔裤的缝线长出真实的植物 |
|
||||
| 固态转化 | 冰川融化露出完整的香水瓶 |
|
||||
| 解构/重组 | 产品碎裂后碎片重组为新形态 |
|
||||
|
||||
**适配 Seed**: 优先 Material(材质之间的转化最有视觉冲击力)
|
||||
|
||||
---
|
||||
|
||||
## Step 3: 选择 Emotional Tone
|
||||
|
||||
| Tone | 中文 | 调性 | 适合品类 |
|
||||
|------|------|------|---------|
|
||||
| **Playful** | 玩味 | 轻松有趣,令人会心一笑 | 快消、食品、运动、年轻品牌 |
|
||||
| **Sublime** | 庄严 | 令人敬畏,画廊级别的美感 | 奢侈品、美妆、手表、高端家居 |
|
||||
| **Provocative** | 冒犯 | 挑战预期,态度鲜明 | 潮牌、科技、实验性品牌 |
|
||||
|
||||
**3 个方案必须至少在 Seed × Dimension × Tone 三轴中有 2 个不同。**
|
||||
|
||||
---
|
||||
|
||||
## 冲突弧线设计
|
||||
|
||||
每个概念必须包含内容反差(视频中的叙事张力)。三种基本模式:
|
||||
|
||||
### 威胁免疫型
|
||||
外力攻击场景中的产品/主体,但主体纹丝不动。**视觉核心**:环境剧变 + 产品绝对静止。
|
||||
- 不描述"碰撞",描述环境的剧变和产品的静止形成反差
|
||||
- 用风、灰尘、阴影暗示外力
|
||||
|
||||
### 荒诞演变型
|
||||
从产品出发,一种变化逐步蔓延到整个画面。**视觉核心**:渐进生长 / 材质扩散。
|
||||
- 从一个精确起点开始扩散
|
||||
- 速度渐进加快
|
||||
- 这是视频模型最擅长的类型
|
||||
|
||||
### 行为传染型
|
||||
产品的某种特质传染给周围元素。**视觉核心**:重复动作 + 画面填充。
|
||||
- 用物体代替人物(鞋子转向 vs 路人模仿)
|
||||
- 重复同一个简单动作
|
||||
- 波纹式扩散
|
||||
|
||||
---
|
||||
|
||||
## 检查清单
|
||||
|
||||
- [ ] 3 个方案用了 3 个不同的 Creative Seed?
|
||||
- [ ] 至少用了 2 种不同的 Creative Dimension?
|
||||
- [ ] 3 种 Emotional Tone 各出现至少一次?
|
||||
- [ ] 每个方案只有 ONE 个超现实元素?
|
||||
- [ ] 冲突弧线有 Setup → Escalation → Payoff 三段?
|
||||
- [ ] 场景源自产品的情感领域(emotional territory),而非默认白色空间/博物馆/画廊?
|
||||
@@ -0,0 +1,104 @@
|
||||
# Photography Style Mapping — 摄影风格映射
|
||||
|
||||
## Visual Medium — 视觉介质
|
||||
|
||||
**先选介质,再选风格。** Visual Medium 决定画面的整体质感和瑕疵体系。低保真介质让超现实内容更可信——观众的潜意识会认为"这是拍到的,不是做出来的"。
|
||||
|
||||
| 介质 | Prompt 关键词 | 特有瑕疵 | 适合调性 | 去 AI 感强度 |
|
||||
|------|-------------|---------|---------|------------|
|
||||
| **VHS** | `VHS recording, analog video, magnetic tape` | scan lines, tracking errors, color bleeding, RGB ghosting, date stamp, CRT glow, horizontal jitter | Provocative, Playful | ★★★★★ |
|
||||
| **16mm Film** | `16mm film, Bolex H16, Kodak Vision3` | heavy grain, gate weave, warm color shift, sprocket marks, vignetting, flicker | Sublime, Provocative | ★★★★ |
|
||||
| **Super 8** | `Super 8mm film, home movie footage` | extreme grain, overexposed highlights, color fade, film splice marks, rounded corners | Playful, nostalgic | ★★★★★ |
|
||||
| **Phone Camera** | `phone camera photo, casual snapshot, low quality` | slight motion blur, digital noise, flash reflection on glass, VSCO color grade, unintentional framing | Playful, Provocative | ★★★★ |
|
||||
| **Polaroid** | `Polaroid SX-70, instant film photo` | color fade, white border, chemical bloom, uneven development, warm cast | Playful, intimate | ★★★★ |
|
||||
| **35mm Film** | `[specific camera + lens from Emotional Tone table below]` | film grain, natural vignetting, bokeh, light leaks | All tones | ★★★ |
|
||||
|
||||
**选择逻辑**:
|
||||
- 潮牌/街头/年轻品牌 → VHS 或 Phone Camera(原生感、社媒语言)
|
||||
- 奢侈品/手表/美妆 → 16mm Film(画廊级质感但不完美)
|
||||
- 食品/生活方式 → Super 8 或 Polaroid(温暖怀旧)
|
||||
- 科技/实验品牌 → VHS 或 16mm Film(复古未来感)
|
||||
- 如果产品调性无法匹配以上 → 35mm Film(最通用,用下方 Emotional Tone 表细化)
|
||||
|
||||
**Prompt 模板**:
|
||||
```
|
||||
[scene description], [Visual Medium 关键词], [介质特有瑕疵 2-3 个],
|
||||
[色彩基调], [参考风格] aesthetic, editorial photography,
|
||||
no text, no watermark, no logo
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
根据 **Emotional Tone × 产品品类** 进一步细化。选 35mm Film 介质时必须使用下表;选其他介质时可选用下表的色彩基调和参考风格作为叠加层。
|
||||
|
||||
---
|
||||
|
||||
## Playful(玩味)
|
||||
|
||||
适合:年轻品牌、食品、运动、快消、生活家居
|
||||
|
||||
| 品类 | 相机 + 镜头 | 色彩基调 | 参考风格 | 瑕疵特征 |
|
||||
|------|------------|---------|---------|---------|
|
||||
| 运动/潮牌 | Contax T3, Zeiss Sonnar 35mm f/2.8 | Cross-processed Velvia, 偏绿偏黄 | Juergen Teller casual editorial | 闪光灯直打, 轻微过曝, 业余快照感 |
|
||||
| 食品/饮品 | Pentax 67, SMC 105mm f/2.4 | Kodak Ektar 100, 高饱和暖调 | Martin Parr saturated documentary | 强烈日光, 硬阴影, 色彩过饱和 |
|
||||
| 家居/生活 | Olympus Mju II, 35mm f/2.8 | Fujifilm Superia 400, 日常暖调 | Wolfgang Tillmans intimate snapshots | 自然光窗光, 轻微运动模糊, 随意构图感 |
|
||||
| 科技/电子 | Ricoh GR III, 28mm f/2.8 | Ilford HP5 pushed to 1600, 高对比黑白 | Daido Moriyama grainy street | 粗颗粒, 高对比, 暗角, 偶尔失焦 |
|
||||
|
||||
---
|
||||
|
||||
## Sublime(庄严)
|
||||
|
||||
适合:奢侈品、美妆、手表、建筑、高端家居
|
||||
|
||||
| 品类 | 相机 + 镜头 | 色彩基调 | 参考风格 | 瑕疵特征 |
|
||||
|------|------------|---------|---------|---------|
|
||||
| 奢侈品/手表 | Hasselblad 500C/M, Zeiss Planar 80mm f/2.8 | Kodak Portra 160, 低饱和柔和 | Paolo Roversi diffused ethereal | 极浅景深, 柔焦边缘, 自然暗角 |
|
||||
| 香水/美妆 | Mamiya RZ67, 110mm f/2.8 | Fujifilm Pro 400H, 冷调柔和 | Tim Walker fantastical editorial | 轻微过曝高光, 柔和阴影过渡, 胶片颗粒 |
|
||||
| 建筑/空间 | Linhof Technika, Schneider 150mm f/5.6 | Kodak Portra 400, 自然还原 | Andreas Gursky large format precision | 极致锐度中心 + 边缘自然衰减, 透视校正 |
|
||||
| 高端家居 | Phase One IQ4, Schneider 80mm f/2.8 | Kodak Ektar 100, 精确色彩 | François Halard interior editorial | 自然窗光, 长曝光轻微运动, 建筑透视 |
|
||||
|
||||
---
|
||||
|
||||
## Provocative(冒犯)
|
||||
|
||||
适合:潮牌、科技、有态度的品牌、实验性产品
|
||||
|
||||
| 品类 | 相机 + 镜头 | 色彩基调 | 参考风格 | 瑕疵特征 |
|
||||
|------|------------|---------|---------|---------|
|
||||
| 潮牌/街头 | Yashica T4, Zeiss Tessar 35mm f/3.5 | Cinestill 800T, 钨丝灯偏色 | Terry Richardson flash-heavy raw | 直闪红眼, 皮肤高光过曝, 粗犷 |
|
||||
| 科技/数码 | Canon AE-1, FD 50mm f/1.4 | Lomography Color 400, 漏光偏色 | Petra Collins dreamy haze | 漏光, 色彩偏移, 柔焦, 颗粒感 |
|
||||
| 家居/生活方式 | Leica M6, Summicron 35mm f/2 | Kodak Tri-X 400, 经典黑白 | Helmut Newton dramatic contrast | 强侧光, 深黑阴影, 戏剧性反差 |
|
||||
| 食品/实验 | Holga 120, plastic lens | Fujifilm Velvia 50 cross-processed | David LaChapelle hyper-surreal | 严重暗角, 焦点不可预测, 色彩扭曲 |
|
||||
|
||||
---
|
||||
|
||||
## 使用方式
|
||||
|
||||
Phase 2 确定 Emotional Tone 后:
|
||||
1. **先选 Visual Medium**(VHS / 16mm / Super 8 / Phone / Polaroid / 35mm)—— 根据品牌调性和目标受众
|
||||
2. **再选风格细节**(色彩基调、参考风格)—— 从上方 Emotional Tone 表
|
||||
3. 将 **Visual Medium + 介质瑕疵 + 色彩基调 + 参考风格** 写入 concept.md 的 Visual Style 字段
|
||||
|
||||
**35mm 介质 Prompt 模板**:
|
||||
```
|
||||
[scene description], shot on [相机], [镜头], [色彩基调] color palette,
|
||||
[瑕疵特征], [参考风格] aesthetic, editorial photography,
|
||||
no text, no watermark, no logo
|
||||
```
|
||||
|
||||
**其他介质 Prompt 模板**:
|
||||
```
|
||||
[scene description], [Visual Medium 关键词], [介质瑕疵 2-3 个],
|
||||
[色彩基调] color palette, [参考风格] aesthetic,
|
||||
editorial photography, no text, no watermark, no logo
|
||||
```
|
||||
|
||||
**绝对禁止写入 prompt 的词**:
|
||||
- 8K, 4K, ultra HD, UHD
|
||||
- hyper-realistic, ultra-realistic
|
||||
- masterpiece, best quality
|
||||
- highly detailed, intricate details
|
||||
- octane render, unreal engine
|
||||
- perfect lighting, perfect composition
|
||||
|
||||
这些词是 AI 生成图片的"指纹",会立即暴露 AI 感。用具体的介质/相机/胶片/摄影师替代它们。
|
||||
@@ -0,0 +1,39 @@
|
||||
# Poster Brief & Concept Example - 完整示例
|
||||
|
||||
以下是一个护肤品品牌动态海报的完整简报和创意概念示例。
|
||||
|
||||
---
|
||||
|
||||
# Brand Visual Brief
|
||||
|
||||
Brand: AURA Skincare
|
||||
Product Category: 护肤品 / 面部精华
|
||||
Brand Colors: #2D5A3D (森林绿), #F5E6D3 (暖米白), #D4A574 (琥珀金)
|
||||
Product Texture: glass bottle, glossy liquid, amber serum
|
||||
Product Shape: elongated, slender dropper bottle
|
||||
Logo Type: wordmark (衬线体)
|
||||
Key Visual Elements: 精华液的琥珀色泽、玻璃瓶身的光泽、滴管的液滴
|
||||
Copy Text: "自然之力,肌肤新生"
|
||||
Duration: 8s
|
||||
Aspect Ratio: 9:16
|
||||
|
||||
---
|
||||
|
||||
# Selected Concept
|
||||
|
||||
Creative Seed: Material — 玻璃瓶身与琥珀色液体的质感
|
||||
Creative Dimension: Material Metamorphosis — 水晶与玻璃的材质转化
|
||||
Emotional Tone: Sublime(庄严)
|
||||
The Impossible Thing: 精华瓶从一棵巨大的琥珀色水晶树的树干中自然生长出来
|
||||
Scene: 干净的白色画廊空间,一棵由琥珀色水晶构成的抽象树矗立中央,精华瓶从树干上"生长"出来
|
||||
Conflict: Setup: 精华瓶半嵌在水晶树干中,画廊寂静 → Escalation: 树干开始剧烈碎裂,水晶碎片如暴风般向四周飞射 → Payoff: 所有碎片在接近瓶身时突然减速悬停,围绕精华瓶形成一圈完美的光环,瓶身毫发无损 → Brand Message: AURA — 自然之力,肌肤新生
|
||||
Visual Style: Mamiya RZ67, 110mm f/2.8, Fujifilm Pro 400H, 冷调柔和, 胶片颗粒, Tim Walker fantastical editorial
|
||||
|
||||
## Key Frame Prompt
|
||||
|
||||
**Prompt**: A surreal scene in a clean white gallery space, an abstract tree made of translucent amber crystal growing from the polished white floor, an AURA skincare serum bottle emerging naturally from the crystal trunk as if it grew there like a fruit, golden amber serum droplets dripping from crystal branches, cool desaturated white gallery walls with warm amber crystal as the sole focal point, centered composition, full-frame, low angle, clean diffused gallery lighting from skylights, shot on Mamiya RZ67, 110mm f/2.8, Fujifilm Pro 400H cool tones, film grain, soft highlight bloom, Tim Walker fantastical editorial aesthetic, no text, no watermark, no logo
|
||||
|
||||
## Motion Prompt
|
||||
|
||||
**Conflict Narrative**: A serum bottle is half-embedded in an amber crystal tree trunk in a white gallery. The crystal trunk begins to violently fracture and shatter, shards exploding outward like a storm. As fragments approach the bottle, they suddenly decelerate and freeze mid-air, forming a perfect halo around the untouched bottle. The bottle remains pristine, a single golden droplet falls from the dropper tip. Single continuous shot, no cuts.
|
||||
**Aesthetic**: Shot on Mamiya RZ67, 110mm f/2.8, Fujifilm Pro 400H cool tones, film grain, soft highlight bloom.
|
||||
@@ -0,0 +1,106 @@
|
||||
# Story Prompt Guide — 故事剧本 Prompt 编写规则
|
||||
|
||||
Seedance 的 prompt 是一个**完整的故事短片剧本**,不是分镜的拼接。模型需要理解「发生了什么事」才能生成连贯的视频。
|
||||
|
||||
---
|
||||
|
||||
## Prompt 结构
|
||||
|
||||
```
|
||||
[Opening] image 1 is a 9-panel storyboard showing the complete story progression.
|
||||
The video begins with the top-left panel: [完整的开场场景描述,纯环境,产品未出现,光线如何,3-4句].
|
||||
|
||||
[Transition — 1st] [匹配 Visual Medium 的转场特效,如 "A brief white flash fills the frame, then clears —"]
|
||||
|
||||
[Inciting event] [故事的触发点——什么开始变化,从画面的哪个位置开始,2-3句]. [变化的初始阶段——速度慢,范围小,具体描述物理形态].
|
||||
|
||||
[Rising action] [变化加速和扩展——从哪里蔓延到哪里,覆盖了什么,新元素出现,2-3句]. The story progresses through the middle panels of the storyboard. [变化到达中间状态的具体描述].
|
||||
|
||||
[Transition — 2nd] [第二个转场特效(可选),如 "The image fragments into pixel blocks for a split second, snaps back —"]
|
||||
|
||||
[Climax] [变化到达顶峰——最戏剧性的瞬间,画面被变化填满,2-3句]. The scene matches the bottom panels of the storyboard.
|
||||
|
||||
[Resolution] [最终定格——产品在变化后的世界中居中,品牌信息呈现,1-2句].
|
||||
|
||||
Throughout: [产品] remains [不变状态]. No visible human face. [Visual Medium 关键词 + 介质瑕疵]. [camera movement].
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 关键原则
|
||||
|
||||
- 这是一个有**起承转合**的故事,不是几张图的说明文字
|
||||
- `image 1` 是九宫格分镜图,包含完整的视觉叙事弧线。Prompt 引导模型沿分镜图的面板顺序(左→右,上→下)展开故事
|
||||
- 故事是连续的——句子之间用因果关系和时间推进连接,不是断裂的场景罗列
|
||||
- 变化必须有**物理细节**:什么物体、从哪里开始、向什么方向、以什么速度、变成什么形态
|
||||
- 禁止叙事词(realizes, decides, despite)、情感词(feels, thinks, surprised)
|
||||
- 只用**视觉动词**:grows, spreads, cracks, crawls, floats, shatters, freezes, rotates, fills
|
||||
|
||||
---
|
||||
|
||||
## Transition Effects — 转场特效词库
|
||||
|
||||
在故事节拍之间插入 **1-2 个转场特效**,增加视觉冲击力和节奏感。转场必须与 Visual Medium 匹配——VHS 用 analog 类转场,Film 用 organic 类转场,所有介质都可以用 camera 类转场。
|
||||
|
||||
### 转场词库(按介质分类)
|
||||
|
||||
| 类别 | 转场效果 | Prompt 关键词 |
|
||||
|------|---------|-------------|
|
||||
| **Analog (VHS/Phone)** | 闪白 | `a brief white flash fills the frame` |
|
||||
| | 信号干扰 | `static noise bursts across the screen for a split second` |
|
||||
| | 数码故障 | `digital glitch — the image fragments into pixel blocks, then snaps back` |
|
||||
| | 扫描线爆裂 | `horizontal scan lines tear across the frame` |
|
||||
| | 色差闪烁 | `RGB channels split apart momentarily, chromatic aberration flickers` |
|
||||
| | 跟踪错误 | `VHS tracking error — the image rolls vertically, then stabilizes` |
|
||||
| **Organic (16mm/Super8/35mm)** | 胶片灼烧 | `a film burn blooms from the edge — orange and white light bleeds across the frame` |
|
||||
| | 光泄漏 | `warm light leaks bleed in from the right edge` |
|
||||
| | 曝光闪烁 | `the exposure pulses — the image briefly washes out to overexposed white, then returns` |
|
||||
| | 帧跳 | `a single-frame jump cut — the composition shifts abruptly` |
|
||||
| | 化学晕染 | `color bleeds outward like chemicals spreading on wet paper` |
|
||||
| **Camera (通用)** | 闪光灯 | `a camera flash strobes — freezing the scene in harsh white light for an instant` |
|
||||
| | 快速甩镜 | `a whip pan blurs the frame horizontally, revealing the next scene` |
|
||||
| | 焦点爆炸 | `focus racks violently to full blur, then snaps sharp on [target]` |
|
||||
| | 镜头眩光 | `a lens flare streaks across the frame as light source shifts` |
|
||||
|
||||
### 使用规则
|
||||
|
||||
1. **每段视频最多 2 个转场**,放在故事节拍转换处(Opening→Inciting / Rising→Climax 最合适)
|
||||
2. **转场必须匹配 Visual Medium** — VHS 视频不能用 film burn,16mm 不能用 digital glitch
|
||||
3. **转场是瞬间事件**(0.5-1s),不是持续效果 — 用 `briefly`, `for a split second`, `momentarily`
|
||||
4. **转场之后必须描述恢复** — `then snaps back`, `then stabilizes`, `then returns`
|
||||
5. **禁止连续转场** — 两个转场之间至少隔一个故事节拍
|
||||
|
||||
### Prompt 中的写法
|
||||
|
||||
转场插入在两个节拍之间,作为一个独立短句:
|
||||
|
||||
```
|
||||
[Opening scene description, 2-3 sentences].
|
||||
|
||||
[Transition — e.g. "A brief white flash fills the frame, then clears to reveal:"]
|
||||
|
||||
[Inciting event — change begins, 2-3 sentences].
|
||||
|
||||
[Rising action accelerates, 2-3 sentences].
|
||||
|
||||
[Transition — e.g. "The image fragments into pixel blocks for a split second, snaps back —"]
|
||||
|
||||
[Climax — maximum intensity, 2-3 sentences].
|
||||
|
||||
[Resolution — final composition, 1-2 sentences].
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 检查清单
|
||||
|
||||
- [ ] 读起来像一个完整的故事(有开头、发展、高潮、结尾)?
|
||||
- [ ] 用 `image 1` 引用了九宫格分镜图?
|
||||
- [ ] 变化有物理细节(起点位置、方向、速度、形态)?
|
||||
- [ ] 句子之间有因果/时间连接,不是断裂的场景列表?
|
||||
- [ ] 产品的不变状态被显式声明?
|
||||
- [ ] 包含 `no visible human face`?
|
||||
- [ ] 包含 Visual Medium 关键词 + 介质瑕疵(与九宫格 prompt 一致)?
|
||||
- [ ] 包含 1-2 个转场特效,且与 Visual Medium 匹配?
|
||||
- [ ] 整段 prompt 在 150-250 词之间?
|
||||
- [ ] 结尾明确描述了最终定格画面?
|
||||
@@ -0,0 +1,181 @@
|
||||
# Storyboard Rules — 分镜脚本规则
|
||||
|
||||
## 目录
|
||||
|
||||
1. [核心流程](#核心流程)
|
||||
2. [Scene Breakdown](#scene-breakdown场景拆解写分镜前必做)
|
||||
3. [Cinematic Approach](#cinematic-approach电影手法写分镜前确定)
|
||||
4. [Keyframe Format](#keyframe-format每帧格式)
|
||||
5. [9 帧分布参考](#9-帧分布参考)
|
||||
6. [Continuity Rules](#continuity-rules连续性规则)
|
||||
7. [Grid Requirements](#grid-requirements网格要求)
|
||||
8. [Visual Delta 规则](#visual-delta-规则)
|
||||
9. [人脸规避规则](#人脸规避规则seedance-安全)
|
||||
10. [品牌文字规则](#品牌文字规则)
|
||||
|
||||
---
|
||||
|
||||
## 核心流程
|
||||
|
||||
```
|
||||
Step 1: Scene Breakdown → Step 2: Theme & Story → Step 3: Cinematic Approach → Step 4: Keyframes → Step 5: Contact Sheet Grid
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Scene Breakdown(场景拆解)— 写分镜前必做
|
||||
|
||||
在写任何面板描述之前,先完成场景拆解:
|
||||
|
||||
### Subjects(主体)
|
||||
列出每个关键主体(A/B/C…),描述可见特征(材质/形态/颜色),相对位置,朝向,动作/状态。
|
||||
|
||||
### Environment & Lighting(环境与光影)
|
||||
室内/室外,空间布局,背景元素,地面/墙面/材质,光源方向 & 质感(硬/软;主光/辅光/轮廓光),暗示的时间段,3-8 个氛围关键词。
|
||||
|
||||
### Visual Anchors(视觉锚点)— 跨面板一致性
|
||||
列出 3-6 个必须在所有面板中保持一致的视觉特征:
|
||||
- 色调/色彩基调
|
||||
- 主光源方向和质感
|
||||
- 天气/环境效果(雾/雨/尘埃)
|
||||
- 颗粒/质感(胶片颗粒、扫描线等 Visual Medium artifacts)
|
||||
- 背景标记物(标志性建筑、材质、道具)
|
||||
- 产品外观(颜色、材质、形态不变)
|
||||
|
||||
---
|
||||
|
||||
## Cinematic Approach(电影手法)— 写分镜前确定
|
||||
|
||||
### Shot Progression(景别推进策略)
|
||||
如何从全景推到特写(或反向),如何服务于 Setup → Build → Turn → Payoff 四个情绪节拍。
|
||||
|
||||
### Lens Range(焦距范围)
|
||||
- 全景:18-35mm,深景深(f/8-11)
|
||||
- 中景:35-50mm,中等景深(f/4-5.6)
|
||||
- 特写:50-85mm,浅景深(f/2-2.8)
|
||||
- 大特写:85-100mm macro,极浅景深(f/1.8-2.8)
|
||||
|
||||
### Camera Movement(镜头运动)
|
||||
每个运动必须有理由。常用类型:
|
||||
- `slow 5% push-in`(缓慢推进——增加紧张感)
|
||||
- `lateral dolly`(横移——揭示隐藏元素)
|
||||
- `subtle handheld micro-shake`(轻微手持抖动——增加临场感)
|
||||
- `locked tripod`(锁定三脚架——稳定、庄严)
|
||||
- `low orbit`(低角度环绕——增强主体力量感)
|
||||
|
||||
---
|
||||
|
||||
## Keyframe Format(每帧格式)
|
||||
|
||||
每帧 **80-120 词英文 Image Prompt**,使用以下结构:
|
||||
|
||||
```
|
||||
[KF# | shot type code | story beat name]
|
||||
- Composition: subject placement (center/rule-of-thirds/off-center), foreground/mid/background layers, leading lines, gaze direction
|
||||
- Action/beat: what visibly happens (simple, executable, one sentence)
|
||||
- Camera: height (eye-level/low/high/worm's-eye), angle, movement type and amount
|
||||
- Lens/DoF: focal length (mm), DoF (shallow/medium/deep), focus target
|
||||
- Lighting: key light direction, shadow quality (hard/soft), highlight emphasis
|
||||
- Grade: shot on [camera + lens], [film stock], [2-3 specific artifacts e.g. film grain/scan lines/light leaks], [color temperature]
|
||||
```
|
||||
|
||||
### Shot Type 景别代码
|
||||
|
||||
| Code | Name | 用途 |
|
||||
|------|------|------|
|
||||
| ELS | Extreme Long Shot | 大全景,极小的主体在环境中 |
|
||||
| LS | Long Shot | 全景,展示完整环境 + 主体 |
|
||||
| MLS | Medium Long Shot | 中全景,主体占 30-40% |
|
||||
| MS | Medium Shot | 中景,主体占 40-60% |
|
||||
| MCU | Medium Close-Up | 近景,主体占 60-80% |
|
||||
| CU | Close-Up | 特写,主体填满画面 |
|
||||
| ECU | Extreme Close-Up | 大特写,材质/纹理细节 |
|
||||
| Low | Low Angle | 低角度仰拍 |
|
||||
| High | High Angle | 高角度俯拍 |
|
||||
| Insert | Insert Shot | 插入镜头(细节/道具) |
|
||||
|
||||
---
|
||||
|
||||
## 9 帧分布参考
|
||||
|
||||
| 故事弧线 | KF# | 景别 | 功能 |
|
||||
|---------|------|------|------|
|
||||
| Atmosphere | KF1 | LS | 纯环境建立,**产品不出现**,展示"正常世界" |
|
||||
| Tension | KF2 | MS | 环境中出现微妙异常——裂缝、阴影、不自然的静止 |
|
||||
| Hint | KF3 | MCU | 产品的第一个线索——影子、反射、局部轮廓、材质痕迹 |
|
||||
| Reveal | KF4 | LS/MS | 产品以不可能的方式完整登场——延迟揭示的 payoff |
|
||||
| Product Detail | KF5 | CU | 产品材质/纹理特写,85mm 浅景深 |
|
||||
| Escalation | KF6 | MS | 环境回应产品存在,荒诞事件开始 |
|
||||
| Climax | KF7 | LS | 最大视觉冲击,全景展示完整影响 |
|
||||
| Product Detail | KF8 | ECU | 第二个产品特写,不同角度/细节 |
|
||||
| Payoff | KF9 | MS | 收尾定格,品牌名融入场景 |
|
||||
|
||||
**Hard requirements**:
|
||||
- 必须包含:1 个建立环境的全景(LS),1 个亲密特写(CU),1 个极端细节(ECU),1 个力量角度镜头(Low/High)
|
||||
- 相邻面板景别不重复
|
||||
- 编辑驱动的连续性:动作延续、一致的画面方向
|
||||
|
||||
---
|
||||
|
||||
## Continuity Rules(连续性规则)
|
||||
|
||||
**可以变的**:动作、表情、走位、构图、角度、镜头运动
|
||||
|
||||
**不能变的**:
|
||||
1. 主体外观(材质/颜色/形态/比例)
|
||||
2. 环境设定(同一空间,同一背景元素)
|
||||
3. 光影风格(同一时间段,同一主光方向)
|
||||
4. 色彩基调(同一 cinematic color grade)
|
||||
5. Visual Medium artifacts(同一胶片/介质特征)
|
||||
|
||||
**额外约束**:
|
||||
- 不引入参考图/前序面板中不存在的新角色/物体
|
||||
- 需要张力时,用画外暗示(阴影、声音、反射、遮挡、目光方向)
|
||||
- DoF 随景别真实变化:全景深(LS),浅景深+自然虚化(CU/ECU)
|
||||
|
||||
---
|
||||
|
||||
## Grid Requirements(网格要求)
|
||||
|
||||
1. 单张主图包含所有 keyframe 作为独立面板(3×3 九宫格)
|
||||
2. 每个面板标注:KF 编号 + 景别(标签在安全边距内,不覆盖主体)
|
||||
3. 所有面板严格连续性(参照 Continuity Rules)
|
||||
4. DoF 随景别真实变化(全景深 → 浅景深)
|
||||
|
||||
---
|
||||
|
||||
## Visual Delta 规则
|
||||
|
||||
每个 Visual Delta 必须回答:**"如果把两张图并排放,观众 1 秒内能看出什么不同?"**
|
||||
|
||||
合格的 Visual Delta 示例:
|
||||
- "地面从干净水泥变成 60% 被绿色植被覆盖"
|
||||
- "产品周围新增 5-6 个同方向倾斜的物体"
|
||||
- "景别从全景切到产品表面材质的大特写"
|
||||
- "画面从单一产品变成 20+ 个同类产品填满货架"
|
||||
|
||||
不合格的 Visual Delta:
|
||||
- "氛围更紧张" ← 不可见
|
||||
- "变化加剧" ← 太模糊
|
||||
- "光线变暖" ← 差异太小
|
||||
|
||||
---
|
||||
|
||||
## 人脸规避规则(Seedance 安全)
|
||||
|
||||
Seedance 2.0 对正面人脸极度敏感,会直接拒绝生成。所有分镜图必须遵守:
|
||||
- **禁止正面人脸**:不出现可辨识的五官(眼睛、鼻子、嘴巴)
|
||||
- 需要人物时,使用:背影(`seen from behind`)、侧影剪影(`silhouette`)、局部肢体(`hands only`, `feet walking`)、远景小人(`tiny figure in the distance`)
|
||||
- 用物体代替人物传达故事:鞋子自己转向、杯子自己移动、衣服悬浮
|
||||
- Prompt 中主动写入 `no visible face, no facial features, seen from behind`
|
||||
|
||||
---
|
||||
|
||||
## 品牌文字规则
|
||||
|
||||
- 仅最后一帧(KF9 / Payoff)的 Image Prompt 中包含品牌名/slogan
|
||||
- **品牌名必须融入场景**:刻在表面(engraved)、投影在墙上(projected)、印在材料中(printed)、浮雕在环境表面(embossed),**禁止悬浮文字**
|
||||
- **字体必须匹配产品调性**:在 prompt 中指定艺术字体风格——奢侈品用衬线体(`elegant serif lettering`)、潮牌用粗体无衬线(`bold sans-serif block letters`)、手工品牌用手写体(`handwritten script`)、科技品牌用等宽几何体(`geometric monospace type`)。禁止默认字体,禁止无风格描述的裸文字
|
||||
- 在 prompt 中描述文字作为场景元素的存在方式,包含字体风格描述
|
||||
- KF1-8 的描述中禁止包含任何文字
|
||||
- Panel 9 的品牌名在九宫格中一次性生成,渲染效果不佳时可单独用 `qwen_image_generation` 重新生成
|
||||
@@ -0,0 +1,138 @@
|
||||
# Surreal Concept Examples - 超现实创意概念示例
|
||||
|
||||
## 目录
|
||||
|
||||
1. [鞋类 / 运动鞋](#鞋类--运动鞋)
|
||||
2. [香水 / 美妆](#香水--美妆)
|
||||
3. [科技产品 / 耳机](#科技产品--耳机)
|
||||
4. [食品 / 烘焙](#食品--烘焙)
|
||||
5. [手表 / 配饰](#手表--配饰)
|
||||
|
||||
---
|
||||
|
||||
按产品品类分类的超现实概念参考。每个示例展示完整的创意维度、场景反差(图片)和内容反差(视频冲突弧线)。
|
||||
|
||||
---
|
||||
|
||||
## 鞋类 / 运动鞋
|
||||
|
||||
### Concept: 巨型运动鞋矗立在城市广场
|
||||
|
||||
**Creative Seed**: Form — 鞋的体积与比例
|
||||
**Creative Dimension**: Physical Impossibility — 违背尺度物理定律
|
||||
**Emotional Tone**: Playful(玩味)
|
||||
|
||||
**Scene(场景反差)**: 一双巨大的红色运动鞋放在城市广场中央,行人如蚂蚁般从旁边走过,干净整洁的现代城市背景。
|
||||
|
||||
**Conflict(内容反差)**:
|
||||
- Setup: 巨型运动鞋静静矗立在广场上,行人正常走动
|
||||
- Escalation: 一辆大型吊车试图将运动鞋吊起移走,钢缆绷紧到极限
|
||||
- Payoff: 钢缆断裂弹开,吊车被反作用力拖动滑行,运动鞋纹丝不动
|
||||
- Brand Message: [品牌] — 不可撼动
|
||||
|
||||
**Visual Style**: Contax T3, Zeiss Sonnar 35mm f/2.8, cross-processed Velvia, 闪光灯直打, 轻微过曝
|
||||
|
||||
**Key Frame Prompt**:
|
||||
```
|
||||
A massive oversized red sneaker placed in the center of a clean minimalist city plaza, tiny people walking around it like ants, the sneaker towers at 3 stories tall, cool desaturated tones with steel gray buildings and deep navy sky, the red sneaker is the only high-saturation accent, low angle looking up at the giant shoe, shot on Contax T3, Zeiss Sonnar 35mm f/2.8, cross-processed Velvia color palette, slight overexposure, casual snapshot aesthetic, editorial photography, no text, no watermark, no logo
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 香水 / 美妆
|
||||
|
||||
### Concept: 香水瓶从冰川中升起
|
||||
|
||||
**Creative Seed**: Material — 玻璃的通透与冰的质感
|
||||
**Creative Dimension**: Material Metamorphosis — 冰与玻璃的材质转化
|
||||
**Emotional Tone**: Sublime(庄严)
|
||||
|
||||
**Scene(场景反差)**: 香水瓶从一块正在融化的冰川中浮出水面,碎冰漂浮在周围,干净的白色空间。
|
||||
|
||||
**Conflict(内容反差)**:
|
||||
- Setup: 香水瓶半嵌在巨大的冰块中,周围是寂静的白色空间
|
||||
- Escalation: 冰块开始剧烈碎裂,大块冰川崩塌坠落,水花四溅
|
||||
- Payoff: 所有冰块碎裂殆尽化为水,香水瓶完美悬浮在空中,滴水未沾
|
||||
- Brand Message: [品牌] — 经历一切,依然纯净
|
||||
|
||||
**Visual Style**: Mamiya RZ67, 110mm f/2.8, Fujifilm Pro 400H, 冷调柔和, 胶片颗粒
|
||||
|
||||
**Key Frame Prompt**:
|
||||
```
|
||||
A luxury perfume bottle emerging from a melting glacier block in a clean white studio space, ice cracking to reveal the golden glass bottle, cool desaturated blue-white ice tones contrasting with warm amber bottle, water droplets frozen mid-air, centered composition, shot on Mamiya RZ67, 110mm f/2.8, Fujifilm Pro 400H cool tones, film grain, soft highlight bloom, Tim Walker fantastical editorial aesthetic, no text, no watermark, no logo
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 科技产品 / 耳机
|
||||
|
||||
### Concept: 耳机从像素化弹窗中浮出
|
||||
|
||||
**Creative Seed**: Function — 无线连接、数字与现实的边界
|
||||
**Creative Dimension**: Temporal Paradox — 复古数码与现代科技的时间错位
|
||||
**Emotional Tone**: Provocative(冒犯)
|
||||
|
||||
**Scene(场景反差)**: 耳机从一个 Windows 98 风格的弹窗中半伸出来,悬浮在真实的办公桌上方。
|
||||
|
||||
**Conflict(内容反差)**:
|
||||
- Setup: 耳机悬浮在复古弹窗前方,办公室安静整洁
|
||||
- Escalation: 屏幕上突然弹出无数报错弹窗和蓝屏死机,系统崩溃,像素化碎片向耳机飞来
|
||||
- Payoff: 所有数字碎片撞到耳机时被吸收消解,耳机完好无损,LED指示灯平静闪烁
|
||||
- Brand Message: [品牌] — 噪音终结者
|
||||
|
||||
**Visual Style**: Canon AE-1, FD 50mm f/1.4, Lomography Color 400, 漏光偏色, 柔焦
|
||||
|
||||
**Key Frame Prompt**:
|
||||
```
|
||||
Wireless earbuds floating out of a Windows 98 style dialog box hovering above a minimalist office desk, retro pixelated UI contrasts with sleek modern earbuds, CRT monitor glow effect, cool desaturated office in steel gray and off-white, matte black earbuds with green LED accent, centered composition, shot on Canon AE-1, FD 50mm f/1.4, Lomography Color 400 palette, light leaks, color shifts, Petra Collins dreamy haze aesthetic, no text, no watermark, no logo
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 食品 / 烘焙
|
||||
|
||||
### Concept: 厨师团队制作汽车大小的可颂
|
||||
|
||||
**Creative Seed**: Form — 可颂的层叠结构与比例
|
||||
**Creative Dimension**: Physical Impossibility — 违背尺度物理定律
|
||||
**Emotional Tone**: Playful(玩味)
|
||||
|
||||
**Scene(场景反差)**: 一群穿着白色厨师服的厨师围着一个汽车大小的可颂面包工作,干净的工业厨房。
|
||||
|
||||
**Conflict(内容反差)**:
|
||||
- Setup: 厨师们正在给巨型可颂刷蛋液,一切有序
|
||||
- Escalation: 烤箱突然起火爆炸,火焰冲向巨型可颂,厨房警报大作
|
||||
- Payoff: 火焰接触到可颂表面时立即被酥皮吸收,可颂表面变得更加金黄酥脆,厨师们面不改色继续工作
|
||||
- Brand Message: [品牌] — 经得住烤验
|
||||
|
||||
**Visual Style**: Pentax 67, SMC 105mm f/2.4, Kodak Ektar 100, 高饱和暖调, 硬阴影
|
||||
|
||||
**Key Frame Prompt**:
|
||||
```
|
||||
A group of chefs in white uniforms working around a croissant the size of a car in a clean industrial kitchen, one chef on a ladder brushing egg wash, golden croissant fills most of the frame, cool desaturated steel kitchen, warm golden-brown croissant as focal point, low angle, shot on Pentax 67, SMC 105mm f/2.4, Kodak Ektar 100 saturated warm tones, hard sunlight shadows, Martin Parr documentary aesthetic, no text, no watermark, no logo
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 手表 / 配饰
|
||||
|
||||
### Concept: 猫绅士在会议室看手表
|
||||
|
||||
**Creative Seed**: Function — 查看时间的动作
|
||||
**Creative Dimension**: Context Collision — 动物出现在人类职场环境
|
||||
**Emotional Tone**: Sublime(庄严)
|
||||
|
||||
**Scene(场景反差)**: 一只猫穿着西装坐在会议室里,手腕上戴着手表,正在看时间。
|
||||
|
||||
**Conflict(内容反差)**:
|
||||
- Setup: 猫绅士独自坐在会议桌前,优雅地查看腕表
|
||||
- Escalation: 会议室落地窗外突然暴风骤雨,闪电击中窗玻璃,玻璃碎片飞溅
|
||||
- Payoff: 碎片在猫绅士面前一米处悬停静止,猫不曾抬头,继续看表,玻璃碎片缓缓落地
|
||||
- Brand Message: [品牌] — 掌控时间,无惧一切
|
||||
|
||||
**Visual Style**: Hasselblad 500C/M, Zeiss Planar 80mm f/2.8, Kodak Portra 160, 极浅景深, 自然暗角
|
||||
|
||||
**Key Frame Prompt**:
|
||||
```
|
||||
A cat wearing a tailored navy business suit sitting at a clean minimalist conference table, casually checking a luxury gold watch on its wrist, calm serious expression, cool desaturated corporate interior in steel gray and off-white, gold watch face as the only high-saturation accent, centered composition, shot on Hasselblad 500C/M, Zeiss Planar 80mm f/2.8, Kodak Portra 160 palette, shallow depth of field, natural vignetting, Paolo Roversi diffused ethereal aesthetic, no text, no watermark, no logo
|
||||
```
|
||||
@@ -0,0 +1,73 @@
|
||||
# TVC Creative Concept Template — TVC 创意方案模板
|
||||
|
||||
用户选定 concept option 后,按此模板扩展为完整 TVC 方案,存入 `concept.md`。
|
||||
|
||||
---
|
||||
|
||||
## Step A: Scene Breakdown(场景拆解)
|
||||
|
||||
写分镜前必须先完成场景拆解。详细规范见 `storyboard-rules.md` Scene Breakdown 章节。
|
||||
|
||||
- **Subject**: 产品的可见特征(材质/颜色/形态/关键细节),在画面中的状态
|
||||
- **Environment**: 空间布局,背景元素,地面/墙面/材质
|
||||
- **Lighting**: 光源方向 & 质感(硬/软),暗示的时间段
|
||||
- **Visual Anchors**: 3-6 个必须在所有面板中保持一致的要素(色调、主光源、天气/雾/雨、颗粒/质感、背景标记物、产品外观)
|
||||
|
||||
## Step B: Cinematic Approach(电影手法)
|
||||
|
||||
详细焦距/DoF/镜头运动规范见 `storyboard-rules.md` Cinematic Approach 章节。
|
||||
|
||||
- Shot progression: 如何从全景推到特写服务于情绪节拍
|
||||
- Lens range: 焦距范围(18-85mm),DoF 倾向
|
||||
- Light & color: 对比度,主色调,材质渲染优先级
|
||||
|
||||
## Step C: 9-Frame Keyframes
|
||||
|
||||
每帧是一段 **80-120 词的英文 Image Prompt**。格式规范见 `storyboard-rules.md` Keyframe Format 章节。
|
||||
|
||||
---
|
||||
|
||||
## concept.md 输出格式
|
||||
|
||||
```markdown
|
||||
# TVC Creative Concept — [Brand Name]
|
||||
|
||||
## Creative Direction
|
||||
The Impossible Thing: [one sentence]
|
||||
Creative Dimension: [dimension]
|
||||
Emotional Tone: [tone]
|
||||
Visual Medium: [from references/photography-styles.md]
|
||||
Visual Style: [camera + lens + film stock + imperfections]
|
||||
|
||||
## Scene Breakdown
|
||||
Subject: [product visible traits]
|
||||
Environment: [spatial layout, materials, background]
|
||||
Lighting: [direction, quality, time of day]
|
||||
Visual Anchors: [3-6 constants across all panels]
|
||||
|
||||
## Story Arc
|
||||
[3-5 sentences — complete narrative]
|
||||
|
||||
## 9-Frame Storyboard
|
||||
|
||||
**每帧末尾必须包含 Grade 行**,写明具体设备和胶片:`shot on [camera], [lens], [film stock], [2-3 artifacts]`。不写 Grade = 不合格。
|
||||
|
||||
### KF1 | LS | Atmosphere
|
||||
[80-120 words: Composition + Action + Camera/Lens/DoF + Lighting. NO product. Grade: shot on ...]
|
||||
### KF2 | MS | Tension
|
||||
[Subtle anomaly. Camera pushes in. Lighting shifts. Grade: shot on ...]
|
||||
### KF3 | MCU | Hint
|
||||
[First product clue — shadow/reflection/partial. Shallow DoF on clue. Grade: shot on ...]
|
||||
### KF4 | LS/MS | Reveal
|
||||
[Product appears impossibly. Wide to show context. Power angle. Grade: shot on ...]
|
||||
### KF5 | CU | Product Detail
|
||||
[Macro detail. 85mm, f/2.8 shallow DoF. Material texture. Grade: shot on ...]
|
||||
### KF6 | MS | Escalation
|
||||
[Environment responds. Progressive change. Camera tracks. Grade: shot on ...]
|
||||
### KF7 | LS | Climax
|
||||
[Maximum surreal intensity. Wide to show full impact. Grade: shot on ...]
|
||||
### KF8 | ECU | Product Detail
|
||||
[Different angle. Craftsmanship. Extreme shallow DoF. Grade: shot on ...]
|
||||
### KF9 | MS | Payoff
|
||||
[Brand name as physical scene element, in stylized typography matching product tone (e.g. elegant serif / bold sans-serif / handwritten script / geometric monospace). Final composition. Grade: shot on ...]
|
||||
```
|
||||
@@ -0,0 +1,183 @@
|
||||
# Video Motion Prompt Rewrite Guide — 视频动态提示词重写指南
|
||||
|
||||
## 目录
|
||||
|
||||
1. [核心原则](#核心原则)
|
||||
2. [视频模型能力边界](#视频模型能力边界)
|
||||
3. [Prompt 语言规范](#prompt-语言规范)
|
||||
4. [三种冲突类型的视觉翻译](#三种冲突类型的视觉翻译)
|
||||
5. [Transition Effects](#transition-effects转场特效词库)
|
||||
6. [输入输出格式](#输入输出格式)
|
||||
7. [时长与密度对照](#时长与密度对照)
|
||||
|
||||
---
|
||||
|
||||
你是一个视频提示词工程师。你的任务是把创意概念翻译成 AI 视频模型可以执行的逐帧视觉动作描述。
|
||||
|
||||
## 核心原则
|
||||
|
||||
**你写的不是故事,是一组视觉指令。** 视频模型没有叙事理解能力,它只能渲染可见的物理变化。每一句话都必须描述镜头里观众能看到的东西。
|
||||
|
||||
---
|
||||
|
||||
## 视频模型能力边界
|
||||
|
||||
### 能做好的(高成功率)
|
||||
|
||||
| 类型 | 示例 |
|
||||
|------|------|
|
||||
| 自然生长 | 植物从缝隙中长出、藤蔓蔓延、花朵绽放 |
|
||||
| 物质扩散 | 液体流淌、烟雾弥漫、光线扩散、颜色渗透 |
|
||||
| 粒子运动 | 碎片飞散、灰尘飘落、光斑漂浮、雪花飘落 |
|
||||
| 环境变化 | 光影推移、天色变化、风吹动物体 |
|
||||
| 材质转化 | 冰融化、石化、金属氧化、表面结霜 |
|
||||
| 简单运动 | 物体缓慢旋转、漂浮、下沉、倾斜 |
|
||||
| 相机运动 | 推拉摇移、环绕、升降 |
|
||||
|
||||
### 做不到的(必须避免)
|
||||
|
||||
| 类型 | 为什么 |
|
||||
|------|--------|
|
||||
| 因果推理 | "卡车撞到沙发但沙发没事" — 模型不懂"撞了但没坏"的因果 |
|
||||
| 多角色交互 | "路人依次模仿同一个姿势" — 模型无法协调多个主体的行为 |
|
||||
| 突然出现/消失 | "一辆卡车冲进画面" — 模型倾向于让物体一开始就在画面中 |
|
||||
| 情感表达 | "男人露出惊讶的表情" — 模型控制不了面部微表情 |
|
||||
| 文字变化 | "屏幕上弹出错误提示" — 模型不能生成可读文字 |
|
||||
| 物理碰撞 | "物体A撞击物体B" — 碰撞的瞬间形变和反弹模型处理不了 |
|
||||
| 时间跳跃 | "几秒后..." — 模型只做连续变化,不做跳切 |
|
||||
|
||||
---
|
||||
|
||||
## Prompt 语言规范
|
||||
|
||||
### 用视觉动词,不用叙事动词
|
||||
|
||||
| 不要写(叙事) | 要写(视觉) |
|
||||
|---------------|-------------|
|
||||
| The sofa survives the impact | The sofa remains perfectly still, not a single cushion shifts |
|
||||
| People are attracted to the product | Pedestrians slow down, stop walking, turn heads toward the object |
|
||||
| The jeans transform the environment | Green shoots push through the denim seams, vines crawl along the legs, spreading onto the concrete floor |
|
||||
| Time passes | Shadows lengthen across the floor, light shifts from warm to cool |
|
||||
| The scene becomes chaotic | Dust swirls upward, papers scatter, small objects slide across surfaces |
|
||||
|
||||
### 描述顺序
|
||||
|
||||
每个 prompt 按时间线组织,用分号或句号分隔阶段:
|
||||
|
||||
```
|
||||
[静态起始状态,2-3句]. [第一个可见变化]. [变化加剧/扩散]. [最终定格画面]. [相机和风格后缀]
|
||||
```
|
||||
|
||||
### 禁止出现的词
|
||||
|
||||
- 叙事词:realizes, decides, survives, despite, although, because, suddenly
|
||||
- 抽象词:meaning, symbolizing, representing, metaphor
|
||||
- 情感词:feels, thinks, wants, surprised, amazed
|
||||
- 时间跳跃:later, after, then suddenly, moments pass
|
||||
|
||||
---
|
||||
|
||||
## 三种冲突类型的视觉翻译
|
||||
|
||||
### 1. 威胁免疫型 → 翻译为「外力作用 + 主体静止」
|
||||
|
||||
**核心视觉**:环境剧烈变化,产品/场景纹丝不动。
|
||||
|
||||
**翻译策略**:不要描述"撞击",而是描述环境的剧变和产品的绝对静止形成反差。
|
||||
|
||||
❌ 错误写法:
|
||||
> A truck crashes into the sofa but the sofa is undamaged.
|
||||
|
||||
✅ 正确写法:
|
||||
> A man sits on a velvet sofa on an empty concrete surface, drinking coffee, steam rising gently. Strong wind begins blowing from the left, dust and debris sweep across the ground. The wind intensifies — newspapers, plastic bags, leaves fly past violently. The man's hair does not move. The coffee steam rises perfectly vertical. A massive shadow sweeps across the ground from left to right. Dust clouds fill the background. When the dust clears, the sofa sits in the exact same position, coffee cup undisturbed, steam still rising straight up. Shot on Hasselblad 500C/M, Zeiss Planar 80mm f/2.8, Kodak Portra 160, shallow depth of field. Single continuous shot, static camera.
|
||||
|
||||
**关键技法**:
|
||||
- 用风、灰尘、阴影暗示外力,不直接展示碰撞
|
||||
- 反复强调产品的静止细节(蒸汽垂直、头发不动、杯子没洒)
|
||||
- 环境变化要渐进加剧,给模型渲染时间
|
||||
|
||||
### 2. 荒诞演变型 → 翻译为「渐进生长 / 材质扩散」
|
||||
|
||||
**核心视觉**:从产品出发,一种变化逐步蔓延到整个画面。
|
||||
|
||||
**翻译策略**:这是视频模型最擅长的类型。描述一个起点和扩散路径即可。
|
||||
|
||||
❌ 错误写法:
|
||||
> The jeans transform the entire factory into a garden.
|
||||
|
||||
✅ 正确写法:
|
||||
> A pair of denim jeans lies flat on a cracked concrete floor in an empty industrial space, natural light from high windows. A tiny green sprout pushes through the stitching at the knee. More shoots emerge along the seams — small leaves unfurl from the pockets. Thin vines crawl down the legs onto the concrete, spreading outward. The vines accelerate, cracks in the floor widen as roots push through. Green spreads across the floor toward the walls. Ivy begins climbing the nearest rusted steel beam. The lower half of the frame fills with dense foliage, wildflowers blooming in clusters. The jeans remain at the center, now draped in flowers and leaves like a garden centerpiece. Shot on Mamiya RZ67, 110mm f/2.8, Fujifilm Pro 400H cool tones, film grain. Single continuous shot, slow push-in.
|
||||
|
||||
**关键技法**:
|
||||
- 从一个精确的起点开始("at the knee", "from the pockets")
|
||||
- 描述扩散路径(seams → legs → floor → walls → beams)
|
||||
- 速度渐进加快(tiny sprout → vines crawl → accelerate → fills)
|
||||
- 产品始终在画面中心
|
||||
|
||||
### 3. 行为传染型 → 翻译为「重复动作 + 画面填充」
|
||||
|
||||
**核心视觉**:一个动作/状态从产品传染到周围元素。
|
||||
|
||||
**翻译策略**:这是最难的类型。避免多角色复杂交互,改用**物体**代替**人物**,用简单重复代替复杂行为。
|
||||
|
||||
❌ 错误写法:
|
||||
> Pedestrians one by one stop and lean against the wall in the same pose as the man.
|
||||
|
||||
✅ 正确写法(物体替代人物版):
|
||||
> A single red sneaker sits on a clean white shelf in a minimalist shoe store. The camera holds static. The sneaker on the adjacent shelf slowly rotates to face the same direction. Then the next one. One by one, every shoe on every shelf rotates to point toward the red sneaker, like compass needles finding north. The rotation ripples outward row by row — nearby shelves first, then farther ones. The entire store's inventory now faces the red sneaker. The red sneaker sits unchanged at the center. Shot on Contax T3, Zeiss Sonnar 35mm, cross-processed Velvia, slight overexposure. Single continuous shot, static camera.
|
||||
|
||||
**关键技法**:
|
||||
- 用物体代替人物(鞋子转向 vs 路人模仿)
|
||||
- 重复同一个简单动作(旋转),不是多种不同行为
|
||||
- 波纹式扩散(nearby → farther),给模型清晰的空间顺序
|
||||
- 产品是"传染源",保持不动
|
||||
|
||||
---
|
||||
|
||||
## 输入输出格式
|
||||
|
||||
### 输入
|
||||
|
||||
你会收到:
|
||||
1. **首帧图描述** — 对实际生成的首帧图的客观描述(来自 read_media)
|
||||
2. **产品信息** — 品牌、品类、关键视觉特征
|
||||
3. **创意概念** — 冲突类型、场景反差、内容反差的创意描述
|
||||
4. **视觉风格** — 相机、镜头、胶片、瑕疵特征
|
||||
5. **视频时长** — 目标秒数
|
||||
|
||||
### 输出
|
||||
|
||||
一段英文 motion prompt,格式:
|
||||
|
||||
```
|
||||
[对首帧静态场景的精确描述,与实际生成的图一致,2-3句].
|
||||
[转场特效(匹配 Visual Medium)— e.g. "A brief white flash fills the frame, then clears —"]
|
||||
[第一个可见变化,精确到位置和动作].
|
||||
[变化加剧/扩散,描述路径和速度].
|
||||
[转场特效(可选)— e.g. "The image fragments into pixel blocks for a split second, snaps back —"]
|
||||
[最终定格画面,产品居中,变化完成].
|
||||
Shot on [camera], [lens], [film stock], [imperfections]. Single continuous shot, [camera movement or static].
|
||||
```
|
||||
|
||||
### 输出检查清单
|
||||
|
||||
- [ ] 每一句都描述可见的物理变化?(无叙事词、无情感词、无抽象词)
|
||||
- [ ] 有清晰的起点位置?("at the knee", "from the left edge")
|
||||
- [ ] 变化是渐进的?(不是突然发生)
|
||||
- [ ] 产品始终在画面中心或显著位置?
|
||||
- [ ] 最终画面是一个可以截图的强构图?
|
||||
- [ ] 没有要求模型做多角色交互或因果推理?
|
||||
- [ ] 相机/镜头/胶片信息完整?
|
||||
- [ ] 整段不超过 150 词?(太长模型会忽略后半段)
|
||||
|
||||
---
|
||||
|
||||
## 时长与密度对照
|
||||
|
||||
| 时长 | 变化密度 | 建议 |
|
||||
|------|---------|------|
|
||||
| 5s | 1 个变化,简单直接 | 单一生长/扩散/旋转 |
|
||||
| 8-10s | 1 个变化 + 加速阶段 | 起始慢 → 中间加速 → 结尾定格 |
|
||||
| 12-15s | 1 个变化 + 加速 + 扩散到环境 | 产品起始 → 扩散到周围 → 填满画面 |
|
||||
|
||||
**铁律**:不管多长的视频,只描述**一个**核心变化。多个变化 = 模型混乱。
|
||||
@@ -0,0 +1,116 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Dynamic poster brief validator.
|
||||
Validates the format and content of a poster brief file.
|
||||
|
||||
Usage:
|
||||
python3 validate_poster_brief.py <brief_path>
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def validate_brief(brief_path: str) -> tuple[bool, list[str]]:
|
||||
"""Validate a dynamic poster brief file. Returns (passed, errors)."""
|
||||
errors = []
|
||||
warnings = []
|
||||
path = Path(brief_path)
|
||||
|
||||
if not path.exists():
|
||||
return False, [f"File not found: {brief_path}"]
|
||||
|
||||
content = path.read_text(encoding="utf-8")
|
||||
|
||||
# --- Required fields ---
|
||||
required_fields = {
|
||||
"Brand": r"Brand\s*[::]\s*\S+",
|
||||
"Product Category": r"Product Category\s*[::]\s*\S+",
|
||||
"Brand Colors": r"Brand Colors\s*[::]\s*\S+",
|
||||
"Product Texture": r"Product Texture\s*[::]\s*\S+",
|
||||
"Key Visual Elements": r"Key Visual Elements\s*[::]\s*\S+",
|
||||
}
|
||||
|
||||
for field, pattern in required_fields.items():
|
||||
if not re.search(pattern, content):
|
||||
errors.append(f"Missing or empty required field: {field}")
|
||||
|
||||
# --- Brand Colors validation ---
|
||||
color_match = re.search(r"Brand Colors\s*[::]\s*(.+)", content)
|
||||
if color_match:
|
||||
color_line = color_match.group(1)
|
||||
hex_colors = re.findall(r"#[0-9A-Fa-f]{6}", color_line)
|
||||
if not hex_colors:
|
||||
errors.append(
|
||||
"Brand Colors must include at least one hex color value (e.g., #2D5A3D)"
|
||||
)
|
||||
|
||||
# --- Aspect Ratio validation ---
|
||||
ratio_match = re.search(r"Aspect Ratio\s*[::]\s*(.+)", content)
|
||||
if ratio_match:
|
||||
ratio = ratio_match.group(1).strip()
|
||||
valid_ratios = {"9:16", "16:9", "4:5", "1:1"}
|
||||
if ratio not in valid_ratios:
|
||||
warnings.append(
|
||||
f"Aspect Ratio '{ratio}' not standard. Expected: {', '.join(sorted(valid_ratios))}"
|
||||
)
|
||||
|
||||
# --- Logo fields (optional but validate if present) ---
|
||||
logo_match = re.search(r"Logo Type\s*[::]\s*(.+)", content)
|
||||
if logo_match:
|
||||
logo_type = logo_match.group(1).strip().lower()
|
||||
valid_logo_types = {"wordmark", "icon", "combo", "none"}
|
||||
if not any(lt in logo_type for lt in valid_logo_types):
|
||||
warnings.append(
|
||||
f"Logo Type '{logo_match.group(1).strip()}' not recognized. "
|
||||
f"Expected: {', '.join(sorted(valid_logo_types))}"
|
||||
)
|
||||
|
||||
# --- Creative Concept validation (if present in same file) ---
|
||||
has_concept = "# Creative Concept" in content or "# Selected Concept" in content
|
||||
if has_concept:
|
||||
if not re.search(r"Creative Dimension\s*[::]\s*\S+", content):
|
||||
errors.append("Creative Concept found but missing 'Creative Dimension'")
|
||||
if not re.search(r"The Impossible Thing\s*[::]\s*\S+", content):
|
||||
errors.append("Creative Concept found but missing 'The Impossible Thing'")
|
||||
if not re.search(r"Conflict", content):
|
||||
warnings.append("Creative Concept missing conflict arc (Setup → Escalation → Payoff)")
|
||||
|
||||
passed = len(errors) == 0
|
||||
return passed, errors + [f"WARNING: {w}" for w in warnings]
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Validate dynamic poster brief format")
|
||||
parser.add_argument("brief_path", help="Path to the brief.md file")
|
||||
args = parser.parse_args()
|
||||
|
||||
passed, messages = validate_brief(args.brief_path)
|
||||
|
||||
errors = [m for m in messages if not m.startswith("WARNING:")]
|
||||
warnings = [m for m in messages if m.startswith("WARNING:")]
|
||||
|
||||
if passed:
|
||||
print("PASSED: Brief validation successful")
|
||||
print(f" File: {args.brief_path}")
|
||||
if warnings:
|
||||
print(f" Warnings: {len(warnings)}")
|
||||
for w in warnings:
|
||||
print(f" - {w}")
|
||||
sys.exit(0)
|
||||
else:
|
||||
print(f"FAILED: Brief validation found {len(errors)} error(s)")
|
||||
print(f" File: {args.brief_path}")
|
||||
for i, err in enumerate(errors, 1):
|
||||
print(f" {i}. {err}")
|
||||
if warnings:
|
||||
print(f" Warnings:")
|
||||
for w in warnings:
|
||||
print(f" - {w}")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,116 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Dynamic poster brief validator.
|
||||
Validates the format and content of a poster brief file.
|
||||
|
||||
Usage:
|
||||
python3 validate_poster_brief.py <brief_path>
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def validate_brief(brief_path: str) -> tuple[bool, list[str]]:
|
||||
"""Validate a dynamic poster brief file. Returns (passed, errors)."""
|
||||
errors = []
|
||||
warnings = []
|
||||
path = Path(brief_path)
|
||||
|
||||
if not path.exists():
|
||||
return False, [f"File not found: {brief_path}"]
|
||||
|
||||
content = path.read_text(encoding="utf-8")
|
||||
|
||||
# --- Required fields ---
|
||||
required_fields = {
|
||||
"Brand": r"Brand\s*[::]\s*\S+",
|
||||
"Product Category": r"Product Category\s*[::]\s*\S+",
|
||||
"Brand Colors": r"Brand Colors\s*[::]\s*\S+",
|
||||
"Product Texture": r"Product Texture\s*[::]\s*\S+",
|
||||
"Key Visual Elements": r"Key Visual Elements\s*[::]\s*\S+",
|
||||
}
|
||||
|
||||
for field, pattern in required_fields.items():
|
||||
if not re.search(pattern, content):
|
||||
errors.append(f"Missing or empty required field: {field}")
|
||||
|
||||
# --- Brand Colors validation ---
|
||||
color_match = re.search(r"Brand Colors\s*[::]\s*(.+)", content)
|
||||
if color_match:
|
||||
color_line = color_match.group(1)
|
||||
hex_colors = re.findall(r"#[0-9A-Fa-f]{6}", color_line)
|
||||
if not hex_colors:
|
||||
errors.append(
|
||||
"Brand Colors must include at least one hex color value (e.g., #2D5A3D)"
|
||||
)
|
||||
|
||||
# --- Aspect Ratio validation ---
|
||||
ratio_match = re.search(r"Aspect Ratio\s*[::]\s*(.+)", content)
|
||||
if ratio_match:
|
||||
ratio = ratio_match.group(1).strip()
|
||||
valid_ratios = {"9:16", "16:9", "4:5", "1:1"}
|
||||
if ratio not in valid_ratios:
|
||||
warnings.append(
|
||||
f"Aspect Ratio '{ratio}' not standard. Expected: {', '.join(sorted(valid_ratios))}"
|
||||
)
|
||||
|
||||
# --- Logo fields (optional but validate if present) ---
|
||||
logo_match = re.search(r"Logo Type\s*[::]\s*(.+)", content)
|
||||
if logo_match:
|
||||
logo_type = logo_match.group(1).strip().lower()
|
||||
valid_logo_types = {"wordmark", "icon", "combo", "none"}
|
||||
if not any(lt in logo_type for lt in valid_logo_types):
|
||||
warnings.append(
|
||||
f"Logo Type '{logo_match.group(1).strip()}' not recognized. "
|
||||
f"Expected: {', '.join(sorted(valid_logo_types))}"
|
||||
)
|
||||
|
||||
# --- Creative Concept validation (if present in same file) ---
|
||||
has_concept = "# Creative Concept" in content or "# Selected Concept" in content
|
||||
if has_concept:
|
||||
if not re.search(r"Creative Dimension\s*[::]\s*\S+", content):
|
||||
errors.append("Creative Concept found but missing 'Creative Dimension'")
|
||||
if not re.search(r"The Impossible Thing\s*[::]\s*\S+", content):
|
||||
errors.append("Creative Concept found but missing 'The Impossible Thing'")
|
||||
if not re.search(r"Conflict", content):
|
||||
warnings.append("Creative Concept missing conflict arc (Setup → Escalation → Payoff)")
|
||||
|
||||
passed = len(errors) == 0
|
||||
return passed, errors + [f"WARNING: {w}" for w in warnings]
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Validate dynamic poster brief format")
|
||||
parser.add_argument("brief_path", help="Path to the brief.md file")
|
||||
args = parser.parse_args()
|
||||
|
||||
passed, messages = validate_brief(args.brief_path)
|
||||
|
||||
errors = [m for m in messages if not m.startswith("WARNING:")]
|
||||
warnings = [m for m in messages if m.startswith("WARNING:")]
|
||||
|
||||
if passed:
|
||||
print("PASSED: Brief validation successful")
|
||||
print(f" File: {args.brief_path}")
|
||||
if warnings:
|
||||
print(f" Warnings: {len(warnings)}")
|
||||
for w in warnings:
|
||||
print(f" - {w}")
|
||||
sys.exit(0)
|
||||
else:
|
||||
print(f"FAILED: Brief validation found {len(errors)} error(s)")
|
||||
print(f" File: {args.brief_path}")
|
||||
for i, err in enumerate(errors, 1):
|
||||
print(f" {i}. {err}")
|
||||
if warnings:
|
||||
print(f" Warnings:")
|
||||
for w in warnings:
|
||||
print(f" - {w}")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Binary file not shown.
Reference in New Issue
Block a user