@optima-chat/gen-cli 2.3.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/digital-human/SKILL.md +131 -17
- package/.claude/skills/digital-human/references/edit.md +121 -100
- package/.claude/skills/digital-human/references/generate.md +256 -124
- package/.claude/skills/digital-human/references/manage.md +28 -17
- package/.claude/skills/digital-human/references/train.md +47 -62
- package/.claude/skills/gen/SKILL.md +13 -0
- package/.claude/skills/motion-control/SKILL.md +68 -0
- package/.claude/skills/video-compose/SKILL.md +144 -0
- package/.claude/skills/video-compose/scripts/video_compose.py +290 -0
- package/.claude/skills/video-edit/SKILL.md +62 -1
- package/.claude/skills/video-gen/SKILL.md +165 -57
- package/.claude/skills/video-gen/references/cinematic-language.md +158 -0
- package/.claude/skills/video-gen/references/confirm-card.md +49 -0
- package/.claude/skills/video-gen/references/prompt-craft.md +72 -0
- package/.claude/skills/video-translate/SKILL.md +205 -69
- package/assets/video-compose/bgm-library/SOURCES.md +25 -0
- package/assets/video-compose/bgm-library/calm/calm-01.mp3 +0 -0
- package/assets/video-compose/bgm-library/calm/calm-02.mp3 +0 -0
- package/assets/video-compose/bgm-library/dramatic/dramatic-01.mp3 +0 -0
- package/assets/video-compose/bgm-library/dramatic/dramatic-02.mp3 +0 -0
- package/assets/video-compose/bgm-library/energetic/energetic-01.mp3 +0 -0
- package/assets/video-compose/bgm-library/energetic/energetic-02.mp3 +0 -0
- package/assets/video-compose/bgm-library/sad/sad-01.mp3 +0 -0
- package/assets/video-compose/bgm-library/sad/sad-02.mp3 +0 -0
- package/assets/video-compose/bgm-library/upbeat/upbeat-01.mp3 +0 -0
- package/assets/video-compose/bgm-library/upbeat/upbeat-02.mp3 +0 -0
- package/assets/video-compose/bgm-library/warm/warm-01.mp3 +0 -0
- package/assets/video-compose/bgm-library/warm/warm-02.mp3 +0 -0
- package/assets/video-compose/voice-samples/01-/346/270/251/346/232/226/345/260/221/345/245/263.mp3 +0 -0
- package/assets/video-compose/voice-samples/02-/347/224/234/347/276/216/345/245/263/345/243/260.mp3 +0 -0
- package/assets/video-compose/voice-samples/03-/347/224/234/347/276/216/345/205/203/346/260/224.mp3 +0 -0
- package/assets/video-compose/voice-samples/04-/346/270/205/347/224/234/345/260/221/345/245/263.mp3 +0 -0
- package/assets/video-compose/voice-samples/05-/345/276/241/345/247/220.mp3 +0 -0
- package/assets/video-compose/voice-samples/06-/346/210/220/347/206/237/347/237/245/346/200/247.mp3 +0 -0
- package/assets/video-compose/voice-samples/07-/345/245/263/344/270/273/346/222/255.mp3 +0 -0
- package/assets/video-compose/voice-samples/CATALOG.md +9 -0
- package/dist/services/auth.d.ts.map +1 -1
- package/dist/services/auth.js +19 -2
- package/dist/services/auth.js.map +1 -1
- package/package.json +3 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: video-gen
|
|
3
3
|
description: "帮商家用 AI 生成产品视频(社媒投放 / PDP / 复刻爆款)。触发场景:用户说\"给这个产品做条 TikTok 视频/做条小红书种草视频/复刻这条爆款/做条 PDP 展示视频/这产品配一段视频\"——通常附产品图或参考视频。范围:所有\"画面以产品为主体\"的视频。不含\"画面里有真人讲话\"的场景(例:\"用张医生介绍产品\"是数字人意图,不在范围)。"
|
|
4
|
-
version: 1.0
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
owner_repo: Optima-Chat/optima-gen
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -16,8 +16,8 @@ owner_repo: Optima-Chat/optima-gen
|
|
|
16
16
|
1. **User-facing 不出现模型名或服务名**
|
|
17
17
|
status / 成本 / 进度 / 错误 / 总结 统一用"视频生成中"。模型名仅用于 skill 内部路由,**代码注释里的也不能抄给用户**。
|
|
18
18
|
|
|
19
|
-
2.
|
|
20
|
-
任何 `gen video` / `gen image`
|
|
19
|
+
2. **花钱前必过确认卡**
|
|
20
|
+
任何 `gen video` / `gen image` 调用之前必过一次确认卡(见 `references/confirm-card.md`)。**Fast-path、迭代、重试均无例外**(重新 gate 边界见 §执行生成)。**成本由后端 billing 按实际时长扣费——skill 不自行估价、不编单价**;确认卡只列**计费口径**(段数 / 总秒数 / 画质),并标明"实际扣费以 billing 为准、生成后告知"。〔正解:待 billing 报价接口落地后,确认卡调它显示生成前真价;在此之前不显示任何 skill 自算的金额。〕
|
|
21
21
|
|
|
22
22
|
3. **任何 pipeline 第一步必须 Per-video init**
|
|
23
23
|
分析 / Storyboard / Plan / 生成 / Review 执行前先跑 §Per-video init(建目录 + cd)。否则后续 write 写错位置。迭代场景用 `{旧id}-vN`。
|
|
@@ -90,7 +90,7 @@ owner_repo: Optima-Chat/optima-gen
|
|
|
90
90
|
|
|
91
91
|
**社媒 Fast-path 的"爆款发现"不算"问用户"**——agent 自动拉 Top 3 + 展示让用户选 1 条是**必要数据输入**(和"选模板"同级),不是"审批"。用户选条或"跳过"都保持在 Fast-path 内。
|
|
92
92
|
|
|
93
|
-
**Fast-path
|
|
93
|
+
**Fast-path 行为**:原创 Storyboard 展示后告知而非审批;**复刻例外——必过确认卡**(`references/confirm-card.md`)。两种情况**生成前都走确认卡**,确认卡是唯一付费确认点(实扣以 billing 为准)。用户可随时喊停。
|
|
94
94
|
|
|
95
95
|
## First-time init
|
|
96
96
|
|
|
@@ -171,7 +171,7 @@ git add -A && git commit -m "init: video-gen workspace"
|
|
|
171
171
|
2. **调 scout**
|
|
172
172
|
- 平台=TikTok → `scout tiktok search-videos "<关键词>" --region <US|...>`
|
|
173
173
|
- 平台=抖音 → `scout douyin search-videos "<关键词>"` 或 `scout douyin hot-search`(按品类筛)
|
|
174
|
-
- 其他平台:按 scout
|
|
174
|
+
- 其他平台:按 `scout --help` 列出的可用命令对应
|
|
175
175
|
3. **过滤 + 排序**:品牌契合(不违反 preferences.forbidden)+ 产品形态匹配 + 按 likes 降序取 Top 3
|
|
176
176
|
4. **展示 3 个候选**:平台 / 时间 / 指标(点赞 · 分享 · 评论)/ 风格摘要(hook 类型 · 时长 · BGM 类型)
|
|
177
177
|
5. **用户选一条** → 写入 `assets/reference.mp4` 或保留 URL → 继续「分析源视频」
|
|
@@ -233,13 +233,16 @@ ffprobe -v quiet -print_format json -show_format -show_streams assets/reference.
|
|
|
233
233
|
ffmpeg -i assets/reference.mp4 -vf "select='gt(scene,0.3)',showinfo" -vsync 0 -f null - 2>&1 | grep showinfo
|
|
234
234
|
```
|
|
235
235
|
|
|
236
|
-
3. 每段抽 3
|
|
236
|
+
3. 每段抽 3 帧(首/中/尾),再**拼成一张 contact sheet**(一次看全片,别逐帧):
|
|
237
237
|
|
|
238
238
|
```bash
|
|
239
|
+
# 每段抽 3 帧
|
|
239
240
|
ffmpeg -i assets/reference.mp4 -vf "select='eq(n\,<FRAME_NUM>)'" -vsync 0 assets/keyframes/seg-<N>-<pos>.jpg
|
|
241
|
+
# 拼成一张网格图(按文件名排序,每行≈一段的首/中/尾);<R>=段数
|
|
242
|
+
ffmpeg -y -pattern_type glob -i 'assets/keyframes/seg-*.jpg' -filter_complex "scale=360:-1,tile=3x<R>" -frames:v 1 assets/contact-sheet.jpg
|
|
240
243
|
```
|
|
241
244
|
|
|
242
|
-
4.
|
|
245
|
+
4. **读这一张 `contact-sheet.jpg`——1 次 vision 调用看全片**,**按 `$CLAUDE_SKILL_DIR/references/cinematic-language.md` §9 导演拆镜 Checklist 逐镜拆**:景别 → 机位 → 运镜(起幅/落幅)→ 焦段/景深 → 光线(光向/光质/色温)→ 构图 → 动作弧 → beat → 与下一镜怎么接。**别再每帧单独调 vision——逐帧调十几次是分析慢的主因,一张 contact sheet 一次看完。** 用电影语言拆(「85mm 长焦浅景深、缓慢 dolly in、柔和侧逆光」不是「画面里有个杯子」)——**参考片好看的原因就藏在这些参数里,读不出来就复刻不出来**。**动作弧**(从头到尾发生了什么、主体怎么从 A 变到 B、镜头怎么运动)是写 prompt 第 ② 段的直接来源,漏了复刻必走样(见 `references/prompt-craft.md`)。
|
|
243
246
|
|
|
244
247
|
5. 验证 ffmpeg 切段合理性(修正软切/漏切)
|
|
245
248
|
|
|
@@ -258,9 +261,9 @@ ffmpeg -i assets/reference.mp4 -vf "select='eq(n\,<FRAME_NUM>)'" -vsync 0 assets
|
|
|
258
261
|
|
|
259
262
|
## 镜头分析
|
|
260
263
|
|
|
261
|
-
| 段 | 时长 | 主体 |
|
|
262
|
-
|
|
263
|
-
| 1 | 0-1.5s |
|
|
264
|
+
| 段 | 时长 | 主体 | 景别 | 机位 | 运镜 | 镜头/景深 | 光线 | 构图 | 动作弧 | beat |
|
|
265
|
+
|---|---|---|---|---|---|---|---|---|---|---|
|
|
266
|
+
| 1 | 0-1.5s | 产品+手 | ECU 大特写 | 平视 | 缓慢 dolly in | 85mm 浅景深 | 暖白柔和侧逆光 | 产品居右三分 | 手伸入握起产品→翻转露 logo | hook |
|
|
264
267
|
| ... |
|
|
265
268
|
|
|
266
269
|
## 整体风格
|
|
@@ -284,8 +287,8 @@ ffmpeg -i assets/reference.mp4 -vf "select='eq(n\,<FRAME_NUM>)'" -vsync 0 assets
|
|
|
284
287
|
|
|
285
288
|
2. 有模板则以模板为骨架填入产品/品牌信息;否则从零构建
|
|
286
289
|
|
|
287
|
-
3.
|
|
288
|
-
-
|
|
290
|
+
3. **复刻铁律(默认且唯一的复刻行为,违反就是没复刻)**:**严格按源视频 1:1 复现——镜头数、每镜时长、景别 / 机位 / 运镜、切点、剪辑节奏、整体调性、场景全部照搬源视频,唯一变量是把产品换成用户给定的。** ❌ 禁止压缩 / 合并段数(技术合并见下方区分)、❌ 禁止改场景 / 调性、❌ 禁止自定节奏快慢、❌ 禁止把源片的动态镜拍成静态摆拍。爆款值得复刻,就因为它的分镜 + 节奏已被市场验证能火——动了它就等于扔掉复刻的全部意义(客户实测:agent 擅自把 5 段压成 4 段、把"治愈系"改成"学院风"、自定 4×4.5s 慢静态镜 → 又慢又走样,正是反面教材)。**节奏不归你定,照搬源片;源片快你就快,源片慢你就慢。**
|
|
291
|
+
- **物理合理性预检**:只有当用户产品**物理上做不出**源片某镜的动作时(如源片捏软杯、用户是硬陶瓷杯),才对**那一镜**做**最小替换**(换成该产品能做的最接近动作)+ **明确告诉用户这一镜改了什么、为什么**——不是默默重设计,更不是借机重排全片。其余镜头一律照搬。
|
|
289
292
|
|
|
290
293
|
4. 写 `videos/{id}/storyboard.md`:
|
|
291
294
|
|
|
@@ -301,13 +304,25 @@ ffmpeg -i assets/reference.mp4 -vf "select='eq(n\,<FRAME_NUM>)'" -vsync 0 assets
|
|
|
301
304
|
| 调性 | <调性> |
|
|
302
305
|
| 参考来源 | <来源或"从模板构建"> |
|
|
303
306
|
|
|
304
|
-
##
|
|
305
|
-
| 段 | 时长 |
|
|
306
|
-
|
|
307
|
-
| 1 | 0-1.5s |
|
|
307
|
+
## 镜头表(导演级分镜——别写成"画面 + 文案"的种草脚本)
|
|
308
|
+
| 段 | 时长 | 景别 | 机位 | 运镜 | 镜头/景深 | 主体动作弧/调度 | 光线/影调 | 切点→下一镜 | beat/卡点 | 替换说明 |
|
|
309
|
+
|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
310
|
+
| 1 | 0-1.5s | 大特写 ECU | 平视 | 手持微晃 | 85mm 长焦浅景深、产品在焦背景虚化 | 手从画面下方入框握起产品、抬至胸前缓慢翻转 90° 露正面 logo | 晨光柔和侧逆、暖白、中高光比 | 翻转到位的动作落点硬切(cut on action) | hook:第 1 拍就给产品高光 | 产品换成 <X> |
|
|
308
311
|
| ... |
|
|
309
312
|
|
|
310
|
-
>
|
|
313
|
+
> **写法要求(这一步决定成片"像不像导演拍的")——术语和写法全部查 `$CLAUDE_SKILL_DIR/references/cinematic-language.md`**:
|
|
314
|
+
> - **景别**用电影语言(ECU 大特写 / CU 特写 / MCU 中近 / MS 中 / MLS 中全 / WS 全 / EWS 远),不是"画面里有个杯子"。
|
|
315
|
+
> - **机位**写明(平视 / 俯 / 仰 / 顶视 / 斜角 / 过肩 / 主观 POV)——角度即叙事:产品仰拍=高级、顶视=平铺展示。
|
|
316
|
+
> - **运镜**具体到一种(固定 / 推 dolly in / 拉 / 摇 / 横移 / 跟 / 手持 / 环绕 arc),别空着也别堆叠;**分清 dolly(机身移、透视变)和 zoom(变焦、透视不变)**。
|
|
317
|
+
> - **镜头/景深**写焦段 + 景深(产品特写=长焦浅景深隔离主体)——这才是「干净画面」的专业说法。
|
|
318
|
+
> - **主体动作弧/调度**=这一拍主体怎么从 A 动到 B、进出画、与产品怎么互动(导演分镜的核心,不是静态画面描述)。
|
|
319
|
+
> - **光线/影调**写光向 + 光质 + 色温 + 光比("窗户来的柔和侧逆光、暖白、半脸入暗"),不是只写"暖光"。
|
|
320
|
+
> - **切点→下一镜**写清在哪个动作点切、怎么接(动作剪辑 cut on action / 匹配剪辑 / 叠化),并守 continuity(视线匹配、不越轴、运动方向一致,见 cinematic-language §7)。
|
|
321
|
+
> - **beat/卡点**=这一拍的叙事作用(hook / 痛点 / 卖点 / 转折 / CTA),对齐 BGM 卡点。
|
|
322
|
+
> - **复刻时按 cinematic-language §9 的 9 项把参考片每镜拆出来照搬**——它的景别 / 机位 / 运镜 / 光线 / 卡点节奏就是它好看的原因。
|
|
323
|
+
|
|
324
|
+
> **段时长约束**:**复刻时——分段 = 源视频的分段,逐镜照搬段数和每镜时长,不增、不减、不压缩。** 只有原创(无参考)时才按叙事节奏自由分段(推荐 2-15s)。
|
|
325
|
+
> **⚠️ 技术合并 ≠ 创意压缩(最容易搞混,上次就栽这)**:Seedance 单段最短 4s,所以源片里 <4s 的短镜要「生成一段 4-15s 的长片 → 用 ffmpeg trim 切回源片那一镜的精确时长」。这**纯粹是为凑模型最短时长的技术手段,trim 后成片的镜头数 / 每镜时长 / 切点节奏必须和源片逐帧一致**。**绝不允许把「为生成而合并」当成「把 N 段叙事压成更少段」的创意重设计**——前者改不了成片节奏,后者直接毁掉复刻。单段 >15s 必须拆,**拆出的连续片段必须链式衔接**(后段首帧 = 前段末帧,见 Production Plan「依赖列」),否则不连续。段时长精度 0.5s。
|
|
311
326
|
|
|
312
327
|
## Hook
|
|
313
328
|
<第 1 秒如何抓注意力>
|
|
@@ -319,28 +334,27 @@ ffmpeg -i assets/reference.mp4 -vf "select='eq(n\,<FRAME_NUM>)'" -vsync 0 assets
|
|
|
319
334
|
<复刻时:替换是否合理。无参考时写 N/A>
|
|
320
335
|
```
|
|
321
336
|
|
|
322
|
-
5.
|
|
323
|
-
-
|
|
324
|
-
-
|
|
337
|
+
5. 给用户**预览 storyboard**(逐镜脚本 + 编辑后首帧),先改大方向(段落 / 产品替换 / 节奏)。
|
|
338
|
+
- ⚠️ **这只是预览,不是「确认卡」**。真正的确认卡在下一步:等 Production Plan 把**真正喂模型的 `call-N.txt` prompt** 写出来后,让用户确认 / 改**那份 prompt**(见「产出 Production Plan」§3)。因为 storyboard → prompt 这步会丢内容(客户 P1「分析对了、提示词只剩一只手」),所以**必须让用户确认最终 prompt,而不是大纲**。
|
|
339
|
+
- 原创 Fast-path:可跳过本预览,直接进 plan + prompt + 确认卡。
|
|
325
340
|
|
|
326
|
-
6.
|
|
341
|
+
6. 预览 / 调整后 `git commit -m "video: storyboard $VIDEO_ID — <summary>"`(硬确认在 §3 prompt 那步)
|
|
327
342
|
|
|
328
343
|
## 产出 Production Plan
|
|
329
344
|
|
|
330
345
|
**前置**:已完成 Per-video init + Storyboard。
|
|
331
346
|
|
|
332
|
-
|
|
347
|
+
据 storyboard 推导 plan + 写出每个 Call 的真实 prompt,**然后过确认卡(§3)让用户确认 / 改这份 prompt**——确认的、改的,就是真正喂模型的那份。
|
|
333
348
|
|
|
334
349
|
### 0. 选策略
|
|
335
350
|
|
|
336
|
-
**默认视频生成路径**支持文生 /
|
|
351
|
+
**默认视频生成路径**支持文生 / 图生视频。**默认成片自带模型生成的音轨**(audio 默认开);若要叠 BGM / 旁白,先用 ffmpeg 去掉原音轨再叠,避免两条音叠加。**不要手动指定 `--provider`**,让后端自动路由到当前最优 provider。
|
|
337
352
|
|
|
338
353
|
| 特征 | 策略 |
|
|
339
354
|
|---|---|
|
|
340
355
|
| 1 镜头,无参考 | single-shot |
|
|
341
356
|
| 多镜头,无参考 | multi-shot-concat |
|
|
342
|
-
|
|
|
343
|
-
| 有参考,高度还原 | clone-strict |
|
|
357
|
+
| **有参考(复刻爆款)** | **clone-faithful —— 1:1 照搬源视频、只换产品(见「形成 Storyboard」§3 复刻铁律)。没有"大致复刻 / 高度还原"之分:复刻就是忠实复现,不存在"松"的档** |
|
|
344
358
|
| PDP 多卖点 | pdp-feature-concat |
|
|
345
359
|
|
|
346
360
|
> **回退选项**(仅在默认路径不可用或有特殊需求时显式指定):
|
|
@@ -350,12 +364,14 @@ Storyboard 确认后自动推导。用户通常不改。
|
|
|
350
364
|
|
|
351
365
|
### 1. 写 `videos/{id}/production-plan.md`
|
|
352
366
|
|
|
353
|
-
默认 video 路径支持 **4-15 秒**整段生成。Storyboard
|
|
367
|
+
默认 video 路径支持 **4-15 秒**整段生成。Storyboard 的细粒度段在这里**合并为 gen video 调用单元——纯技术操作,目的只是凑够模型 4s 最短时长,不改变成片的分镜结构**:
|
|
354
368
|
|
|
355
|
-
-
|
|
356
|
-
-
|
|
357
|
-
-
|
|
369
|
+
- 相邻短段(同一连续镜头 / 场景)合并成一个 4-15s 的 gen video 调用去生成
|
|
370
|
+
- 该调用的 prompt 覆盖所有子段的内容(含每个子段各自的动作弧)
|
|
371
|
+
- **生成后用 ffmpeg trim 把每一镜切回它在源片里的精确时长** —— **复刻时 trim 后的成片镜头数 / 每镜时长 / 切点必须和源片逐帧一致**
|
|
358
372
|
- 单独一个 ≥4s 的 storyboard 段直接映射为一个 gen video 调用
|
|
373
|
+
- **⚠️ 合并只为生成、trim 后必须还原源片节奏;绝不允许借合并把源片的镜头数压少(那是创意重设计,违反复刻铁律)**
|
|
374
|
+
- **⚠️ 同一个连续镜头 >15s(Seedance 单次上限)必须拆成多个 Call 时:拆出的相邻 Call **必须链式衔接**——后一个 Call 依赖列填「前 Call 末帧」,首帧 = 前 Call 末帧(`ffmpeg -sseof -0.1` 抽)。否则一段连续动作被切成独立并行生成 → 画面不连续(客户实测「25s 拆 15+10 看起来不是连续的」就是漏了这步)。判定:「按长度拆的同一镜头」必链;「本就不同的镜头/场景」才可并行。**
|
|
359
375
|
|
|
360
376
|
```markdown
|
|
361
377
|
# Production Plan
|
|
@@ -365,12 +381,18 @@ Storyboard 确认后自动推导。用户通常不改。
|
|
|
365
381
|
原因: <选择理由>
|
|
366
382
|
|
|
367
383
|
## 生成调用
|
|
368
|
-
| Call | 合并段 | gen_duration | seed | aspect_ratio | Prompt 摘要 |
|
|
369
|
-
|
|
370
|
-
| 1 | seg 1-3 (共 8s) | 8 | <seed 或 `-`> | <16:9 \| 9:16 \| 1:1> | <合并 prompt> |
|
|
371
|
-
| 2 | seg 4 (12s) | 12 | $PRODUCT_SEED | <同上> | <prompt> |
|
|
384
|
+
| Call | 合并段 | 依赖 | gen_duration | seed | aspect_ratio | Prompt 摘要 |
|
|
385
|
+
|---|---|---|---|---|---|---|
|
|
386
|
+
| 1 | seg 1-3 (共 8s) | - | 8 | <seed 或 `-`> | <16:9 \| 9:16 \| 1:1> | <合并 prompt> |
|
|
387
|
+
| 2 | seg 4 (12s) | - | 12 | $PRODUCT_SEED | <同上> | <prompt> |
|
|
388
|
+
| 3 | seg 5 (10s) | Call 2 末帧 | 10 | $PRODUCT_SEED | <同上> | <承接 Call 2 末帧> |
|
|
372
389
|
| ... |
|
|
373
390
|
|
|
391
|
+
**依赖列怎么填**:
|
|
392
|
+
- `-`:跟其它 Call 无依赖,可并行提交。**仅用于本就独立的镜头/场景。**
|
|
393
|
+
- `Call N`:本 Call 的首帧来自 Call N 的末帧(链式衔接),或输入图来自前面某个 `gen image` 产出,必须等前置完成。
|
|
394
|
+
- **判定规则**:**同一个连续镜头被「按长度」拆开的相邻片段 → 必须 `Call N` 链式(保连续)**;不同镜头/场景之间 → 用 `-` 并行(省时间)。**别为了并行把一段连续动作拆成无依赖——那正是长视频不连贯的根因(客户 P2)。**
|
|
395
|
+
|
|
374
396
|
## Trim 映射
|
|
375
397
|
| seg | 来源 Call | trim 区间 | 输出 |
|
|
376
398
|
|---|---|---|---|
|
|
@@ -379,7 +401,7 @@ Storyboard 确认后自动推导。用户通常不改。
|
|
|
379
401
|
| 3 | Call 1 | 5.5-8.0s | clips/seg-3.mp4 |
|
|
380
402
|
| 4 | Call 2 | 0:00-12.0s | clips/seg-4.mp4 |
|
|
381
403
|
|
|
382
|
-
**seed
|
|
404
|
+
**seed 规则**:默认路径(Seedance)**不透传 seed**,产品一致性靠「同一张产品首帧图 + 末帧链式承接」,不靠 seed。seed 列一律填 `-`(除非用户显式切到支持 seed 的 provider)。
|
|
383
405
|
|
|
384
406
|
## 验收标准
|
|
385
407
|
- 比例: <从 Storyboard>
|
|
@@ -390,31 +412,105 @@ Storyboard 确认后自动推导。用户通常不改。
|
|
|
390
412
|
|
|
391
413
|
### 2. 为每个需 prompt 的步骤生成 `prompts/call-N.txt`
|
|
392
414
|
|
|
393
|
-
|
|
415
|
+
**照 `$CLAUDE_SKILL_DIR/references/prompt-craft.md` 的五段式结构写**(开场构图 → 动作弧 → 运镜 → 光线 → 结束状态;80–220 词;不写时长 / 比例 / 声音)。这是复刻成败的命门——默认路径把这段文本**原样**喂给模型,中间没有任何改写兜底,prompt 糙 = 成片糙。复刻镜头**忠于参考的动作与运镜**,不自补创意。
|
|
416
|
+
|
|
417
|
+
### 3. 确认卡 ——「确认的、改的,就是真正喂模型的那份」(见 `references/confirm-card.md`)
|
|
418
|
+
|
|
419
|
+
确认卡**逐 Call 把每个 `call-N.txt` 的全文逐字贴进对话(每段一个代码块)+ 编辑后首帧 + 计费口径**(不是 storyboard 大纲、不是「镜头 / 内容」摘要表)。
|
|
420
|
+
|
|
421
|
+
> ❌ **禁止用「摘要表 + 📄 call-N.txt 文件链接」代替贴全文。** 用户不会去开文件——看不到真实 prompt 就等于没确认(客户实测:agent 只摆了一张摘要表 + 几个文件链接就「确认通过」开跑,用户根本没看到、没确认到真正喂模型的 prompt)。**必须把全文贴出来、明确停下等用户改 / 确认,确认前绝不调 `gen video`。**
|
|
422
|
+
|
|
423
|
+
用户可逐条改:
|
|
424
|
+
|
|
425
|
+
- 用户说「第 N 段改成 X / 这镜运镜不对 / 加个特写」→ **直接覆写对应的 `prompts/call-N.txt`**(改的就是喂模型的),改完把更新后的全文再贴回卡上。
|
|
426
|
+
- 确认通过 → 写 `.confirmed`,并**把当前 prompt 的校验和绑进去**(保证生成用的就是用户确认的这版,没被偷偷改写):
|
|
427
|
+
|
|
428
|
+
```bash
|
|
429
|
+
sha256sum prompts/call-*.txt > .confirmed # 绑定:确认的 = 这份 prompt
|
|
430
|
+
echo "user said: <把用户确认的原话填进来>" >> .confirmed
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
- 用户「太贵 / 换个便宜的」→ 回 §0 换策略,重写 prompt 再出卡。**确认前绝不调 `gen video`。**
|
|
434
|
+
|
|
435
|
+
### 4. `git commit -m "video: plan $VIDEO_ID — <strategy>"`
|
|
394
436
|
|
|
395
437
|
## 执行生成
|
|
396
438
|
|
|
397
439
|
**前置**:已完成 Per-video init + Storyboard + Production Plan。
|
|
398
440
|
|
|
399
441
|
<COST-GATE>
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
> 即将生成 N 段视频(策略: <策略名>),预计:
|
|
403
|
-
> - 调用次数: N 次 gen video + M 次 gen image(首帧编辑)
|
|
404
|
-
> - 总时长: <Σ seg.duration_s>s
|
|
405
|
-
> - 预估耗时: ~X 分钟
|
|
406
|
-
> - 预估成本: ~$Y(扣 Optima credits)
|
|
407
|
-
>
|
|
408
|
-
> 继续?
|
|
442
|
+
**生成前必须已过确认卡**(在 Production Plan §3 完成:用户确认了**真实 `call-N.txt` prompt** + 计费口径,`.confirmed` 已写并绑定 prompt 校验和)。**成本由后端 billing 实扣,确认卡不自算金额**——只列计费口径(段数 / 总秒数 / 画质)+ 脚注「重生/改图另计费、实扣以 billing 为准」。
|
|
409
443
|
|
|
410
|
-
|
|
411
|
-
用户说"太贵"/"换个便宜的" → 回到 Production Plan,换策略(如 strict → loose)。
|
|
412
|
-
用户不回应超过合理时间 → 不执行,等用户。
|
|
444
|
+
**确认后禁止再改写 / 重推 prompt**——生成只读用户确认的那份 `call-N.txt` 原文。要改就先 `rm .confirmed` 回 §3 重新确认。
|
|
413
445
|
|
|
414
|
-
|
|
446
|
+
**重新 gate 边界(D-E)**:已确认集内替换/重生 → 不重出卡(**有意放松**:集内重生独立计费、会产生额外扣费,实扣以 billing 为准);方案改/净新增/画质升级/新一轮 N → 先 `rm .confirmed` 再重出卡。
|
|
415
447
|
</COST-GATE>
|
|
416
448
|
|
|
417
|
-
按 production-plan.md
|
|
449
|
+
按 production-plan.md 步骤表执行,**默认并行提交,不要写成顺序循环**。
|
|
450
|
+
|
|
451
|
+
### 并行执行规则
|
|
452
|
+
|
|
453
|
+
`gen video` 在 bash 层是阻塞调用(内部 submitAndPoll),单条命令耗时主要花在远端排队 + 渲染上。所以:
|
|
454
|
+
|
|
455
|
+
- **同一波内(依赖列都是 `-` 的 Call)必须用后台 `&` 并行提交,最后 `wait`** — wall time 从 N×T 降到 ~T
|
|
456
|
+
- **有依赖的 Call** 放下一波,等前置 `wait` 完再启动
|
|
457
|
+
- **每个 Call 的 pending.json 写入 + commit 仍在该 Call 自己的 subshell 里做**,不要等全部完成才一次性写
|
|
458
|
+
|
|
459
|
+
典型 3 Call 全独立的写法:
|
|
460
|
+
|
|
461
|
+
```bash
|
|
462
|
+
# 机械 guard:未过确认卡 / prompt 跟确认的不是同一版 → 拒绝付费生成(见 references/confirm-card.md)
|
|
463
|
+
[ -f .confirmed ] || { echo "ERR: 未过确认卡,拒绝付费生成"; exit 1; }
|
|
464
|
+
grep '\.txt$' .confirmed | sha256sum -c --status || { echo "ERR: prompt 跟用户确认的不是同一版(被改写过)→ 回 §3 重新确认"; exit 1; }
|
|
465
|
+
# 一波并发:3 个独立 gen video 同时提交
|
|
466
|
+
(
|
|
467
|
+
echo '{"task_id":"","submitted_at":"'$(date -Iseconds)'","step":1,"tool":"gen video"}' > clips/seg-1.pending.json
|
|
468
|
+
gen video assets/keyframes/seg-1.jpg --prompt "$(cat prompts/call-1.txt)" --duration 8 --aspect-ratio 9:16 --resolution 720p --seed $PRODUCT_SEED -o clips/call-1.mp4 \
|
|
469
|
+
&& rm clips/seg-1.pending.json
|
|
470
|
+
) &
|
|
471
|
+
(
|
|
472
|
+
echo '{"task_id":"","submitted_at":"'$(date -Iseconds)'","step":2,"tool":"gen video"}' > clips/seg-2.pending.json
|
|
473
|
+
gen video assets/keyframes/seg-2.jpg --prompt "$(cat prompts/call-2.txt)" --duration 12 --aspect-ratio 9:16 --resolution 720p --seed $PRODUCT_SEED -o clips/call-2.mp4 \
|
|
474
|
+
&& rm clips/seg-2.pending.json
|
|
475
|
+
) &
|
|
476
|
+
(
|
|
477
|
+
echo '{"task_id":"","submitted_at":"'$(date -Iseconds)'","step":3,"tool":"gen video"}' > clips/seg-3.pending.json
|
|
478
|
+
gen video --prompt "$(cat prompts/call-3.txt)" --duration 10 --aspect-ratio 9:16 --resolution 720p -o clips/call-3.mp4 \
|
|
479
|
+
&& rm clips/seg-3.pending.json
|
|
480
|
+
) &
|
|
481
|
+
wait
|
|
482
|
+
|
|
483
|
+
# 波次失败传播 — 没这段 wait 永远返回 0,LLM 会把"并行 + 静默失败"传到 Trim
|
|
484
|
+
# 每个 Call 成功才 rm 自己的 pending.json;任何残留 = 该 Call 失败
|
|
485
|
+
pending=$(ls clips/seg-*.pending.json 2>/dev/null)
|
|
486
|
+
[ -z "$pending" ] || { echo "ERR: 波次有失败: $pending"; exit 1; }
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
依赖关系的写法(Call 3 依赖 Call 2 的末帧):
|
|
490
|
+
|
|
491
|
+
```bash
|
|
492
|
+
# 机械 guard:未过确认卡 / prompt 跟确认的不是同一版 → 拒绝付费生成(见 references/confirm-card.md)
|
|
493
|
+
[ -f .confirmed ] || { echo "ERR: 未过确认卡,拒绝付费生成"; exit 1; }
|
|
494
|
+
grep '\.txt$' .confirmed | sha256sum -c --status || { echo "ERR: prompt 跟用户确认的不是同一版(被改写过)→ 回 §3 重新确认"; exit 1; }
|
|
495
|
+
# Wave 1: Call 1 / 2 独立并行(pending.json 写入 + && rm 模板见上面 3-Call 例子)
|
|
496
|
+
( ... gen video ... -o clips/call-1.mp4 && rm clips/seg-1.pending.json ) &
|
|
497
|
+
( ... gen video ... -o clips/call-2.mp4 && rm clips/seg-2.pending.json ) &
|
|
498
|
+
wait
|
|
499
|
+
|
|
500
|
+
# Wave 1 失败传播(同上)
|
|
501
|
+
pending=$(ls clips/seg-*.pending.json 2>/dev/null)
|
|
502
|
+
[ -z "$pending" ] || { echo "ERR: Wave 1 有失败: $pending"; exit 1; }
|
|
503
|
+
|
|
504
|
+
# Wave 1 完了再抽 Call 2 末帧 → Wave 2
|
|
505
|
+
# 即使 wait 上方扫过 pending.json,这里仍要 `[ -f ]` 守一道:依赖 Call 输出文件存在性
|
|
506
|
+
[ -f clips/call-2.mp4 ] || { echo "ERR: clips/call-2.mp4 不存在,Wave 2 中止"; exit 1; }
|
|
507
|
+
ffmpeg -sseof -0.1 -i clips/call-2.mp4 -frames:v 1 assets/keyframes/seg-3.jpg
|
|
508
|
+
gen video assets/keyframes/seg-3.jpg --prompt "$(cat prompts/call-3.txt)" -o clips/call-3.mp4
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
**不要把多个 `gen video` 写成 sequential 的 for 循环 / 多条独立命令**——LLM 默认顺序写 bash,要明确按上面的 `( … ) &` + `wait` 结构组装。
|
|
512
|
+
|
|
513
|
+
**每个 `wait` 之后必须扫 `clips/seg-*.pending.json` 残留**——光 `wait` 不暴露子 shell 失败(无参数 wait 返回 0 或最后 reap 的状态),跟 skill 后面"失败:自动重试 1 次 → 仍失败标记 needs_user_review"机制对齐。残留 = 该 Call 未走完 `&& rm`,必须停下来处理。
|
|
418
514
|
|
|
419
515
|
**每步执行前**写 `clips/seg-N.pending.json`:
|
|
420
516
|
|
|
@@ -435,6 +531,7 @@ gen video <input_image> \
|
|
|
435
531
|
--prompt "$(cat prompts/call-N.txt)" \
|
|
436
532
|
--duration <4-15> \
|
|
437
533
|
--aspect-ratio <16:9|9:16|1:1> \
|
|
534
|
+
--resolution 720p \
|
|
438
535
|
--seed $PRODUCT_SEED \
|
|
439
536
|
-o clips/call-<N>.mp4
|
|
440
537
|
|
|
@@ -443,22 +540,33 @@ gen video \
|
|
|
443
540
|
--prompt "$(cat prompts/call-N.txt)" \
|
|
444
541
|
--duration <4-15> \
|
|
445
542
|
--aspect-ratio <16:9|9:16|1:1> \
|
|
543
|
+
--resolution 720p \
|
|
446
544
|
-o clips/call-<N>.mp4
|
|
447
545
|
|
|
448
|
-
# 注意:不要传 --provider
|
|
546
|
+
# 注意:不要传 --provider,让后端选默认路径(kie / Seedance 2 Fast)。需要 dashscope / heygen 特殊功能时再显式指定。
|
|
547
|
+
# ⚠️ 默认 kie 路径**必须显式传 `--resolution`(全小写),社媒默认 `720p`**:CLI 默认是 1080P,而 kie 只收 480p/720p →
|
|
548
|
+
# 不传会被后端拒、gen video 秒退失败(这正是 stage 复刻卡住的原因之一)。
|
|
549
|
+
# **画质默认 720p**(496×864 那种 480p 出片太糊,社媒不能用);用户明确要省成本才降 480p。
|
|
449
550
|
|
|
450
551
|
# ffmpeg trim — 按 Trim 映射表切回 storyboard 各段
|
|
451
552
|
ffmpeg -i clips/call-1.mp4 -ss 0 -t 2.5 -c copy clips/seg-1.mp4
|
|
452
553
|
ffmpeg -i clips/call-1.mp4 -ss 2.5 -t 3.0 -c copy clips/seg-2.mp4
|
|
453
554
|
|
|
454
555
|
# 变量约定(production-plan.md 每个 call 提供):
|
|
455
|
-
# $PRODUCT_SEED =
|
|
556
|
+
# $PRODUCT_SEED = seed 值(仅对显式指定、支持 seed 的 provider 生效;默认 Seedance 不透传)
|
|
456
557
|
|
|
457
|
-
#
|
|
458
|
-
#
|
|
558
|
+
# 注意:默认路径(Seedance)当前不透传 seed,--seed 等于空操作。
|
|
559
|
+
# 产品一致性不能靠 seed,要靠:同一张产品首帧图 + 末帧链式承接(后一镜用前一镜末帧)。
|
|
459
560
|
|
|
460
561
|
# 首帧编辑(产品替换)— 双图模式
|
|
461
|
-
|
|
562
|
+
# ⚠️ "<编辑指令>" 是【紧凑的图像编辑指令】(1-2 句:把 X 换成产品 Y,保持构图 / 光线 / 角度),
|
|
563
|
+
# **绝不要套 prompt-craft 的视频五段式**(那是给 gen video 的)。长的多段结构化 prompt 会让 gpt-image-2 报
|
|
564
|
+
# UPSTREAM_UNKNOWN 失败(stage 复刻首帧全挂就是这原因)。
|
|
565
|
+
# ⚠️ **物理合理(复刻铁律的一环)**:新产品必须占据源产品在画面里的**同一位置 / 同一尺寸 / 同样接触关系**
|
|
566
|
+
# (在盒里就在盒里、被手握住就被握住),**不能悬空、不能比容器还大、不能尺寸失真**
|
|
567
|
+
# (客户实测:拆箱镜 HKUST 杯飘在礼盒上方、比盒子还大 → 一眼假)。编辑指令里写明「放在原产品所在位置、同样大小、自然接触」。
|
|
568
|
+
# 例:gen image "把礼盒里的杯子换成这张产品图里的 HKUST 马克杯,放在盒内原位、同样大小、与盒子自然接触,保持原构图、暖色侧光、俯拍角度" -i seg-1.jpg -i product.jpg -o assets/keyframes/seg-1-edited.jpg
|
|
569
|
+
gen image "<紧凑图像编辑指令>" -i <原始首帧> -i <产品图> -o assets/keyframes/seg-<N>-edited.jpg
|
|
462
570
|
|
|
463
571
|
# 拼接所有 seg 为最终视频
|
|
464
572
|
printf "file '%s'\n" clips/seg-*.mp4 > concat_list.txt
|
|
@@ -470,7 +578,7 @@ gen task cancel <task_id>
|
|
|
470
578
|
gen task retry <task_id>
|
|
471
579
|
```
|
|
472
580
|
|
|
473
|
-
**Duration**:`--duration`
|
|
581
|
+
**Duration**:`--duration` 接受 **4–15 秒**(默认路径)。Production Plan 的 Trim 映射表负责将生成的完整视频切回 Storyboard 各段时长。
|
|
474
582
|
|
|
475
583
|
**每步完成后**:
|
|
476
584
|
- 删 `seg-N.pending.json`
|
|
@@ -481,7 +589,7 @@ gen task retry <task_id>
|
|
|
481
589
|
|
|
482
590
|
**失败**:自动重试 1 次 → 仍失败标记 `needs_user_review`
|
|
483
591
|
|
|
484
|
-
|
|
592
|
+
**生成过程中不问用户。** 并行规则见上方"生成"小节。
|
|
485
593
|
|
|
486
594
|
## Review
|
|
487
595
|
|
|
@@ -538,7 +646,7 @@ gen task retry <task_id>
|
|
|
538
646
|
| ffmpeg 失败 | 检查输入完整性,告知用户 |
|
|
539
647
|
| 源视频无法下载 | 建议手动下载后重试 |
|
|
540
648
|
| scout 无结果 | 告知,转模板构建 |
|
|
541
|
-
|
|
|
649
|
+
| 产品物理上做不出某镜动作 | 只对那一镜做最小替换 + 告诉用户改了啥(不重设计、不重排全片,见复刻铁律);整体仍 1:1 照搬源片 |
|
|
542
650
|
| 会话关闭 | 状态在文件系统 + git,下次接续 |
|
|
543
651
|
| gen task 超时 | 按 pending.json 重提 |
|
|
544
652
|
| git commit 失败 | 说明原因,不 reset |
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cinematic-language
|
|
3
|
+
purpose: "导演 / 摄影指导(DP)的镜头描述语言 —— 让 storyboard、分析、prompt 用专业电影语法而不是'中景一只手'这种泛泛话。复刻保真的术语底座。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 电影语言术语库(写 storyboard / 分析 / prompt 都查这里)
|
|
7
|
+
|
|
8
|
+
> **为什么要这套**:默认路径把 prompt **原样**喂模型,没有改写兜底。一句「暖色灯光、干净画面」模型没法照拍;一句「85mm 长焦浅景深隔离主体、黄金时刻柔和侧光、主体置三分交点」模型才知道怎么拍。**专业 DP 描述 = 一串可执行的镜头参数(景别 + 机位 + 运镜 + 焦段/景深 + 光质/光向 + 构图法),不是形容词堆砌。** 复刻时,参考片好看的原因就藏在这些参数里——读不出来就复刻不出来。
|
|
9
|
+
> 来源:StudioBinder 各专题、Mascelli《The Five C's of Cinematography》、ASC、MasterClass、Steven Katz《Film Directing Shot by Shot》。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 0. 一条总原则
|
|
14
|
+
|
|
15
|
+
描述任何一镜,**不写「画面里有什么」,写「这一镜怎么拍 + 怎么动 + 要表达什么」**。退化成「一张静态照片的描述」是复刻丢分的头号原因(客户 P1:分析对了、prompt 只剩一只手,就是描述退化成静态)。
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 1. 景别 Shot Size(大 → 小)
|
|
20
|
+
|
|
21
|
+
| 中文 | English (缩写) | 框住什么 / 传达 / 用在哪 |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| 大远景 / 建立镜头 | Extreme Wide / Extreme Long Shot (EWS/ELS); Establishing | 人物渺小于环境;交代地理、规模、孤立;开篇定调 |
|
|
24
|
+
| 远景 / 全景 | Wide / Long Shot (WS/LS) | 主体连同环境入画;呈现人与空间关系 |
|
|
25
|
+
| 全身 | Full Shot (FS) | 头到脚填满画面、留少量环境;看肢体动作、服装、走位 |
|
|
26
|
+
| 中全 / 中远景 | Medium Long Shot (MLS) | 约膝盖以上;全身与中景的过渡 |
|
|
27
|
+
| 七分身 / 牛仔镜头 | Cowboy / American Shot | 大腿中段以上;动作 + 情绪兼顾 |
|
|
28
|
+
| 中景 | Medium Shot (MS) | 腰部以上;对白主力,人物与背景平衡 |
|
|
29
|
+
| 中近景 | Medium Close-Up (MCU) | 胸部以上;采访 / 对话标准,表情 + 少量肢体 |
|
|
30
|
+
| 近景 / 特写 | Close-Up (CU) | 满屏一张脸或一件关键物;放大情绪、反应、戏剧重点 |
|
|
31
|
+
| 大特写 | Extreme Close-Up (ECU) | 局部细节满屏(眼睛 / 唇 / 产品 logo);强调肉眼难察细节,常配微距 |
|
|
32
|
+
| 插入 / 切出镜头 | Insert / Cutaway | 单独拍一个细节/物件(屏幕、标签、纸条);情节线索 + 衔接剪辑 |
|
|
33
|
+
|
|
34
|
+
**电商常用**:产品 ECU 给质感 logo、MCU 给「人 + 产品」关系、CU 给手部使用细节、WS 给场景定调。
|
|
35
|
+
|
|
36
|
+
## 2. 机位角度 Camera Angle
|
|
37
|
+
|
|
38
|
+
| 中文 | English (缩写) | 机位 + 心理/叙事含义 |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| 平视 | Eye-Level | 与视线齐平;中性、可信、拉近观众 |
|
|
41
|
+
| 俯角 | High Angle | 自上往下;弱化、脆弱、渺小(产品俯拍=「展示在你面前」) |
|
|
42
|
+
| 仰角 | Low Angle | 自下往上;权势、压迫、高级感(产品仰拍=「值得仰望」) |
|
|
43
|
+
| 顶视 / 鸟瞰 | Overhead / Top-Down / Bird's Eye | 正上方 ~90°;平铺展示、全局感、设计感(开箱/平铺图标配) |
|
|
44
|
+
| 斜角 / 倾斜 | Dutch / Canted | 机身侧倾、地平线歪;失衡、焦虑、张力 |
|
|
45
|
+
| 过肩 | Over-the-Shoulder (OTS) | 越过一人肩拍对面;交代两人空间关系,轻微主观 |
|
|
46
|
+
| 主观 | Point-of-View (POV) | 摄影机即角色双眼;强代入(「第一人称用产品」) |
|
|
47
|
+
|
|
48
|
+
## 3. 运镜 Camera Movement
|
|
49
|
+
|
|
50
|
+
| 中文 | English | 怎么动 | 传达什么 |
|
|
51
|
+
|---|---|---|---|
|
|
52
|
+
| 固定 / 锁定 | Static / Locked-off | 机位不动 | 稳定、客观、聚焦主体;克制 |
|
|
53
|
+
| 摇 | Pan | 机身原地水平转 | 揭示新信息、跟随、连接两主体 |
|
|
54
|
+
| 俯仰摇 | Tilt | 机身原地垂直转 | 建立体量(仰摇=敬畏,俯摇=渺小) |
|
|
55
|
+
| 推 | Dolly in / Push in | 机身整体前移 | **代入、紧张升级、内心揭示**;逼近 |
|
|
56
|
+
| 拉 | Dolly out / Pull out | 机身整体后移 | **抽离、孤独、揭示更大语境**;收尾 |
|
|
57
|
+
| 横移 | Truck / Track | 机身水平平移 | 伴随移动主体、沉浸、流动 |
|
|
58
|
+
| 升降 | Pedestal / Boom | 机身垂直升降(**移位,非俯仰**) | 改变视点高度、揭示纵向空间 |
|
|
59
|
+
| 摇臂 | Crane / Jib | 经摇臂弧形升降穿行 | 宏大建场、抽离收尾、提升格调 |
|
|
60
|
+
| 手持 | Handheld | 手持带抖动 | 纪实、不安、亲密、主观、紧迫 |
|
|
61
|
+
| 稳定器跟拍 | Steadicam / Gimbal | 机械稳定的流动跟随 | 沉浸、「与主体并肩」、流畅长镜 |
|
|
62
|
+
| 变焦 | Zoom | **焦段变,机身不动** | 功能性放大、人为/突兀感 |
|
|
63
|
+
| 环绕 | Arc / Orbit | 绕主体圆周移 | 给静态注入动感、围观/逼视的张力(**产品 360° 展示标配**) |
|
|
64
|
+
| 甩镜 | Whip pan | 极快 pan、拉成模糊 | 高能转场、节奏冲击 |
|
|
65
|
+
| 滑动变焦 | Dolly zoom (Vertigo) | 推进同时反向变焦 | 眩晕、现实崩塌、顿悟 |
|
|
66
|
+
| 跟拍 | Follow / Tracking | 机身随主体持续移 | 紧贴主体、维持注意力 |
|
|
67
|
+
|
|
68
|
+
> **Dolly ≠ Zoom(专业上不能混)**:dolly 机身真移动,**透视改变**(观众感觉「自己在靠近」,真实);zoom 只焦段变,**透视不变**(画面被裁切放大,人为扁平)。复刻时看错会拍歪——参考片是推近(dolly)还是拉焦(zoom)要分清。
|
|
69
|
+
>
|
|
70
|
+
> **运镜配情绪**:紧张升级→慢 dolly in;孤独/收尾→dolly out 或 crane up;纪实/混乱→handheld;产品环视→arc;宏大建场→crane/pedestal up;客观克制→static。**挑一种和动作匹配的,别堆。**
|
|
71
|
+
|
|
72
|
+
## 4. 镜头与景深 Lens & Depth of Field
|
|
73
|
+
|
|
74
|
+
| 中 / 英 | 效果 |
|
|
75
|
+
|---|---|
|
|
76
|
+
| 广角 Wide (14–35mm) | 透视夸张、纵深强;环境叙事;贴脸会变形 |
|
|
77
|
+
| 标准 Normal (~50mm) | 接近人眼、自然写实;对话默认 |
|
|
78
|
+
| 长焦 Telephoto (85mm+) | **压缩空间、天然浅景深**;亲密/高级/隔离主体(**产品特写首选**) |
|
|
79
|
+
| 浅景深 Shallow DOF | 主体清晰、背景虚化 → 隔离主体、引导视线、情绪聚焦 |
|
|
80
|
+
| 深景深 Deep DOF | 前中后全清晰 → 大场面、定场、写实环境 |
|
|
81
|
+
| 虚化 Bokeh | 失焦光斑;大光圈 + 长焦获得 |
|
|
82
|
+
| 拉焦 Rack focus | 单镜内焦点从 A 移到 B → 转移注意力、揭示、连接 |
|
|
83
|
+
|
|
84
|
+
控制:光圈越大、焦段越长、机位越近 → 景深越浅。
|
|
85
|
+
|
|
86
|
+
## 5. 打光 Lighting
|
|
87
|
+
|
|
88
|
+
| 中 / 英 | 效果 |
|
|
89
|
+
|---|---|
|
|
90
|
+
| 三点布光 Three-point | 主光 key + 补光 fill + 轮廓光 back/rim:塑形、控影、分离主体 |
|
|
91
|
+
| 主光 Key | 主照明,定基调 |
|
|
92
|
+
| 补光 Fill | 提亮阴影、控反差 |
|
|
93
|
+
| 轮廓/逆光 Back/Rim | 勾边、与背景分离、增立体 |
|
|
94
|
+
| 明调 High-key | 高亮、低反差、少阴影 → 明快、广告/喜剧感(**电商默认偏明调**) |
|
|
95
|
+
| 暗调 Low-key | 大阴影、高反差 → 神秘、悬疑、高级黑 |
|
|
96
|
+
| 硬光 Hard light | 小光源、阴影锐利 → 戏剧、棱角、质感 |
|
|
97
|
+
| 柔光 Soft light | 大光源/扩散、阴影柔和 → 柔美、自然、显质感(**产品/美妆首选**) |
|
|
98
|
+
| 动机光 Motivated | 模拟画内合理光源(窗/月/路灯),「看不出在打光」 |
|
|
99
|
+
| 实用光源 Practical | 入画的真实灯具(台灯/霓虹/烛火),造氛围 |
|
|
100
|
+
| 黄金时刻 Golden hour | 日出后/日落前低角暖光,柔和有向、长影暖调 |
|
|
101
|
+
| 明暗对照 Chiaroscuro | 强光影对比塑体积 → 油画感、张力 |
|
|
102
|
+
| 色温 Color temp | 暖(橙)vs 冷(蓝),奠定情绪 |
|
|
103
|
+
| 光比 Contrast ratio | 高光比=戏剧化,低光比=平和 |
|
|
104
|
+
|
|
105
|
+
> 写光别只写「暖光」——写**光向 + 光质 + 色温 + 光比**:例「窗户来的柔和侧逆光、暖白、半脸入暗的高光比」。
|
|
106
|
+
|
|
107
|
+
## 6. 构图 Composition
|
|
108
|
+
|
|
109
|
+
| 中 / 英 | 效果 |
|
|
110
|
+
|---|---|
|
|
111
|
+
| 三分法 Rule of thirds | 主体置交点/线 → 平衡、自然、留呼吸 |
|
|
112
|
+
| 引导线 Leading lines | 线条牵引视线至主体 |
|
|
113
|
+
| 负空间 Negative space | 主体周围留白带情绪 → 孤独、渺小、高级 |
|
|
114
|
+
| 对称/平衡 Symmetry | 镜像或视觉重量平衡 → 秩序、仪式感 |
|
|
115
|
+
| 头顶空间 Headroom | 头顶留白:过多空、过少压抑 |
|
|
116
|
+
| 视线/引导空间 Lead room | 朝向/运动方向前方多留 → 给「去向」 |
|
|
117
|
+
| 前中后景分层 FG–MG–BG | 三个景深平面叠 → 平面变纵深窗口、沉浸 |
|
|
118
|
+
| 框架构图 Framing | 用门窗/拱洞框住主体 → 聚焦、纵深 |
|
|
119
|
+
|
|
120
|
+
## 7. 连贯 / 剪辑语法 Continuity(复刻为什么必须守)
|
|
121
|
+
|
|
122
|
+
复刻一条多镜视频,**镜与镜之间的衔接逻辑**和单镜画面一样重要——丢了它,单镜再准也是「一堆碎片」不是「一条片」:
|
|
123
|
+
|
|
124
|
+
- **动作剪辑点 Cut on action**:在动作中途切(不是动作做完才切),切点被「藏」进动作里,观众察觉不到。→ 复刻拆段时,切点落在动作里。
|
|
125
|
+
- **视线匹配 Eyeline match**:看的镜头 → 切到所看之物,视线方向要对得上。
|
|
126
|
+
- **轴线规则 180° rule**:相机始终在主体连线同一侧,左右朝向恒定;越轴 = 人物突然「换边」,观众迷向。
|
|
127
|
+
- **运动方向一致 Screen direction**:同一运动在多镜间方向一致(上镜从左出,下镜从左进)。
|
|
128
|
+
- **匹配剪辑 Match cut**:相似形状/动作/构图衔接两镜。
|
|
129
|
+
- **J-cut / L-cut**:声音先于(J)或延续到(L)下一画面,自然过渡。
|
|
130
|
+
- **转场类型**:硬切 hard cut、叠化 dissolve、淡入淡出 fade、划像 wipe、跳切 jump cut、急切 smash cut。
|
|
131
|
+
|
|
132
|
+
> **链式衔接(本 skill 的硬规则)**:同一连续镜头被按长度拆成多 Call 时,后段首帧 = 前段末帧(见 SKILL.md「依赖列」),本质就是在守 continuity——别把一段连续动作拆成无依赖并行,那是长视频不连贯的根因(客户 P2)。
|
|
133
|
+
|
|
134
|
+
## 8. The Five C's(Mascelli)—— 描述一镜的五个维度
|
|
135
|
+
|
|
136
|
+
**Camera angles**(机位即叙事)· **Continuity**(逐镜一致)· **Cutting**(为剪辑而拍、记切点)· **Close-ups**(特写承载情绪/卖点)· **Composition**(怎么摆,不是有什么)。
|
|
137
|
+
**一镜 = 角度 + 构图(空间)× 连贯 + 切点(时间)× 特写(强调)**,五维缺一就退化成静态照片。
|
|
138
|
+
|
|
139
|
+
## 9. 导演拆镜 Checklist(看参考视频 / 写每一镜都走一遍)
|
|
140
|
+
|
|
141
|
+
对每个镜头依次回答 9 项,就能复述成专业 shot description:
|
|
142
|
+
|
|
143
|
+
**① 景别 → ② 机位角度 → ③ 运镜(起幅/落幅、方向、速度)→ ④ 焦段/景深 → ⑤ 光线(光向/光质/色温/光比)→ ⑥ 构图(主体占位、前后景、引导线)→ ⑦ 主体动作弧(动作从哪开始、到哪结束)→ ⑧ 该镜的戏剧 beat(这一镜要表达什么/情绪点)→ ⑨ 与下一镜怎么接(切点在哪个动作、视线/轴线/方向如何延续)**
|
|
144
|
+
|
|
145
|
+
**一句话压缩模板**:
|
|
146
|
+
> `[景别][机位] of [主体],[运镜 起→落],[焦段/景深],[光线],[构图];主体[动作弧];beat=[意图];在[切点/连贯关系]切下一镜。`
|
|
147
|
+
|
|
148
|
+
## 10. 同一镜:业余 vs 专业
|
|
149
|
+
|
|
150
|
+
**镜头**:手把产品拿起来展示。
|
|
151
|
+
|
|
152
|
+
❌ **业余**(静态、无参数、无动作弧):
|
|
153
|
+
> 中景,一只手拿着产品,暖色灯光,干净画面。
|
|
154
|
+
|
|
155
|
+
✅ **专业**(9 项落齐):
|
|
156
|
+
> **MCU 中近景、略仰拍**,35mm 标准焦段**浅景深**(产品在焦、背景虚化)。**柔和侧光从画左 45° 入射、暖白色温、中高光比**。构图:产品置**右三分交点**,手从**画面下方入框**作引导线,前景留虚化桌面分层。**动作弧**:手从桌面握起产品 → 抬至胸前 → **缓慢翻转 90°** 露出正面 logo。**Beat**:从「陈列」转到「邀请审视」,建立质感与信任。**在「翻转到位、产品静止」这一动作落点 cut on action**,切到 ECU 标签特写,保持手→产品的运动方向(由下入框)不越轴。
|
|
157
|
+
|
|
158
|
+
→ 专业版每一项都是模型能照拍的指令;业余版模型只能自由发挥 → 拍出僵在原地的「静态照片」。**复刻时,把参考片每镜按这 9 项拆出来照搬,就是把它「好看的原因」搬过来。**
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: confirm-card
|
|
3
|
+
purpose: "付费 gen 前的「可编辑确认卡 + 最小机械 guard」约定 —— video-gen / product-image-set 共用同一格式"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 确认卡(生成前的唯一确认点)
|
|
7
|
+
|
|
8
|
+
> **任何付费 `gen video` / `gen image` 批量之前**,先出这张卡,等用户确认/改完才生成。它**取代**原来分散的 COST-GATE:**一次确认**。⚠️ **成本由后端 billing 实扣,确认卡不自算金额、不编单价**(skill 没有权威单价;正解是 billing 报价接口,未落地前只列计费口径)。
|
|
9
|
+
|
|
10
|
+
## 卡的内容
|
|
11
|
+
|
|
12
|
+
| 字段 | 视频 | 套图 |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| 清单 | **真实 `call-N.txt` prompt 全文**(按 `prompt-craft.md` 五段式)——确认 / 改的就是**模型实际吃的那段文字**,不是 storyboard 大纲 | 逐图:类别 + prompt + 张数 |
|
|
15
|
+
| **复刻专属** | **编辑后首帧**(图生视频里最该确认的一张:产品替换/合成后的首帧,贴出来给用户看) | — |
|
|
16
|
+
| 参数 | 画质 + 时长 | 画质 + 张数 |
|
|
17
|
+
| 计费口径 | 段数 / **总秒数** / 画质 —— **skill 不估价、不写金额**;实扣由后端 billing 按实际时长算、生成后告知实际金额。脚注「重生/改图另计费」 | 同左 |
|
|
18
|
+
|
|
19
|
+
## 行为
|
|
20
|
+
|
|
21
|
+
1. 把上面内容摆成对话里**可直接改**的结构化清单——视频要把**每个 Call 的 `call-N.txt` prompt 全文**贴出来。
|
|
22
|
+
2. 明确邀请改:「要改哪条直接说」。
|
|
23
|
+
3. **用户改某 Call → 直接覆写对应的 `prompts/call-N.txt`**(改的就是喂模型的),把更新后的全文再贴回卡上确认。
|
|
24
|
+
4. 用户确认/改完 → 写 `.confirmed`(绑 prompt 校验和,见下)→ 才进入生成。**复刻路径即使 Fast-path 也必须过这张卡**(不"告知不审批")。**确认后禁止再改写 prompt**——生成只读这份 `call-N.txt`。
|
|
25
|
+
|
|
26
|
+
## 机械 guard(减速带级,适用任何付费 gen 批量)
|
|
27
|
+
|
|
28
|
+
> 纯文字层在付费 + Fast-path 下太被动。加一道**最小机械 guard**:确认通过才写标记,生成前查标记。
|
|
29
|
+
|
|
30
|
+
- **确认通过后**,在 video 工作目录写标记,**把当前 prompt 的校验和绑进去** + **引用用户原话**(承接已删的 video-clone `--quote` 反合理化模式):
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
sha256sum prompts/call-*.txt > .confirmed # 绑定:确认的 = 这份 prompt
|
|
34
|
+
echo "user said: <把用户确认的原话填进来>" >> .confirmed
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
- **每个生成波的 bash 最前面**前置两行(验过卡 + 验 prompt 没被改写):
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
[ -f .confirmed ] || { echo "ERR: 未过确认卡,拒绝付费生成"; exit 1; }
|
|
41
|
+
grep '\.txt$' .confirmed | sha256sum -c --status || { echo "ERR: prompt 跟确认的不是同一版(被改写过)→ 重新确认"; exit 1; }
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- **定位**:校验和把这道从"验确认卡存在"升到"**验生成用的就是用户确认的那份 prompt**"——确认后 agent 再偷偷改写 `call-N.txt`、或漏过卡,都会被第二行拦住。挡不住的只剩"明知故犯地重写 prompt + 重算校验和"。
|
|
45
|
+
|
|
46
|
+
## 重新 gate 边界(D-E)
|
|
47
|
+
|
|
48
|
+
- **已确认集内的替换/重生**(同 N 张 / 同分镜)→ 不重出卡;但这是**有意放松**——集内重生是独立计费的 `gen`,会产生额外扣费(实扣以 billing 为准),故卡上须提示「重生/改图另计费」。
|
|
49
|
+
- **方案改 / 净新增 / 画质升级 / 新一轮 N** → 先 `rm .confirmed`,重出卡。emit 卡的步骤负责删旧标记。
|