@optima-chat/optima-agent 0.8.91 → 0.8.93
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/browser/SKILL.md +8 -0
- package/.claude/skills/homepage/SKILL.md +4 -3
- package/.claude/skills/kol-outreach/SKILL.md +371 -0
- package/.claude/skills/kol-outreach/template/campaign/CONFIG.md +60 -0
- package/.claude/skills/kol-outreach/template/campaign/CONVERSATIONS/.gitkeep +0 -0
- package/.claude/skills/kol-outreach/template/campaign/KOLS.md +6 -0
- package/.claude/skills/kol-outreach/template/campaign/PROGRESS.md +3 -0
- package/.claude/skills/kol-outreach/template/campaign/TEMPLATES.md +88 -0
- package/.claude/skills/kol-outreach/template/campaign/assets/.gitkeep +0 -0
- package/.claude/skills/kol-outreach/template/merchant/BRAND.md +36 -0
- package/.claude/skills/kol-outreach/template/merchant/CAMPAIGNS.md +6 -0
- package/.claude/skills/kol-outreach/template/merchant/MERCHANT_LIMITS.md +16 -0
- package/.claude/skills/kol-outreach/template/merchant/PROGRESS.md +4 -0
- package/.claude/skills/kol-outreach/template/merchant/README.md +20 -0
- package/.claude/skills/video-clone/SKILL.md +125 -217
- package/.claude/skills/video-clone/assets/phase-state-template.json +11 -0
- package/.claude/skills/video-clone/references/ffmpeg-commands.md +31 -34
- package/.claude/skills/video-clone/references/gate-enforcement.md +144 -0
- package/.claude/skills/video-clone/references/kling-api.md +75 -75
- package/.claude/skills/video-clone/references/url-parsing.md +32 -13
- package/.claude/skills/video-clone/scripts/_confirm.py +96 -0
- package/.claude/skills/video-clone/scripts/_confirm_test.py +125 -0
- package/.claude/skills/video-clone/scripts/_gate.py +162 -0
- package/.claude/skills/video-clone/scripts/_gate_e2e_test.py +226 -0
- package/.claude/skills/video-clone/scripts/_gate_test.py +148 -0
- package/.claude/skills/video-clone/scripts/_project.py +56 -0
- package/.claude/skills/video-clone/scripts/analyze_source.py +113 -0
- package/.claude/skills/video-clone/scripts/analyze_source_test.py +52 -0
- package/.claude/skills/video-clone/scripts/assemble.py +106 -0
- package/.claude/skills/video-clone/scripts/confirm.py +12 -0
- package/.claude/skills/video-clone/scripts/edit_first_frame.py +66 -0
- package/.claude/skills/video-clone/scripts/extract_frames.py +108 -0
- package/.claude/skills/video-clone/scripts/gen_video.py +59 -0
- package/.claude/skills/video-clone/scripts/init_project.py +103 -0
- package/.claude/skills/video-clone/scripts/init_project_test.py +106 -0
- package/.claude/skills/video-clone/scripts/kling_generate.py +262 -0
- package/.claude/skills/video-clone/scripts/kling_generate_test.py +191 -0
- package/.claude/skills/video-clone/scripts/preflight.py +102 -0
- package/.claude/skills/video-clone/scripts/preview.py +208 -0
- package/.claude/skills/video-clone/scripts/preview_test.py +169 -0
- package/.claude/skills/video-clone/scripts/save_workflow.py +129 -0
- package/.claude/skills/video-clone/scripts/save_workflow_test.py +106 -0
- package/.claude/skills/video-clone/scripts/status.py +202 -0
- package/.claude/skills/video-clone/scripts/status_test.py +174 -0
- package/package.json +2 -1
|
@@ -1,291 +1,199 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: video-clone
|
|
3
|
-
description: "Use when user wants to clone/replicate a reference video with product swap, or generate a new video from product images + text descriptions. 触发场景:复刻视频(复刻/翻拍/仿拍/做同款/视频换产品/product swap/爆款复刻/video replication)、用户贴视频链接+产品图要求出同款视频、或用户提供图片/文字描述要求直接生成视频(生成视频/图生视频/做一个视频)。
|
|
3
|
+
description: "Use when user wants to clone/replicate a reference video with product swap, or generate a new video from product images + text descriptions. 触发场景:复刻视频(复刻/翻拍/仿拍/做同款/视频换产品/product swap/爆款复刻/video replication)、用户贴视频链接+产品图要求出同款视频、或用户提供图片/文字描述要求直接生成视频(生成视频/图生视频/做一个视频)。Pipeline is a script-based state machine under scripts/ — the generation scripts block until the user confirms the preview bundle. Requires `gen` CLI, video generation API via PiAPI, ffmpeg."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Video Clone
|
|
7
7
|
|
|
8
8
|
通过产品替换或文字描述,复刻源视频或生成全新视频。
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
> **PR #65 升级注意**:本版本采用单门 (single-gate) 模型。旧版三门
|
|
11
|
+
> (`plan_confirmed` / `prompt_confirmed` / `frame_confirmed`) 已废弃。
|
|
12
|
+
> 旧项目继续用旧脚本完成,新项目全部走本版本流程。
|
|
11
13
|
|
|
12
|
-
|
|
14
|
+
## 前置依赖
|
|
13
15
|
|
|
14
|
-
- **`gen` CLI** — `gen image`(首帧编辑)、`gen video`(
|
|
15
|
-
- **
|
|
16
|
+
- **`gen` CLI** — `gen image`(首帧编辑)、`gen video`(I2V,无音频时使用)
|
|
17
|
+
- **视频生成 API via PiAPI** — 有音频/口型同步时使用。需要 `PIAPI_KEY` 环境变量
|
|
16
18
|
- **ffmpeg / ffprobe** — 场景检测、抽帧、后处理
|
|
17
|
-
- **
|
|
18
|
-
|
|
19
|
-
触发 skill 前若检测到 `gen` CLI 不可用,必须立即告知用户,不要进入 Phase 0。
|
|
20
|
-
|
|
21
|
-
<HARD-GATE>
|
|
22
|
-
在技术方案获得用户确认前,禁止执行以下全部操作:下载源视频、ffprobe/ffmpeg 调用、抽帧、产品图处理、调用 gen image/gen video、调用 Kling API、创建 `gen-output/video-clone/{project}/` 项目目录。Phase 0.1 的"立即做"仅在 **用户已提供本地文件且未明确要求立即执行** 时方可进行;若用户要求"现在就开始/立刻执行/别问了",这些操作同样被阻断。
|
|
23
|
-
|
|
24
|
-
在 Phase 1 prompt 获得用户确认前,禁止进入 Phase 2(首帧编辑)。
|
|
25
|
-
在 Phase 2 首帧获得用户确认前,禁止进入 Phase 3(视频生成)。
|
|
26
|
-
|
|
27
|
-
**USER GATE 不可被用户单方面取消。** 即使用户说"不要问问题/我信任你/自己判断",仍必须输出技术方案并等待确认。用户可以说"方案我同意,继续"以确认,但不能预先豁免整个 GATE 机制。
|
|
28
|
-
|
|
29
|
-
每个 Phase 产物必须版本化命名,绝不覆盖已有文件。
|
|
30
|
-
</HARD-GATE>
|
|
31
|
-
|
|
32
|
-
## Rationalization Counter
|
|
33
|
-
|
|
34
|
-
以下是 Claude 最常用的"合理化借口"及其反驳。遇到这些想法时必须 STOP。
|
|
35
|
-
|
|
36
|
-
| Claude 的想法 | 现实 |
|
|
37
|
-
|---|---|
|
|
38
|
-
| "我只是在做 Phase 0 分析,下载视频不算执行" | 下载 = 工具调用 = 被 GATE 阻断。分析要基于用户提供的元数据(URL/文件名/描述),不是基于已下载的文件 |
|
|
39
|
-
| "用户说'急用'/'现在就开始',所以我可以跳过确认" | 用户的紧迫感不是跳过 GATE 的理由。相反,越急越要用技术方案快速对齐,避免返工 |
|
|
40
|
-
| "用户说'不要问问题,自己判断'" | 这是覆盖 0.2 提问环节的授权,**不是**覆盖 0.4 技术方案展示的授权。自己判断后仍要出方案 |
|
|
41
|
-
| "信息已经完整了,方案只是走过场" | 方案展示是用户发现隐含错误的最后机会。"完整"是你的判断,不是用户的判断 |
|
|
42
|
-
| "用户给了产品图,显然要直接开始" | 给产品图 ≠ 同意全部参数。音频/时长/风格/workflow 选择仍需确认 |
|
|
43
|
-
| "Phase 0.1 的场景检测是只读分析" | ffmpeg 抽帧会写盘,创建项目目录会写盘。任何文件系统写入都属于"执行"范畴 |
|
|
44
|
-
|
|
45
|
-
若 Claude 发现自己在使用上述任一借口,立刻停止并回到技术方案步骤。
|
|
19
|
+
- **Python ≥ 3.10** — 所有脚本运行时
|
|
20
|
+
- **freeimage.host** — 首帧上传时的公开 URL 托管(详见 [kling-api.md](references/kling-api.md))
|
|
46
21
|
|
|
47
|
-
|
|
22
|
+
触发 skill 后第一步:运行 `python scripts/preflight.py`,确认上述依赖。
|
|
48
23
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
### 0.1 素材收集与初步分析
|
|
52
|
-
|
|
53
|
-
收集用户提供的所有素材,快速判断任务类型:
|
|
54
|
-
|
|
55
|
-
```
|
|
56
|
-
用户输入 → 有源视频?
|
|
57
|
-
├─ 有视频 + 有产品图 → 视频复刻
|
|
58
|
-
├─ 有视频 + 无产品图 → 追问:要替换什么产品?
|
|
59
|
-
├─ 无视频 + 有图片 → 纯视频生成
|
|
60
|
-
└─ 只有文字描述 → 纯视频生成(需要更多信息)
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
**仅做轻量元数据识别,不执行工具调用**:
|
|
64
|
-
- 识别 URL 平台(TikTok/抖音/Instagram/小红书/本地文件)并告知用户将使用哪种解析方式
|
|
65
|
-
- 如果用户已提供本地视频文件路径,可以读取文件大小/类型(不抽帧)
|
|
66
|
-
- 基于 URL/文件名/用户描述推断大致内容和复杂度
|
|
67
|
-
|
|
68
|
-
**不要在此步骤**:下载视频、调用 ffprobe/ffmpeg、抽帧、创建项目目录。这些操作属于 Phase 1,必须在技术方案确认后才能执行。
|
|
24
|
+
## 脚本 Pipeline 一览
|
|
69
25
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
### 0.2 关键问题(按需提问,不要一次全问)
|
|
73
|
-
|
|
74
|
-
根据已有信息,挑最关键的 1-2 个问题问:
|
|
75
|
-
|
|
76
|
-
| 需要了解的 | 什么时候问 | 示例 |
|
|
77
|
-
|---|---|---|
|
|
78
|
-
| 产品是什么 | 用户没提供产品图 | "你要在视频里展示什么产品?有产品图吗?" |
|
|
79
|
-
| 替换目标 | 源视频里有多个物品 | "视频里有手机和平板,你要替换哪个?" |
|
|
80
|
-
| 视频用途 | 影响风格和质量选择 | "这个视频是发抖音/TikTok/电商详情页?" |
|
|
81
|
-
| 音频需求 | 影响工具选择和成本 | "需要保留人声/口型同步吗?(有音频用 Kling ~$1,无音频 ~$0.02)" |
|
|
82
|
-
| 时长期望 | 源视频很长或用户没说 | "源视频 30s,要复刻全部还是选一段?" |
|
|
83
|
-
| 风格偏好 | 纯生成时 | "想要什么感觉?真实纪录片风?还是广告感?" |
|
|
84
|
-
|
|
85
|
-
**不要问用户已经给出答案的问题。**
|
|
86
|
-
|
|
87
|
-
### 0.3 匹配 Workflow
|
|
88
|
-
|
|
89
|
-
理解需求后,读取 `gen-output/video-clone/workflows/README.md` 查找匹配的 workflow。
|
|
26
|
+
单门模型:所有 prep 脚本自由运行,preview 之后只有一个 GATE。
|
|
90
27
|
|
|
91
28
|
```
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
29
|
+
preflight.py
|
|
30
|
+
↓
|
|
31
|
+
init_project.py (Phase 0 — 创建项目目录 + 状态文件)
|
|
32
|
+
↓
|
|
33
|
+
analyze_source.py (Phase 1, 复刻才需要)
|
|
34
|
+
extract_frames.py (Phase 1, 复刻才需要)
|
|
35
|
+
↓
|
|
36
|
+
Claude 分析帧网格,写 prompt.md
|
|
37
|
+
edit_first_frame.py (Phase 2, 复刻才需要)
|
|
38
|
+
写 cost.json (可选,估算成本)
|
|
39
|
+
↓
|
|
40
|
+
preview.py (汇总所有 prep 产物 → preview_vN.md)
|
|
41
|
+
↓
|
|
42
|
+
[展示 preview 给用户,等待确认]
|
|
43
|
+
↓
|
|
44
|
+
confirm.py --quote "<用户原话>" ← 唯一 GATE
|
|
45
|
+
↓
|
|
46
|
+
kling_generate.py (Phase 3, 有音频)
|
|
47
|
+
gen_video.py (Phase 3, 无音频)
|
|
48
|
+
↓
|
|
49
|
+
assemble.py (Phase 4 — 标准化/拼接)
|
|
50
|
+
↓
|
|
51
|
+
save_workflow.py (Phase 5 — 可选,效果好时沉淀)
|
|
97
52
|
```
|
|
98
53
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
54
|
+
`kling_generate.py`、`gen_video.py`、`save_workflow.py` 启动时调用
|
|
55
|
+
`require_gate("preview_confirmed")`,未确认就 exit 1 并打印
|
|
56
|
+
`[HARD-GATE BLOCKED]`。详见 [gate-enforcement.md](references/gate-enforcement.md)。
|
|
102
57
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
```markdown
|
|
108
|
-
## 技术方案
|
|
109
|
-
|
|
110
|
-
**任务**: [视频复刻 / 纯视频生成]
|
|
111
|
-
**源视频**: [时长]s, [分辨率], [单/多片段(N段)]
|
|
112
|
-
**产品**: [产品名称+关键特征]
|
|
113
|
-
**参考 Workflow**: [workflow 名称] / 无(新场景)
|
|
114
|
-
|
|
115
|
-
**执行计划**:
|
|
116
|
-
1. 首帧编辑 — gen image [单图/双图] 替换 [目标物品] 为 [新产品]
|
|
117
|
-
2. 视频生成 — [Kling 3.0(有音频) / gen video(无音频)], [时长]s
|
|
118
|
-
3. 后处理 — [直出 / N段拼接]
|
|
58
|
+
<HARD-GATE>
|
|
59
|
+
**Gate 由脚本机械强制,不是文本约定。** 任何绕过 gate 的方式都会留下证据:
|
|
60
|
+
1. 手工编辑 `.state/phase.json` — history 字段会显示断点
|
|
61
|
+
2. 伪造 `--quote` 调用 `confirm.py` — user_quote 字段留痕,事后可倒查
|
|
119
62
|
|
|
120
|
-
|
|
121
|
-
|
|
63
|
+
**USER GATE 不可被用户单方面取消。** 即使用户说"不要问问题/我信任你/自己判断",
|
|
64
|
+
仍必须展示 preview bundle 并等待确认。用户可以说"可以,开始"以确认,但不能
|
|
65
|
+
预先豁免整个 GATE 机制。
|
|
122
66
|
|
|
123
|
-
|
|
124
|
-
|
|
67
|
+
每个 Phase 产物必须版本化命名(脚本通过 `_project.next_version()` 自动处理),
|
|
68
|
+
绝不覆盖已有文件。
|
|
69
|
+
</HARD-GATE>
|
|
125
70
|
|
|
126
|
-
|
|
71
|
+
## Rationalization Counter
|
|
127
72
|
|
|
128
|
-
|
|
73
|
+
以下是最常见的"合理化借口"及其反驳。遇到这些想法时必须 STOP。
|
|
129
74
|
|
|
130
|
-
|
|
|
75
|
+
| Claude 的想法 | 现实 |
|
|
131
76
|
|---|---|
|
|
132
|
-
|
|
|
133
|
-
| 用户说"
|
|
134
|
-
| 用户说
|
|
135
|
-
|
|
|
136
|
-
|
|
|
137
|
-
|
|
|
138
|
-
|
|
|
139
|
-
|
|
140
|
-
**[USER GATE] 用户确认技术方案后,进入 Phase 1。**
|
|
141
|
-
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
## Phase 1-4: 执行 Pipeline
|
|
145
|
-
|
|
146
|
-
技术方案确认后,按 Checklist 顺序执行。如果匹配到 workflow,优先按 workflow 的策略执行。
|
|
147
|
-
|
|
148
|
-
### 视频复刻 Checklist
|
|
77
|
+
| "我只是在做 Phase 0 分析,下载视频不算执行" | 下载 = 工具调用。分析基于用户提供的元数据,不是基于已下载的文件 |
|
|
78
|
+
| "用户说'急用'/'现在就开始',所以可以跳过确认" | 紧迫感不是跳过 GATE 的理由。越急越要快速对齐,避免返工 |
|
|
79
|
+
| "用户说'不要问问题,自己判断'" | 覆盖提问,**不覆盖** preview 展示。自己判断后仍要出 preview |
|
|
80
|
+
| "信息已经完整了,preview 只是走过场" | preview 是用户发现隐含错误的最后机会 |
|
|
81
|
+
| "我直接运行 kling_generate 只是测试" | 脚本 exit 1,测试什么都看不到 |
|
|
82
|
+
| "我 `python -c 'import _gate; _gate.set_gate(...)'` 自己设 gate" | history 字段暴露没走 confirm.py 正常路径 |
|
|
83
|
+
| "prep 脚本没有 gate,所以我可以随意运行" | prep 脚本确实无 gate — 但 **preview → confirm** 这一步仍是必须的 |
|
|
149
84
|
|
|
150
|
-
|
|
151
|
-
1. **创建项目目录** — `gen-output/video-clone/{project}/`,保存素材到 `source/`
|
|
152
|
-
2. **抽帧分析** — 等间距抽帧 → 帧网格 → Claude Opus 逐帧分析
|
|
153
|
-
3. **生成 prompt** — 中文 6 段 motion prompt → 写入 `prompt.md` → **打印给用户**。详见 [prompt-template.md](references/prompt-template.md)
|
|
154
|
-
4. **[USER GATE] prompt 确认** — 未获确认前禁止进入 Phase 2
|
|
85
|
+
## Phase 0: 理解需求 + 匹配 Workflow
|
|
155
86
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
5. **首帧编辑** — gen image 产品替换 → 版本化保存到 `frames/`
|
|
159
|
-
6. **[USER GATE] 首帧质检** — 展示给用户,确认产品清晰/位置自然/人物保持/背景一致。未获确认前禁止进入 Phase 3
|
|
160
|
-
|
|
161
|
-
**Phase 3 — 视频生成**
|
|
162
|
-
|
|
163
|
-
7. **视频生成** — 对用户只显示 "视频生成中..."。详见 [kling-api.md](references/kling-api.md)
|
|
164
|
-
|
|
165
|
-
**Phase 4 — 后处理与交付**
|
|
166
|
-
|
|
167
|
-
8. **后处理** — ffmpeg 标准化/拼接 → `final_v{N}.mp4`。详见 [ffmpeg-commands.md](references/ffmpeg-commands.md)
|
|
168
|
-
9. **更新日志** — 结果写入 `log.md`,交付
|
|
169
|
-
|
|
170
|
-
### 纯视频生成 Checklist
|
|
171
|
-
|
|
172
|
-
**Phase 1 — Prompt 生成**
|
|
173
|
-
1. **创建项目目录** — 保存素材到 `source/`
|
|
174
|
-
2. **生成 prompt** — 根据技术方案编写 → 写入 `prompt.md` → **打印给用户**
|
|
175
|
-
3. **[USER GATE] prompt 确认** — 未获确认前禁止进入 Phase 3
|
|
87
|
+
**在动手之前,先搞清楚用户到底要什么,再看有没有现成的好方案。**
|
|
176
88
|
|
|
177
|
-
|
|
89
|
+
快速判断任务类型:有源视频 + 产品图 → 视频复刻;无源视频 → 纯视频生成。
|
|
178
90
|
|
|
179
|
-
|
|
91
|
+
**仅做轻量元数据识别,不执行工具调用**。不下载视频、不调 ffprobe、不抽帧。
|
|
180
92
|
|
|
181
|
-
|
|
93
|
+
按需提问(不一次全问):产品是什么、替换目标、音频需求(有音频 ~$1.50/10s,无音频 ~$0.02/10s,扣 Optima credits 由服务端中间件完成)、时长期望。
|
|
182
94
|
|
|
183
|
-
|
|
95
|
+
先查 `gen-output/video-clone/workflows/README.md` — 完全匹配 → 复用;部分匹配 → 调整;
|
|
96
|
+
无匹配 → 走通用 pipeline。详见 [workflow-system.md](references/workflow-system.md)。
|
|
184
97
|
|
|
185
|
-
## Phase
|
|
98
|
+
## Phase 1-2: Prep(自主运行,无 gate)
|
|
186
99
|
|
|
187
|
-
|
|
100
|
+
Prep 阶段所有脚本均无 gate,可自主运行:
|
|
188
101
|
|
|
102
|
+
```bash
|
|
103
|
+
python scripts/init_project.py --name <slug> --task-type video_clone
|
|
104
|
+
python scripts/analyze_source.py --project <slug> --source <path>
|
|
105
|
+
python scripts/extract_frames.py --project <slug> --source <path>
|
|
106
|
+
# Claude 分析帧网格,写 prompt.md
|
|
107
|
+
python scripts/edit_first_frame.py --project <slug> --image <frame> --product <img>
|
|
108
|
+
# 写 cost.json(可选)
|
|
109
|
+
python scripts/preview.py --project <slug>
|
|
189
110
|
```
|
|
190
|
-
用户满意?
|
|
191
|
-
├─ 满意 + 新场景(无匹配 workflow) → 保存为新 workflow
|
|
192
|
-
├─ 满意 + 基于已有 workflow 调整 → 更新已有 workflow 或另存变体
|
|
193
|
-
└─ 不满意 / 已有 workflow 完全复用 → 不操作
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
保存时:在 `workflows/` 创建 `.md` 文件,更新 `README.md` 索引。
|
|
197
|
-
详见 [workflow-system.md](references/workflow-system.md)
|
|
198
111
|
|
|
199
|
-
|
|
112
|
+
`preview.py` 检查所有 prep 产物是否齐全,输出 `preview_vN.md`(六节)。
|
|
200
113
|
|
|
201
|
-
|
|
202
|
-
digraph video_clone {
|
|
203
|
-
rankdir=TB;
|
|
204
|
-
node [shape=box];
|
|
114
|
+
**[USER GATE] 把 preview 展示给用户,等待确认,然后运行:**
|
|
205
115
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
"素材收集 + 初步分析" -> "关键问题(按需)";
|
|
211
|
-
"关键问题(按需)" -> "查 workflows/README.md";
|
|
212
|
-
"查 workflows/README.md" -> "输出技术方案\n(含 workflow 推荐)";
|
|
213
|
-
"输出技术方案\n(含 workflow 推荐)" -> "用户确认方案?";
|
|
116
|
+
```bash
|
|
117
|
+
python scripts/confirm.py --project <slug> --quote "<用户原话>"
|
|
118
|
+
```
|
|
214
119
|
|
|
215
|
-
|
|
216
|
-
"用户确认方案?" -> "抽帧分析 + 生成 prompt" [label="确认"];
|
|
120
|
+
## Phase 3-5: 生成 + 后处理 + 沉淀
|
|
217
121
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
122
|
+
```bash
|
|
123
|
+
# Phase 3 — 视频生成(需要 preview_confirmed)
|
|
124
|
+
python scripts/kling_generate.py --project <slug> --frame frames/frame_vN.png
|
|
125
|
+
# 或无音频版本:
|
|
126
|
+
python scripts/gen_video.py --project <slug> --frame frames/frame_vN.png
|
|
221
127
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
"用户确认首帧?" -> "视频生成 → 后处理 → 交付" [label="满意"];
|
|
128
|
+
# Phase 4 — 后处理
|
|
129
|
+
python scripts/assemble.py --project <slug> --single videos/video_vN.mp4
|
|
225
130
|
|
|
226
|
-
|
|
227
|
-
|
|
131
|
+
# Phase 5 — 沉淀(可选)
|
|
132
|
+
python scripts/save_workflow.py --project <slug> \
|
|
133
|
+
--name <workflow-slug> --scene "<适用场景>" \
|
|
134
|
+
--rating <1-5> --strategy "<关键策略>"
|
|
228
135
|
```
|
|
229
136
|
|
|
230
137
|
## 铁律
|
|
231
138
|
|
|
232
|
-
|
|
233
|
-
1. 先理解再动手 — 技术方案未确认前不执行任何生成操作
|
|
139
|
+
1. 先理解再动手 — 出 preview 前先跑完所有 prep 脚本
|
|
234
140
|
2. 先查 workflow 再造轮子 — 已有经验不要浪费
|
|
235
141
|
3. 首帧质量决定一切 — 自动选产品最清晰+手部最自然的帧
|
|
236
|
-
4.
|
|
237
|
-
5.
|
|
238
|
-
6.
|
|
239
|
-
```
|
|
142
|
+
4. Prompt 质量 = 视频质量 — preview 里展示给用户,用户可能修改
|
|
143
|
+
5. 永远不覆盖文件 — 脚本通过 next_version() 自动 v{N} 递增
|
|
144
|
+
6. 不要自己编辑 .state/phase.json — 还不如走 confirm.py 正常路径
|
|
240
145
|
|
|
241
146
|
## 项目目录
|
|
242
147
|
|
|
243
148
|
```
|
|
244
149
|
gen-output/video-clone/
|
|
245
|
-
├── workflows/
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
├──
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
│ ├── prompt.md
|
|
253
|
-
│ └── log.md
|
|
150
|
+
├── workflows/ ← Workflow 经验库(README.md 索引)
|
|
151
|
+
└── {project}/
|
|
152
|
+
├── .state/phase.json ← Gate 状态机
|
|
153
|
+
├── source/ ← 原始素材 + analysis_vN.json
|
|
154
|
+
├── frames/ ← extract_vN/ + frame_vN.png
|
|
155
|
+
├── videos/ ← video_vN.mp4 + final_vN.mp4
|
|
156
|
+
├── prompt.md cost.json preview_vN.md log.md
|
|
254
157
|
```
|
|
255
158
|
|
|
256
|
-
|
|
257
|
-
|
|
159
|
+
新任务 → 新目录;改 prompt/换 seed → 同目录 v{N}+1。
|
|
160
|
+
跨会话续接:先 `python scripts/status.py --project <slug>` 看当前状态和下一步。
|
|
258
161
|
|
|
259
162
|
## 工具分工
|
|
260
163
|
|
|
261
|
-
| 工具 | 职责 |
|
|
262
|
-
|
|
263
|
-
|
|
|
264
|
-
|
|
|
265
|
-
|
|
|
266
|
-
|
|
|
267
|
-
|
|
|
164
|
+
| 工具 | 脚本 | 职责 |
|
|
165
|
+
|---|---|---|
|
|
166
|
+
| Claude | — | 需求理解 + 逐帧分析 → 中文 6 段 prompt |
|
|
167
|
+
| gen image | `edit_first_frame.py` | 首帧编辑(双图模式) |
|
|
168
|
+
| gen video | `gen_video.py` | I2V(不需要音频) |
|
|
169
|
+
| 视频生成 API | `kling_generate.py` | 有音频/口型同步。详见 [kling-api.md](references/kling-api.md) |
|
|
170
|
+
| ffmpeg | `analyze_source.py` / `extract_frames.py` / `assemble.py` | 抽帧、场景检测、后处理 |
|
|
171
|
+
|
|
172
|
+
**不要在回复中提及具体模型名称**(如 "Kling 3.0"、"Wan 2.6")。
|
|
173
|
+
只说"视频生成中..."或"已提交生成任务"。
|
|
268
174
|
|
|
269
175
|
## 首帧编辑策略
|
|
270
176
|
|
|
271
|
-
|
|
177
|
+
**单片段**:`edit_first_frame.py` 用双图(`-i 源帧 -i 产品图`),保持场景只替换产品。
|
|
272
178
|
**多片段**:每段仅 `-i 产品图`,prompt 描述完整场景,产品描述跨段重复。
|
|
273
179
|
|
|
274
180
|
## Anti-Pattern
|
|
275
181
|
|
|
276
182
|
| 你在想... | 应该做的 |
|
|
277
183
|
|---|---|
|
|
278
|
-
| 用户给了素材直接开干 |
|
|
279
|
-
| 不看 workflow 库直接走通用 |
|
|
184
|
+
| 用户给了素材直接开干 | **先 preflight + 跑完 prep + 出 preview + confirm.py** |
|
|
185
|
+
| 不看 workflow 库直接走通用 | 先查 `workflows/README.md` |
|
|
280
186
|
| 直接取 t=1s 当首帧 | 自动选产品最清晰的帧 |
|
|
281
|
-
| prompt 不给用户看 |
|
|
282
|
-
|
|
|
283
|
-
|
|
|
187
|
+
| prompt 不给用户看 | **必须在 preview 里展示,用户可能修改** |
|
|
188
|
+
| 跳过 preview 直接 confirm | preview.py 会验证所有 prep 产物是否齐全 |
|
|
189
|
+
| 告诉用户具体模型名称 | 只说 "视频生成中..." 不透露底层模型 |
|
|
284
190
|
| 做出好效果不保存 workflow | **效果好 + 新场景 = 必须沉淀** |
|
|
285
|
-
| 覆盖之前生成的文件 | v{N}
|
|
191
|
+
| 覆盖之前生成的文件 | 脚本自动 v{N} 递增 |
|
|
192
|
+
| 把 `--quote "ok"` 当成真实确认 | 伪造 quote 会在 history 留痕,事后可倒查 |
|
|
286
193
|
|
|
287
194
|
## 已知限制
|
|
288
195
|
|
|
289
196
|
- 单段最长 10s,多段需拼接
|
|
290
197
|
- 动作模型自编,不还原源视频动作序列
|
|
291
|
-
- PiAPI CDN
|
|
198
|
+
- PiAPI CDN 不稳定,`kling_generate.py` 内置 3 次重试
|
|
199
|
+
- 平台解析(TikTok/抖音/Instagram/小红书)仍需手动调 `scout` 命令,不在脚本 pipeline 里(详见 [url-parsing.md](references/url-parsing.md))
|
|
@@ -1,45 +1,42 @@
|
|
|
1
|
-
# FFmpeg
|
|
1
|
+
# FFmpeg — where the commands live
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The ffmpeg commands you'd have inlined here are owned by scripts now. Read
|
|
4
|
+
the script source if you need to see the exact flags.
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
| What | Script |
|
|
7
|
+
|---|---|
|
|
8
|
+
| ffprobe + scene detection (`select='gt(scene,0.3)'`) | `scripts/analyze_source.py` |
|
|
9
|
+
| equidistant frame extraction + tile grid | `scripts/extract_frames.py` |
|
|
10
|
+
| single-segment normalize (`-r 30 -crf 18 -c:a aac -b:a 192k`) | `scripts/assemble.py --single` |
|
|
11
|
+
| multi-segment normalize + concat (scale=720:1280 + concat demuxer) | `scripts/assemble.py --multi` |
|
|
9
12
|
|
|
10
|
-
|
|
13
|
+
## Single vs multi-segment heuristic
|
|
11
14
|
|
|
12
|
-
|
|
15
|
+
`analyze_source.py` classifies automatically:
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
- scene cuts ≤1 (after filtering out cuts <0.5s apart) → `classification: single`
|
|
18
|
+
- scene cuts ≥2 → `classification: multi`
|
|
16
19
|
|
|
17
|
-
|
|
20
|
+
If the auto-classification is wrong, override the plan manually — don't
|
|
21
|
+
edit the script.
|
|
18
22
|
|
|
19
|
-
|
|
20
|
-
ffmpeg -y -i videos/video_v1_10s.mp4 \
|
|
21
|
-
-r 30 -c:v libx264 -crf 18 -c:a aac -b:a 192k \
|
|
22
|
-
videos/final_v1.mp4
|
|
23
|
-
```
|
|
23
|
+
## Things the scripts deliberately don't do
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
- **Audio replacement from source** — Kling 3.0 handles lip sync itself;
|
|
26
|
+
don't splice the source audio back in or you'll get misaligned mouths.
|
|
27
|
+
- **Resolution auto-detection for multi-segment** — `assemble.py --multi`
|
|
28
|
+
hardcodes `scale=720:1280`. If your source is different, pass pre-scaled
|
|
29
|
+
clips or extend the script.
|
|
30
|
+
- **Re-encoding `final_v{N}.mp4` after assembly** — if final looks wrong,
|
|
31
|
+
regenerate the constituent videos, not the final.
|
|
26
32
|
|
|
27
|
-
|
|
28
|
-
# 1. 标准化每个 clip
|
|
29
|
-
ffmpeg -y -i videos/scene1_v1_5s.mp4 \
|
|
30
|
-
-vf scale=720:1280 -r 30 -c:v libx264 -crf 18 -c:a aac -b:a 128k \
|
|
31
|
-
scene1_norm.mp4
|
|
32
|
-
|
|
33
|
-
# 2. 拼接
|
|
34
|
-
echo "file 'scene1_norm.mp4'
|
|
35
|
-
file 'scene2_norm.mp4'" > concat_list.txt
|
|
36
|
-
|
|
37
|
-
ffmpeg -y -f concat -safe 0 -i concat_list.txt \
|
|
38
|
-
-c:v libx264 -crf 18 -c:a aac -b:a 192k \
|
|
39
|
-
videos/final_v1.mp4
|
|
40
|
-
```
|
|
33
|
+
## Raw command reference (only when debugging outside the scripts)
|
|
41
34
|
|
|
42
|
-
|
|
35
|
+
```bash
|
|
36
|
+
# probe metadata
|
|
37
|
+
ffprobe -v quiet -print_format json -show_format -show_streams video.mp4
|
|
43
38
|
|
|
44
|
-
|
|
45
|
-
|
|
39
|
+
# concat list format (scripts generate this automatically)
|
|
40
|
+
file 'clip1_norm.mp4'
|
|
41
|
+
file 'clip2_norm.mp4'
|
|
42
|
+
```
|