@optima-chat/optima-agent 0.8.90 → 0.8.91
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/video-clone/SKILL.md +188 -389
- package/.claude/skills/video-clone/references/ffmpeg-commands.md +45 -0
- package/.claude/skills/video-clone/references/kling-api.md +85 -0
- package/.claude/skills/video-clone/references/prompt-template.md +71 -0
- package/.claude/skills/video-clone/references/url-parsing.md +13 -0
- package/.claude/skills/video-clone/references/workflow-system.md +92 -0
- package/package.json +1 -1
|
@@ -1,492 +1,291 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: video-clone
|
|
3
|
-
description: "
|
|
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)、用户贴视频链接+产品图要求出同款视频、或用户提供图片/文字描述要求直接生成视频(生成视频/图生视频/做一个视频)。Requires `gen` CLI (gen image / gen video) and Kling 3.0 API (via PiAPI)."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Video Clone
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
通过产品替换或文字描述,复刻源视频或生成全新视频。
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
- "帮我复刻这个视频" + 视频 + 产品图 → **视频复刻**:判断单/多片段,走 Pipeline
|
|
12
|
-
- "帮我做同款视频" + 视频 + 产品图 → 同上
|
|
13
|
-
- "帮我分析一下这个视频" + 视频 → 只跑 Phase 1(分析+场景拆分)
|
|
14
|
-
- "换个首帧试试" → 回到 Phase 2 重跑
|
|
15
|
-
- "prompt 改一下" → 用户修改 prompt 后重跑 Phase 3
|
|
16
|
-
- "帮我生成一个视频" + 图片 + 描述 → **纯视频生成**(无源视频)
|
|
17
|
-
- "用这张图做个视频" + 图片 → 同上
|
|
10
|
+
## 前置依赖
|
|
18
11
|
|
|
19
|
-
|
|
12
|
+
此 skill 依赖以下外部工具,缺失其中任何一项会导致 pipeline 中断:
|
|
20
13
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
```
|
|
14
|
+
- **`gen` CLI** — `gen image`(首帧编辑)、`gen video`(Wan 2.6 I2V,无音频时使用)
|
|
15
|
+
- **Kling 3.0 API**(通过 PiAPI,`PIAPI_KEY` 环境变量)— 有音频/口型同步时使用
|
|
16
|
+
- **ffmpeg / ffprobe** — 场景检测、抽帧、后处理
|
|
17
|
+
- **freeimage.host** — Kling 上传首帧时的公开 URL 托管(详见 [kling-api.md](references/kling-api.md))
|
|
26
18
|
|
|
27
|
-
|
|
19
|
+
触发 skill 前若检测到 `gen` CLI 不可用,必须立即告知用户,不要进入 Phase 0。
|
|
28
20
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
→ 不需要音频 → gen video(Wan 2.6,~$0.02)
|
|
32
|
-
→ 需要音频 → Kling 3.0 API(~$1.00)
|
|
33
|
-
```
|
|
21
|
+
<HARD-GATE>
|
|
22
|
+
在技术方案获得用户确认前,禁止执行以下全部操作:下载源视频、ffprobe/ffmpeg 调用、抽帧、产品图处理、调用 gen image/gen video、调用 Kling API、创建 `gen-output/video-clone/{project}/` 项目目录。Phase 0.1 的"立即做"仅在 **用户已提供本地文件且未明确要求立即执行** 时方可进行;若用户要求"现在就开始/立刻执行/别问了",这些操作同样被阻断。
|
|
34
23
|
|
|
35
|
-
|
|
24
|
+
在 Phase 1 prompt 获得用户确认前,禁止进入 Phase 2(首帧编辑)。
|
|
25
|
+
在 Phase 2 首帧获得用户确认前,禁止进入 Phase 3(视频生成)。
|
|
36
26
|
|
|
37
|
-
|
|
27
|
+
**USER GATE 不可被用户单方面取消。** 即使用户说"不要问问题/我信任你/自己判断",仍必须输出技术方案并等待确认。用户可以说"方案我同意,继续"以确认,但不能预先豁免整个 GATE 机制。
|
|
38
28
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
| TikTok `tiktok.com/@xxx/video/数字` | `scout tiktok video-detail <id>` → wget |
|
|
42
|
-
| TikTok 短链 `vm.tiktok.com/xxx` | `curl -sI` → Location → 提取 id |
|
|
43
|
-
| 抖音 `douyin.com/video/数字` | `scout douyin video-download <id>` → wget |
|
|
44
|
-
| 抖音短链 `v.douyin.com/xxx` | `scout douyin video-by-url "<url>"` |
|
|
45
|
-
| Instagram Reels | `scout instagram download-reel "<url>"` |
|
|
46
|
-
| 小红书视频 | `scout xhs note-detail <id>` → 视频链接 |
|
|
47
|
-
| 本地文件 | 直接使用 |
|
|
29
|
+
每个 Phase 产物必须版本化命名,绝不覆盖已有文件。
|
|
30
|
+
</HARD-GATE>
|
|
48
31
|
|
|
49
|
-
##
|
|
32
|
+
## Rationalization Counter
|
|
50
33
|
|
|
51
|
-
|
|
34
|
+
以下是 Claude 最常用的"合理化借口"及其反驳。遇到这些想法时必须 STOP。
|
|
52
35
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
→ Phase 2:FLUX-PRO 首帧编辑 → 保存到 frames/
|
|
62
|
-
├─ 展示首帧(Read 图片)
|
|
63
|
-
└─ "产品替换满意吗?"
|
|
64
|
-
→ Phase 3:"视频生成中..." → 保存到 videos/
|
|
65
|
-
→ Phase 4:后处理 → final_v{N}.mp4 → 更新 log.md 结果
|
|
66
|
-
|
|
67
|
-
⚠️ 两个交互点:prompt 确认 + 首帧质检
|
|
68
|
-
⚠️ Phase 3/4 自动执行
|
|
69
|
-
⚠️ 每步产物都保存,log.md 实时更新
|
|
70
|
-
```
|
|
36
|
+
| Claude 的想法 | 现实 |
|
|
37
|
+
|---|---|
|
|
38
|
+
| "我只是在做 Phase 0 分析,下载视频不算执行" | 下载 = 工具调用 = 被 GATE 阻断。分析要基于用户提供的元数据(URL/文件名/描述),不是基于已下载的文件 |
|
|
39
|
+
| "用户说'急用'/'现在就开始',所以我可以跳过确认" | 用户的紧迫感不是跳过 GATE 的理由。相反,越急越要用技术方案快速对齐,避免返工 |
|
|
40
|
+
| "用户说'不要问问题,自己判断'" | 这是覆盖 0.2 提问环节的授权,**不是**覆盖 0.4 技术方案展示的授权。自己判断后仍要出方案 |
|
|
41
|
+
| "信息已经完整了,方案只是走过场" | 方案展示是用户发现隐含错误的最后机会。"完整"是你的判断,不是用户的判断 |
|
|
42
|
+
| "用户给了产品图,显然要直接开始" | 给产品图 ≠ 同意全部参数。音频/时长/风格/workflow 选择仍需确认 |
|
|
43
|
+
| "Phase 0.1 的场景检测是只读分析" | ffmpeg 抽帧会写盘,创建项目目录会写盘。任何文件系统写入都属于"执行"范畴 |
|
|
71
44
|
|
|
72
|
-
|
|
45
|
+
若 Claude 发现自己在使用上述任一借口,立刻停止并回到技术方案步骤。
|
|
73
46
|
|
|
74
|
-
|
|
75
|
-
图片 + 描述
|
|
76
|
-
→ 创建 gen-output/video-clone/{project}/ 目录
|
|
77
|
-
→ Claude 编写中文 6 段 prompt → 写入 prompt.md + 打印给用户
|
|
78
|
-
→ 用户确认或编辑 prompt.md → "视频生成中..." → 保存到 videos/
|
|
79
|
-
→ 交付 → 更新 log.md 结果
|
|
80
|
-
```
|
|
47
|
+
## Phase 0: 理解需求 + 匹配 Workflow + 技术方案
|
|
81
48
|
|
|
82
|
-
|
|
49
|
+
**在动手之前,先搞清楚用户到底要什么,再看有没有现成的好方案。**
|
|
83
50
|
|
|
84
|
-
|
|
51
|
+
### 0.1 素材收集与初步分析
|
|
52
|
+
|
|
53
|
+
收集用户提供的所有素材,快速判断任务类型:
|
|
85
54
|
|
|
86
55
|
```
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
56
|
+
用户输入 → 有源视频?
|
|
57
|
+
├─ 有视频 + 有产品图 → 视频复刻
|
|
58
|
+
├─ 有视频 + 无产品图 → 追问:要替换什么产品?
|
|
59
|
+
├─ 无视频 + 有图片 → 纯视频生成
|
|
60
|
+
└─ 只有文字描述 → 纯视频生成(需要更多信息)
|
|
91
61
|
```
|
|
92
62
|
|
|
93
|
-
|
|
63
|
+
**仅做轻量元数据识别,不执行工具调用**:
|
|
64
|
+
- 识别 URL 平台(TikTok/抖音/Instagram/小红书/本地文件)并告知用户将使用哪种解析方式
|
|
65
|
+
- 如果用户已提供本地视频文件路径,可以读取文件大小/类型(不抽帧)
|
|
66
|
+
- 基于 URL/文件名/用户描述推断大致内容和复杂度
|
|
94
67
|
|
|
95
|
-
|
|
68
|
+
**不要在此步骤**:下载视频、调用 ffprobe/ffmpeg、抽帧、创建项目目录。这些操作属于 Phase 1,必须在技术方案确认后才能执行。
|
|
96
69
|
|
|
97
|
-
|
|
70
|
+
**例外**:如果用户明确提供了元数据("这是 15 秒的手持 vlog,单场景"),直接用,不需要自己验证。
|
|
98
71
|
|
|
99
|
-
###
|
|
72
|
+
### 0.2 关键问题(按需提问,不要一次全问)
|
|
100
73
|
|
|
101
|
-
|
|
102
|
-
"帮我复刻这个视频" + 新产品图 → ls gen-output/video-clone/ → 新建 {project}/ 目录
|
|
103
|
-
"帮我做另一个视频" + 新素材 → 新建 {project}/ 目录
|
|
104
|
-
"换个首帧试试" / "prompt 改一下" → 继续当前 {project}/ 目录,v{N}+1
|
|
105
|
-
"上次那个电子秤视频再改改" → 进入已有 fishing-scale/ 目录,读 log.md 续接
|
|
106
|
-
```
|
|
74
|
+
根据已有信息,挑最关键的 1-2 个问题问:
|
|
107
75
|
|
|
108
|
-
|
|
76
|
+
| 需要了解的 | 什么时候问 | 示例 |
|
|
77
|
+
|---|---|---|
|
|
78
|
+
| 产品是什么 | 用户没提供产品图 | "你要在视频里展示什么产品?有产品图吗?" |
|
|
79
|
+
| 替换目标 | 源视频里有多个物品 | "视频里有手机和平板,你要替换哪个?" |
|
|
80
|
+
| 视频用途 | 影响风格和质量选择 | "这个视频是发抖音/TikTok/电商详情页?" |
|
|
81
|
+
| 音频需求 | 影响工具选择和成本 | "需要保留人声/口型同步吗?(有音频用 Kling ~$1,无音频 ~$0.02)" |
|
|
82
|
+
| 时长期望 | 源视频很长或用户没说 | "源视频 30s,要复刻全部还是选一段?" |
|
|
83
|
+
| 风格偏好 | 纯生成时 | "想要什么感觉?真实纪录片风?还是广告感?" |
|
|
109
84
|
|
|
110
|
-
|
|
85
|
+
**不要问用户已经给出答案的问题。**
|
|
86
|
+
|
|
87
|
+
### 0.3 匹配 Workflow
|
|
88
|
+
|
|
89
|
+
理解需求后,读取 `gen-output/video-clone/workflows/README.md` 查找匹配的 workflow。
|
|
111
90
|
|
|
112
91
|
```
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
│ ├── source_t15.0s.jpg ← 选中的源帧
|
|
119
|
-
│ ├── frame_v1_s42.png ← 首帧编辑 v1(seed=42)
|
|
120
|
-
│ ├── frame_v2_s43.png ← 首帧编辑 v2(seed=43)
|
|
121
|
-
│ ├── scene1_frame_v1_s42.png ← [多片段] 场景1首帧
|
|
122
|
-
│ └── grid.jpg ← 帧网格
|
|
123
|
-
├── videos/ ← 视频产物(版本化)
|
|
124
|
-
│ ├── video_v1_10s.mp4 ← 视频 v1
|
|
125
|
-
│ ├── video_v2_10s.mp4 ← 视频 v2(改了prompt)
|
|
126
|
-
│ ├── scene1_v1_5s.mp4 ← [多片段] 场景1视频
|
|
127
|
-
│ └── final_v2.mp4 ← 最终交付版本
|
|
128
|
-
├── prompt.md ← 当前 prompt(用户可直接编辑)
|
|
129
|
-
└── log.md ← 迭代日志(版本历史 + 用户反馈)
|
|
92
|
+
读取 workflows/README.md
|
|
93
|
+
→ 找到匹配的 workflow?
|
|
94
|
+
├─ 有 → 读取该 workflow 文件,复用其策略(prompt 风格、首帧技巧、参数配置)
|
|
95
|
+
├─ 部分匹配 → 基于已有 workflow 调整,执行后保存为新 workflow
|
|
96
|
+
└─ 无 → 走通用 pipeline,效果好则保存为新 workflow
|
|
130
97
|
```
|
|
131
98
|
|
|
132
|
-
|
|
99
|
+
**Workflow 是经验的积累。** 每个 workflow 记录了在特定场景下"什么方法效果最好"——包括 prompt 写法、首帧编辑策略、工具选择、踩过的坑。随着使用次数增加,workflow 库会越来越强。
|
|
133
100
|
|
|
134
|
-
-
|
|
135
|
-
- 视频:`video_v{N}_{duration}s.mp4`,多片段 `scene{M}_v{N}_{duration}s.mp4`
|
|
136
|
-
- 最终:`final_v{N}.mp4`(指向最终采用的版本)
|
|
137
|
-
- **v{N} 递增,绝不覆盖**
|
|
101
|
+
详见 [workflow-system.md](references/workflow-system.md)
|
|
138
102
|
|
|
139
|
-
###
|
|
103
|
+
### 0.4 技术方案(必须展示给用户)
|
|
140
104
|
|
|
141
|
-
|
|
105
|
+
基于分析结果 + workflow 匹配,输出技术方案:
|
|
142
106
|
|
|
143
107
|
```markdown
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
### 视觉风格
|
|
147
|
-
竖屏手持vlog,自然饱和色彩,明亮日光,无滤镜,纪实感。
|
|
108
|
+
## 技术方案
|
|
148
109
|
|
|
149
|
-
|
|
150
|
-
|
|
110
|
+
**任务**: [视频复刻 / 纯视频生成]
|
|
111
|
+
**源视频**: [时长]s, [分辨率], [单/多片段(N段)]
|
|
112
|
+
**产品**: [产品名称+关键特征]
|
|
113
|
+
**参考 Workflow**: [workflow 名称] / 无(新场景)
|
|
151
114
|
|
|
152
|
-
|
|
153
|
-
|
|
115
|
+
**执行计划**:
|
|
116
|
+
1. 首帧编辑 — gen image [单图/双图] 替换 [目标物品] 为 [新产品]
|
|
117
|
+
2. 视频生成 — [Kling 3.0(有音频) / gen video(无音频)], [时长]s
|
|
118
|
+
3. 后处理 — [直出 / N段拼接]
|
|
154
119
|
|
|
155
|
-
|
|
156
|
-
|
|
120
|
+
**预估成本**: ~$[X.XX]
|
|
121
|
+
**预估耗时**: ~[N]分钟
|
|
157
122
|
|
|
158
|
-
|
|
159
|
-
...
|
|
160
|
-
|
|
161
|
-
### 背景声音
|
|
162
|
-
...
|
|
123
|
+
确认后开始?需要调整什么?
|
|
163
124
|
```
|
|
164
125
|
|
|
165
|
-
|
|
166
|
-
1. Claude 分析 → 写入 prompt.md → 打印给用户
|
|
167
|
-
2. 用户说"OK" → 直接用;用户说"改一下动作" → 用户自行编辑 prompt.md 或告诉 Claude 改
|
|
168
|
-
3. Phase 3 从 prompt.md 读取生成视频
|
|
169
|
-
4. 需要重跑时:修改 prompt.md → 旧版本自动记录到 log.md
|
|
170
|
-
|
|
171
|
-
### 迭代日志(log.md)
|
|
126
|
+
如果匹配到 workflow,技术方案中说明"基于 [workflow名] 的经验,这类视频建议 [具体策略]"。
|
|
172
127
|
|
|
173
|
-
|
|
128
|
+
### Anti-Pattern: 跳过 Phase 0
|
|
174
129
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
## v2 — 2026-04-10 15:10
|
|
186
|
-
- **首帧**: 复用 v1(frame_v1_s42.png)
|
|
187
|
-
- **Prompt 修改**: 动作清单删除"举起电子秤",改为"手指轻触电子秤"
|
|
188
|
-
- **视频**: video_v2_10s.mp4
|
|
189
|
-
- **结果**: ✅ 用户满意 → final_v2.mp4
|
|
190
|
-
```
|
|
130
|
+
| 你在想... | 应该做的 |
|
|
131
|
+
|---|---|
|
|
132
|
+
| 用户给了视频和产品图,直接开干 | **先出技术方案**,用户可能对时长/音频/风格有想法 |
|
|
133
|
+
| 用户说"急用/立刻开始",我应该加速 | **紧迫感不是跳过 GATE 的理由**,方案对齐反而避免返工 |
|
|
134
|
+
| 用户说"不要问问题,自己判断",所以不用确认 | **"不问问题" ≠ "不确认方案"**,自己判断后仍要出方案等确认 |
|
|
135
|
+
| 下载视频/抽帧只是"前期分析"不算执行 | **所有工具调用都被 GATE 阻断**,分析必须基于用户提供的元数据 |
|
|
136
|
+
| 问用户一堆技术问题 | 只问不清楚的,已知信息自己分析 |
|
|
137
|
+
| 不看 workflows 直接走通用流程 | **先查 workflow 库**,可能有更好的方案 |
|
|
138
|
+
| 用户说"复刻这个",假设我全懂了 | 至少确认:替换什么?要不要音频? |
|
|
191
139
|
|
|
192
|
-
|
|
193
|
-
- 首帧没变就写"复用 vX",变了就写新文件名
|
|
194
|
-
- Prompt 修改只记差异摘要(完整内容始终在 prompt.md)
|
|
195
|
-
- 结果必须记录用户反馈(满意/不满意+原因)
|
|
196
|
-
- 跨会话续接时,先读 log.md 获取上次版本号,再读 prompt.md 获取当前 prompt
|
|
140
|
+
**[USER GATE] 用户确认技术方案后,进入 Phase 1。**
|
|
197
141
|
|
|
198
142
|
---
|
|
199
143
|
|
|
200
|
-
## Pipeline
|
|
144
|
+
## Phase 1-4: 执行 Pipeline
|
|
201
145
|
|
|
202
|
-
|
|
203
|
-
单片段:源视频 → 分析 → gen image 首帧编辑 → I2V → 后处理 → 成品
|
|
204
|
-
多片段:源视频 → 场景拆分 → 每段 gen image 首帧 → 每段 I2V → 拼接 → 成品
|
|
205
|
-
纯生成:图片 → prompt → gen video(无音频) 或 Kling(有音频) → 成品
|
|
206
|
-
```
|
|
146
|
+
技术方案确认后,按 Checklist 顺序执行。如果匹配到 workflow,优先按 workflow 的策略执行。
|
|
207
147
|
|
|
208
|
-
|
|
148
|
+
### 视频复刻 Checklist
|
|
209
149
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
| **Kling 3.0**(PiAPI) | I2V(需要音频时,口型同步)|
|
|
216
|
-
| **ffmpeg** | 抽帧、场景拆分、后处理、拼接 |
|
|
150
|
+
**Phase 1 — Prompt 生成**
|
|
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
|
|
217
155
|
|
|
218
|
-
|
|
156
|
+
**Phase 2 — 首帧编辑**
|
|
219
157
|
|
|
220
|
-
|
|
158
|
+
5. **首帧编辑** — gen image 产品替换 → 版本化保存到 `frames/`
|
|
159
|
+
6. **[USER GATE] 首帧质检** — 展示给用户,确认产品清晰/位置自然/人物保持/背景一致。未获确认前禁止进入 Phase 3
|
|
221
160
|
|
|
222
|
-
|
|
161
|
+
**Phase 3 — 视频生成**
|
|
223
162
|
|
|
224
|
-
|
|
225
|
-
ffprobe -v quiet -print_format json -show_format -show_streams source_video.mp4
|
|
226
|
-
ffmpeg -i source_video.mp4 -vf "select='gt(scene,0.3)',showinfo" -vsync vfr -f null -
|
|
227
|
-
```
|
|
163
|
+
7. **视频生成** — 对用户只显示 "视频生成中..."。详见 [kling-api.md](references/kling-api.md)
|
|
228
164
|
|
|
229
|
-
|
|
165
|
+
**Phase 4 — 后处理与交付**
|
|
230
166
|
|
|
231
|
-
|
|
167
|
+
8. **后处理** — ffmpeg 标准化/拼接 → `final_v{N}.mp4`。详见 [ffmpeg-commands.md](references/ffmpeg-commands.md)
|
|
168
|
+
9. **更新日志** — 结果写入 `log.md`,交付
|
|
232
169
|
|
|
233
|
-
|
|
234
|
-
**多片段**:每段 3-10 帧 → 每段网格 + 总网格。标注时间戳。
|
|
170
|
+
### 纯视频生成 Checklist
|
|
235
171
|
|
|
236
|
-
|
|
172
|
+
**Phase 1 — Prompt 生成**
|
|
173
|
+
1. **创建项目目录** — 保存素材到 `source/`
|
|
174
|
+
2. **生成 prompt** — 根据技术方案编写 → 写入 `prompt.md` → **打印给用户**
|
|
175
|
+
3. **[USER GATE] prompt 确认** — 未获确认前禁止进入 Phase 3
|
|
237
176
|
|
|
238
|
-
|
|
177
|
+
**Phase 3 — 视频生成**(无首帧编辑,跳过 Phase 2)
|
|
239
178
|
|
|
240
|
-
|
|
241
|
-
- 精确描述产品外观(颜色/形状/特征,从产品图提取)
|
|
242
|
-
- 精确描述背景和光线(从源帧提取)
|
|
179
|
+
4. **视频生成** — 不需要音频用 gen video,需要音频用 Kling 3.0
|
|
243
180
|
|
|
244
|
-
|
|
181
|
+
**Phase 4 — 交付**
|
|
245
182
|
|
|
246
|
-
|
|
183
|
+
5. **更新 log.md** — 交付
|
|
247
184
|
|
|
248
|
-
|
|
185
|
+
## Phase 5: 经验沉淀
|
|
249
186
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
## Phase 2: 首帧编辑
|
|
253
|
-
|
|
254
|
-
### 单片段:gen image 双图编辑
|
|
187
|
+
任务完成且用户满意后,判断是否值得保存为 workflow:
|
|
255
188
|
|
|
256
|
-
```bash
|
|
257
|
-
gen image "Keep this exact same scene, same [人物特征], same [场景]. \
|
|
258
|
-
Replace ONLY the [原物品] with [新产品] from the reference image. \
|
|
259
|
-
[产品颜色+形状+特征]. Photorealistic, natural." \
|
|
260
|
-
-i source_frame.jpg -i product.jpg \
|
|
261
|
-
-W 576 -H 1024 -s 42 \
|
|
262
|
-
-o gen-output/video-clone/{project}/frames/frame_v1_s42.png
|
|
263
|
-
Read gen-output/video-clone/{project}/frames/frame_v1_s42.png
|
|
264
|
-
# 不满意 → 换 seed: frame_v2_s43.png,绝不覆盖 v1
|
|
265
189
|
```
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
```bash
|
|
272
|
-
gen image "[人物描述] [动作] [产品描述: the red MaxWorks creeper from \
|
|
273
|
-
the reference image - 颜色/logo/特征] [场景] Vertical 9:16. Photorealistic." \
|
|
274
|
-
-i product.jpg \
|
|
275
|
-
-W 576 -H 1024 -s 42 \
|
|
276
|
-
-o gen-output/video-clone/{project}/frames/scene1_frame_v1_s42.png
|
|
277
|
-
Read gen-output/video-clone/{project}/frames/scene1_frame_v1_s42.png
|
|
190
|
+
用户满意?
|
|
191
|
+
├─ 满意 + 新场景(无匹配 workflow) → 保存为新 workflow
|
|
192
|
+
├─ 满意 + 基于已有 workflow 调整 → 更新已有 workflow 或另存变体
|
|
193
|
+
└─ 不满意 / 已有 workflow 完全复用 → 不操作
|
|
278
194
|
```
|
|
279
195
|
|
|
280
|
-
|
|
196
|
+
保存时:在 `workflows/` 创建 `.md` 文件,更新 `README.md` 索引。
|
|
197
|
+
详见 [workflow-system.md](references/workflow-system.md)
|
|
281
198
|
|
|
282
|
-
|
|
199
|
+
## Process Flow
|
|
283
200
|
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
201
|
+
```dot
|
|
202
|
+
digraph video_clone {
|
|
203
|
+
rankdir=TB;
|
|
204
|
+
node [shape=box];
|
|
288
205
|
|
|
289
|
-
|
|
206
|
+
"用户确认方案?" [shape=diamond];
|
|
207
|
+
"用户确认 prompt?" [shape=diamond];
|
|
208
|
+
"用户确认首帧?" [shape=diamond];
|
|
290
209
|
|
|
291
|
-
|
|
210
|
+
"素材收集 + 初步分析" -> "关键问题(按需)";
|
|
211
|
+
"关键问题(按需)" -> "查 workflows/README.md";
|
|
212
|
+
"查 workflows/README.md" -> "输出技术方案\n(含 workflow 推荐)";
|
|
213
|
+
"输出技术方案\n(含 workflow 推荐)" -> "用户确认方案?";
|
|
292
214
|
|
|
293
|
-
|
|
215
|
+
"用户确认方案?" -> "输出技术方案\n(含 workflow 推荐)" [label="调整"];
|
|
216
|
+
"用户确认方案?" -> "抽帧分析 + 生成 prompt" [label="确认"];
|
|
294
217
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
| 纯生成 + 需要音频 | Kling 3.0 API | 有 |
|
|
299
|
-
| 纯生成 + 不需要音频 | gen video | 无 |
|
|
218
|
+
"抽帧分析 + 生成 prompt" -> "用户确认 prompt?";
|
|
219
|
+
"用户确认 prompt?" -> "抽帧分析 + 生成 prompt" [label="修改"];
|
|
220
|
+
"用户确认 prompt?" -> "gen image 首帧编辑" [label="确认"];
|
|
300
221
|
|
|
301
|
-
|
|
222
|
+
"gen image 首帧编辑" -> "用户确认首帧?";
|
|
223
|
+
"用户确认首帧?" -> "gen image 首帧编辑" [label="换seed/调prompt"];
|
|
224
|
+
"用户确认首帧?" -> "视频生成 → 后处理 → 交付" [label="满意"];
|
|
302
225
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
--prompt "motion description..." \
|
|
306
|
-
-d 10 -r 1080P --no-audio \
|
|
307
|
-
-o gen-output/video-clone/{project}/videos/video_v1_10s.mp4
|
|
308
|
-
Read gen-output/video-clone/{project}/videos/video_v1_10s.mp4
|
|
309
|
-
# 重跑 → video_v2_10s.mp4,绝不覆盖
|
|
226
|
+
"视频生成 → 后处理 → 交付" -> "经验沉淀\n(保存/更新 workflow)";
|
|
227
|
+
}
|
|
310
228
|
```
|
|
311
229
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
**Step 1: 上传首帧获取公开 URL**(Kling 不接受 base64,需要 URL)
|
|
315
|
-
|
|
316
|
-
```python
|
|
317
|
-
import requests, base64
|
|
318
|
-
|
|
319
|
-
img_b64 = base64.b64encode(open('edited_frame.png', 'rb').read()).decode()
|
|
320
|
-
resp = requests.post('https://freeimage.host/api/1/upload', data={
|
|
321
|
-
'key': '6d207e02198a847aa98d0a2a901485a5',
|
|
322
|
-
'action': 'upload',
|
|
323
|
-
'source': img_b64,
|
|
324
|
-
'format': 'json',
|
|
325
|
-
})
|
|
326
|
-
img_url = resp.json()['image']['url']
|
|
327
|
-
# ⚠️ catbox.moe 不可用(PiAPI 服务器访问不了)
|
|
328
|
-
```
|
|
329
|
-
|
|
330
|
-
**Step 2: 提交生成任务**
|
|
331
|
-
|
|
332
|
-
```python
|
|
333
|
-
resp = requests.post('https://api.piapi.ai/api/v1/task',
|
|
334
|
-
headers={'x-api-key': PIAPI_KEY, 'Content-Type': 'application/json'},
|
|
335
|
-
json={
|
|
336
|
-
'model': 'kling',
|
|
337
|
-
'task_type': 'video_generation',
|
|
338
|
-
'input': {
|
|
339
|
-
'prompt': motion_prompt,
|
|
340
|
-
'negative_prompt': 'slow motion, dreamy, ethereal, cinematic, blurry, '
|
|
341
|
-
'distorted, deformed hands, extra fingers',
|
|
342
|
-
'image_url': img_url,
|
|
343
|
-
'duration': 10, # 或 5(多片段时)
|
|
344
|
-
'aspect_ratio': '9:16',
|
|
345
|
-
'mode': 'std', # 720p
|
|
346
|
-
'version': '3.0',
|
|
347
|
-
'cfg_scale': 0.5, # ⚠️ 必须 float!
|
|
348
|
-
'enable_audio': True,
|
|
349
|
-
},
|
|
350
|
-
'config': {'service_mode': 'public'},
|
|
351
|
-
}, timeout=60)
|
|
352
|
-
task_id = resp.json()['data']['task_id']
|
|
353
|
-
```
|
|
230
|
+
## 铁律
|
|
354
231
|
|
|
355
|
-
**Step 3: 轮询等待完成**
|
|
356
|
-
|
|
357
|
-
```python
|
|
358
|
-
import time
|
|
359
|
-
while True:
|
|
360
|
-
r = requests.get(f'https://api.piapi.ai/api/v1/task/{task_id}',
|
|
361
|
-
headers={'x-api-key': PIAPI_KEY})
|
|
362
|
-
d = r.json().get('data', {})
|
|
363
|
-
status = d.get('status', '')
|
|
364
|
-
if status == 'completed': # ⚠️ 小写!
|
|
365
|
-
video_url = d['output']['video'] # ⚠️ 3.0 用 video,2.6 用 video_url
|
|
366
|
-
break
|
|
367
|
-
if status == 'failed':
|
|
368
|
-
raise RuntimeError(d.get('error', {}))
|
|
369
|
-
time.sleep(15)
|
|
370
232
|
```
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
data = requests.get(video_url, timeout=300).content
|
|
378
|
-
open('gen-output/video-clone/{project}/videos/video_v1_10s.mp4', 'wb').write(data)
|
|
379
|
-
break
|
|
380
|
-
# 重跑 → video_v2_10s.mp4,绝不覆盖
|
|
381
|
-
except Exception:
|
|
382
|
-
time.sleep(5)
|
|
233
|
+
1. 先理解再动手 — 技术方案未确认前不执行任何生成操作
|
|
234
|
+
2. 先查 workflow 再造轮子 — 已有经验不要浪费
|
|
235
|
+
3. 首帧质量决定一切 — 自动选产品最清晰+手部最自然的帧
|
|
236
|
+
4. 让模型做简单的事 — 产品保持静止,人做简单动作
|
|
237
|
+
5. Prompt 质量 = 视频质量 — 必须打印给用户,用户可能修改
|
|
238
|
+
6. 永远不覆盖文件 — 所有产物 v{N} 递增,保留完整迭代历史
|
|
383
239
|
```
|
|
384
240
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
**复刻时**:Claude Opus 分析源帧后生成。**纯生成时**:Claude 根据用户描述编写。
|
|
388
|
-
两种都写入 `prompt.md` 并打印给用户,用户可直接编辑文件。Phase 3 从 `prompt.md` 读取。
|
|
241
|
+
## 项目目录
|
|
389
242
|
|
|
390
243
|
```
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
- [时间顺序,精确到哪只手]
|
|
402
|
-
- [产品交互,避免复杂手部操作]
|
|
403
|
-
|
|
404
|
-
### 对话
|
|
405
|
-
- [语言和风格]
|
|
406
|
-
|
|
407
|
-
### 背景声音
|
|
408
|
-
- [环境音 + 人声 + 无背景音乐]
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
**Anti-AI**(摄影技术段融入):手持拍摄/轻微晃动/自然光/无滤镜/纪实感
|
|
412
|
-
**禁用词**:梦幻/空灵/电影感/慢动作/丝滑/优雅
|
|
413
|
-
|
|
414
|
-
---
|
|
415
|
-
|
|
416
|
-
## Phase 4: 后处理
|
|
417
|
-
|
|
418
|
-
### 单片段
|
|
419
|
-
|
|
420
|
-
```bash
|
|
421
|
-
# video_v{N} → final_v{N}
|
|
422
|
-
ffmpeg -y -i gen-output/video-clone/{project}/videos/video_v1_10s.mp4 \
|
|
423
|
-
-r 30 -c:v libx264 -crf 18 -c:a aac -b:a 192k \
|
|
424
|
-
gen-output/video-clone/{project}/videos/final_v1.mp4
|
|
244
|
+
gen-output/video-clone/
|
|
245
|
+
├── workflows/ ← Workflow 经验库
|
|
246
|
+
│ ├── README.md ← 索引:每个 workflow 一行摘要
|
|
247
|
+
│ └── {workflow-name}.md ← 具体 workflow
|
|
248
|
+
├── {project}/ ← 项目产物
|
|
249
|
+
│ ├── source/
|
|
250
|
+
│ ├── frames/
|
|
251
|
+
│ ├── videos/
|
|
252
|
+
│ ├── prompt.md
|
|
253
|
+
│ └── log.md
|
|
425
254
|
```
|
|
426
255
|
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
```bash
|
|
430
|
-
# 标准化每个 clip
|
|
431
|
-
ffmpeg -y -i gen-output/video-clone/{project}/videos/scene1_v1_5s.mp4 \
|
|
432
|
-
-vf scale=720:1280 -r 30 -c:v libx264 -crf 18 -c:a aac -b:a 128k scene1_norm.mp4
|
|
256
|
+
**新任务 vs 续接**:有新源视频/新产品 → 新目录;改 prompt/换 seed → 同目录 v{N}+1。
|
|
257
|
+
跨会话续接时:先读 `log.md` 获取版本号,再读 `prompt.md` 获取当前 prompt。
|
|
433
258
|
|
|
434
|
-
|
|
435
|
-
echo "file 'scene1_norm.mp4'
|
|
436
|
-
file 'scene2_norm.mp4'" > concat_list.txt
|
|
437
|
-
ffmpeg -y -f concat -safe 0 -i concat_list.txt -c:v libx264 -crf 18 -c:a aac -b:a 192k \
|
|
438
|
-
gen-output/video-clone/{project}/videos/final_v1.mp4
|
|
439
|
-
```
|
|
259
|
+
## 工具分工
|
|
440
260
|
|
|
441
|
-
|
|
261
|
+
| 工具 | 职责 |
|
|
262
|
+
|------|------|
|
|
263
|
+
| **Claude Opus** | 需求理解 + 逐帧分析 → 中文 6 段 prompt |
|
|
264
|
+
| **gen image** | 首帧编辑(`-i 源帧 -i 产品图`)|
|
|
265
|
+
| **gen video** | Wan 2.6 I2V(不需要音频) |
|
|
266
|
+
| **Kling 3.0 API** | I2V(需要音频/口型同步)。详见 [kling-api.md](references/kling-api.md) |
|
|
267
|
+
| **ffmpeg** | 抽帧、场景检测、后处理。详见 [ffmpeg-commands.md](references/ffmpeg-commands.md) |
|
|
442
268
|
|
|
443
|
-
|
|
269
|
+
## 首帧编辑策略
|
|
444
270
|
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
□ [多片段] 过渡自然?产品跨段一致?
|
|
448
|
-
不合格 → 调 prompt / 换 seed 重跑(可只重跑问题片段)
|
|
449
|
-
```
|
|
271
|
+
**单片段**:gen image 双图(`-i 源帧 -i 产品图`),保持场景只替换产品。
|
|
272
|
+
**多片段**:每段仅 `-i 产品图`,prompt 描述完整场景,产品描述跨段重复。
|
|
450
273
|
|
|
451
|
-
|
|
274
|
+
## Anti-Pattern
|
|
452
275
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
| ❌ 你在想... | ✅ 应该做的 |
|
|
276
|
+
| 你在想... | 应该做的 |
|
|
456
277
|
|---|---|
|
|
278
|
+
| 用户给了素材直接开干 | **Phase 0 技术方案确认后才动手** |
|
|
279
|
+
| 不看 workflow 库直接走通用 | **先查 README.md**,可能有验证过的方案 |
|
|
457
280
|
| 直接取 t=1s 当首帧 | 自动选产品最清晰的帧 |
|
|
458
|
-
| prompt
|
|
459
|
-
|
|
|
281
|
+
| prompt 不给用户看 | **必须打印,用户可能修改** |
|
|
282
|
+
| 首帧没确认就生成视频 | **HARD-GATE:必须等用户确认** |
|
|
460
283
|
| 告诉用户模型名称 | 只说 "视频生成中..." |
|
|
461
|
-
|
|
|
462
|
-
|
|
|
463
|
-
| 描述复杂手部操作 | 产品静止,人做简单动作 |
|
|
464
|
-
| prompt 超 2500 字符 | 精简到 1200-2000 |
|
|
465
|
-
| 用 catbox.moe 托管图片 | 用 freeimage.host |
|
|
466
|
-
| 本地直接调 API | 通过服务器中转 |
|
|
467
|
-
| 覆盖之前生成的文件 | v{N} 递增命名,保留全部历史 |
|
|
468
|
-
| 不写 log.md | 每次操作必须追加日志 |
|
|
469
|
-
|
|
470
|
-
---
|
|
284
|
+
| 做出好效果不保存 workflow | **效果好 + 新场景 = 必须沉淀** |
|
|
285
|
+
| 覆盖之前生成的文件 | v{N} 递增,保留全部历史 |
|
|
471
286
|
|
|
472
287
|
## 已知限制
|
|
473
288
|
|
|
474
|
-
-
|
|
475
|
-
-
|
|
476
|
-
-
|
|
477
|
-
|
|
478
|
-
## 实战参考
|
|
479
|
-
|
|
480
|
-
**demo1 沙滩电子秤**:t=1s 无产品→失败,改 t=15s→完美。首帧选择 + prompt 质量 >> 一切。
|
|
481
|
-
|
|
482
|
-
**demo2 汽车躺板-单片段**:PiAPI FLUX 单图+一句话=⭐⭐,BFL FLUX-PRO 双图+6段 prompt=⭐⭐⭐⭐⭐。
|
|
483
|
-
|
|
484
|
-
**demo3 汽车躺板-多片段**:18s 源视频 4 场景 → 拆分 → 每段 gen image + Kling 5s → 拼接 20s。关键:产品描述跨段一致。
|
|
485
|
-
|
|
486
|
-
## 重要提醒
|
|
487
|
-
|
|
488
|
-
1. **BFL 轮询 "Task not found"** 持续约 60s,正常,继续轮询
|
|
489
|
-
2. **Kling enable_audio 只有 3.0 支持**
|
|
490
|
-
3. **Kling 状态小写 "completed"**,输出字段 `output.video`(3.0)
|
|
491
|
-
4. **国内网络通过服务器中转** API,本地大 payload 会断连
|
|
492
|
-
5. **freeimage.host key**: `6d207e02198a847aa98d0a2a901485a5`
|
|
289
|
+
- 单段最长 10s,多段需拼接
|
|
290
|
+
- 动作模型自编,不还原源视频动作序列
|
|
291
|
+
- PiAPI CDN 不稳定,需 3 次重试
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# FFmpeg 命令参考
|
|
2
|
+
|
|
3
|
+
## 场景检测
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
ffprobe -v quiet -print_format json -show_format -show_streams source_video.mp4
|
|
7
|
+
ffmpeg -i source_video.mp4 -vf "select='gt(scene,0.3)',showinfo" -vsync vfr -f null -
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
切换点 <=1 → 单片段 | >=2 → 多片段(过滤 <0.5s 片段)
|
|
11
|
+
|
|
12
|
+
## 抽帧
|
|
13
|
+
|
|
14
|
+
**单片段**:等间距抽 10 帧 → 5x2 网格。
|
|
15
|
+
**多片段**:每段 3-10 帧 → 每段网格 + 总网格,标注时间戳。
|
|
16
|
+
|
|
17
|
+
## 单片段后处理
|
|
18
|
+
|
|
19
|
+
```bash
|
|
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
|
+
```
|
|
24
|
+
|
|
25
|
+
## 多片段后处理
|
|
26
|
+
|
|
27
|
+
```bash
|
|
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
|
+
```
|
|
41
|
+
|
|
42
|
+
## 重要
|
|
43
|
+
|
|
44
|
+
- Kling 音频口型同步,**不要用源视频音频替换**
|
|
45
|
+
- 多片段拼接前必须统一分辨率和帧率
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Kling 3.0 API 实现(PiAPI)
|
|
2
|
+
|
|
3
|
+
需要音频/口型同步时使用 Kling 3.0,否则用 gen video。
|
|
4
|
+
|
|
5
|
+
## Step 1: 上传首帧获取公开 URL
|
|
6
|
+
|
|
7
|
+
Kling 不接受 base64,需要公开 URL。**用 freeimage.host,不要用 catbox.moe**(PiAPI 服务器访问不了)。
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
import requests, base64
|
|
11
|
+
|
|
12
|
+
frame_path = 'gen-output/video-clone/{project}/frames/frame_v1_s42.png'
|
|
13
|
+
img_b64 = base64.b64encode(open(frame_path, 'rb').read()).decode()
|
|
14
|
+
resp = requests.post('https://freeimage.host/api/1/upload', data={
|
|
15
|
+
'key': '6d207e02198a847aa98d0a2a901485a5',
|
|
16
|
+
'action': 'upload',
|
|
17
|
+
'source': img_b64,
|
|
18
|
+
'format': 'json',
|
|
19
|
+
})
|
|
20
|
+
img_url = resp.json()['image']['url']
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Step 2: 提交生成任务
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
resp = requests.post('https://api.piapi.ai/api/v1/task',
|
|
27
|
+
headers={'x-api-key': PIAPI_KEY, 'Content-Type': 'application/json'},
|
|
28
|
+
json={
|
|
29
|
+
'model': 'kling',
|
|
30
|
+
'task_type': 'video_generation',
|
|
31
|
+
'input': {
|
|
32
|
+
'prompt': open('gen-output/video-clone/{project}/prompt.md').read(),
|
|
33
|
+
'negative_prompt': 'slow motion, dreamy, ethereal, cinematic, blurry, '
|
|
34
|
+
'distorted, deformed hands, extra fingers',
|
|
35
|
+
'image_url': img_url,
|
|
36
|
+
'duration': 10, # 多片段时用 5
|
|
37
|
+
'aspect_ratio': '9:16',
|
|
38
|
+
'mode': 'std', # 720p
|
|
39
|
+
'version': '3.0',
|
|
40
|
+
'cfg_scale': 0.5, # 必须 float!string → 500
|
|
41
|
+
'enable_audio': True,
|
|
42
|
+
},
|
|
43
|
+
'config': {'service_mode': 'public'},
|
|
44
|
+
}, timeout=60)
|
|
45
|
+
task_id = resp.json()['data']['task_id']
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Step 3: 轮询等待
|
|
49
|
+
|
|
50
|
+
```python
|
|
51
|
+
import time
|
|
52
|
+
while True:
|
|
53
|
+
r = requests.get(f'https://api.piapi.ai/api/v1/task/{task_id}',
|
|
54
|
+
headers={'x-api-key': PIAPI_KEY})
|
|
55
|
+
d = r.json().get('data', {})
|
|
56
|
+
status = d.get('status', '')
|
|
57
|
+
if status == 'completed': # 小写!
|
|
58
|
+
video_url = d['output']['video'] # 3.0 用 video,2.6 用 video_url
|
|
59
|
+
break
|
|
60
|
+
if status == 'failed':
|
|
61
|
+
raise RuntimeError(d.get('error', {}))
|
|
62
|
+
time.sleep(15)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Step 4: 下载视频(CDN 不稳定需重试)
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
output_path = 'gen-output/video-clone/{project}/videos/video_v1_10s.mp4'
|
|
69
|
+
for attempt in range(3):
|
|
70
|
+
try:
|
|
71
|
+
data = requests.get(video_url, timeout=300).content
|
|
72
|
+
open(output_path, 'wb').write(data)
|
|
73
|
+
break
|
|
74
|
+
except Exception:
|
|
75
|
+
time.sleep(5)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## 关键陷阱
|
|
79
|
+
|
|
80
|
+
- `cfg_scale` 必须 float,传 string 会变 500
|
|
81
|
+
- `enable_audio` 只有 3.0 支持
|
|
82
|
+
- 状态是小写 `"completed"`
|
|
83
|
+
- 输出字段:3.0 用 `output.video`,2.6 用 `output.video_url`
|
|
84
|
+
- freeimage.host key: `6d207e02198a847aa98d0a2a901485a5`
|
|
85
|
+
- 国内网络通过服务器中转 API,本地大 payload 会断连
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Motion Prompt 模板与规范
|
|
2
|
+
|
|
3
|
+
## 中文 6 段模板
|
|
4
|
+
|
|
5
|
+
复刻时由 Claude Opus 分析源帧生成,纯生成时根据用户描述编写。
|
|
6
|
+
写入 `prompt.md` 并打印给用户,Phase 3 从 `prompt.md` 读取。
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
### 视觉风格
|
|
10
|
+
[拍摄设备感 + 画面质感 + 色彩方案 + 光线 + 氛围]
|
|
11
|
+
|
|
12
|
+
### 场景叙述
|
|
13
|
+
[时间地点 + 人物外貌 + 产品描述(重复颜色/特征) + 背景环境]
|
|
14
|
+
|
|
15
|
+
### 摄影技术
|
|
16
|
+
[景别 + 运镜 + 焦段 + 景深 + 光线] 情绪:[...]
|
|
17
|
+
|
|
18
|
+
### 动作清单
|
|
19
|
+
- [时间顺序,精确到哪只手]
|
|
20
|
+
- [产品交互,避免复杂手部操作]
|
|
21
|
+
|
|
22
|
+
### 对话
|
|
23
|
+
- [语言和风格]
|
|
24
|
+
|
|
25
|
+
### 背景声音
|
|
26
|
+
- [环境音 + 人声 + 无背景音乐]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Anti-AI 风格(融入摄影技术段)
|
|
30
|
+
|
|
31
|
+
手持拍摄/轻微晃动/自然光/无滤镜/纪实感
|
|
32
|
+
|
|
33
|
+
## 禁用词
|
|
34
|
+
|
|
35
|
+
梦幻/空灵/电影感/慢动作/丝滑/优雅
|
|
36
|
+
|
|
37
|
+
## 长度控制
|
|
38
|
+
|
|
39
|
+
1200-2000 字符,超 2500 必须精简。
|
|
40
|
+
|
|
41
|
+
## prompt.md 工作流
|
|
42
|
+
|
|
43
|
+
1. Claude 分析 → 写入 prompt.md → 打印给用户
|
|
44
|
+
2. 用户说"OK" → 直接用;用户说"改一下" → 用户编辑或告诉 Claude 改
|
|
45
|
+
3. Phase 3 从 prompt.md 读取生成视频
|
|
46
|
+
4. 重跑时:修改 prompt.md → 旧版本记录到 log.md
|
|
47
|
+
|
|
48
|
+
## 示例
|
|
49
|
+
|
|
50
|
+
```markdown
|
|
51
|
+
# fishing-scale — Prompt
|
|
52
|
+
|
|
53
|
+
### 视觉风格
|
|
54
|
+
竖屏手持vlog,自然饱和色彩,明亮日光,无滤镜,纪实感。
|
|
55
|
+
|
|
56
|
+
### 场景叙述
|
|
57
|
+
阳光白天,戴眼镜、深蓝头巾、黑色运动上衣的女子跪坐沙滩...
|
|
58
|
+
|
|
59
|
+
### 摄影技术
|
|
60
|
+
中景,手持拍摄,轻微晃动,自然光,浅景深。情绪:轻松日常
|
|
61
|
+
|
|
62
|
+
### 动作清单
|
|
63
|
+
- 左手托住电子秤底部,右手食指轻触屏幕
|
|
64
|
+
- 产品保持静止,人物微笑看向镜头
|
|
65
|
+
|
|
66
|
+
### 对话
|
|
67
|
+
- 英语,日常对话风格
|
|
68
|
+
|
|
69
|
+
### 背景声音
|
|
70
|
+
- 海浪声、风声、远处人声,无背景音乐
|
|
71
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# URL 解析规则
|
|
2
|
+
|
|
3
|
+
**不要用 WebFetch**(反爬/登录墙),按平台处理:
|
|
4
|
+
|
|
5
|
+
| URL 特征 | 处理 |
|
|
6
|
+
|----------|------|
|
|
7
|
+
| TikTok `tiktok.com/@xxx/video/数字` | `scout tiktok video-detail <id>` → wget |
|
|
8
|
+
| TikTok 短链 `vm.tiktok.com/xxx` | `curl -sI` → Location → 提取 id |
|
|
9
|
+
| 抖音 `douyin.com/video/数字` | `scout douyin video-download <id>` → wget |
|
|
10
|
+
| 抖音短链 `v.douyin.com/xxx` | `scout douyin video-by-url "<url>"` |
|
|
11
|
+
| Instagram Reels | `scout instagram download-reel "<url>"` |
|
|
12
|
+
| 小红书视频 | `scout xhs note-detail <id>` → 视频链接 |
|
|
13
|
+
| 本地文件 | 直接使用 |
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Workflow 经验库系统
|
|
2
|
+
|
|
3
|
+
## 什么是 Workflow
|
|
4
|
+
|
|
5
|
+
Workflow 是一次成功视频制作的经验总结。它记录了在特定场景下"什么方法效果最好",让相似任务不用从零摸索。
|
|
6
|
+
|
|
7
|
+
## 目录结构
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
gen-output/video-clone/workflows/
|
|
11
|
+
├── README.md ← 索引,每个 workflow 一行
|
|
12
|
+
├── handheld-product-swap.md ← 手持vlog产品替换
|
|
13
|
+
├── multi-scene-product-demo.md ← 多场景产品展示
|
|
14
|
+
└── lifestyle-pure-gen.md ← 生活方式纯生成
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## README.md 格式
|
|
18
|
+
|
|
19
|
+
索引文件,快速定位。每行一个 workflow,格式:
|
|
20
|
+
|
|
21
|
+
```markdown
|
|
22
|
+
# Video Clone Workflows
|
|
23
|
+
|
|
24
|
+
| Workflow | 适用场景 | 效果 | 关键策略 |
|
|
25
|
+
|---|---|---|---|
|
|
26
|
+
| [handheld-product-swap](handheld-product-swap.md) | 手持vlog + 单物品替换 | ⭐⭐⭐⭐⭐ | 双图首帧, t=15s选帧, 简单手部动作 |
|
|
27
|
+
| [multi-scene-product-demo](multi-scene-product-demo.md) | 多场景产品展示(>2段) | ⭐⭐⭐⭐ | 每段独立首帧, 产品描述跨段一致 |
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Workflow 文件格式
|
|
31
|
+
|
|
32
|
+
每个 `.md` 文件包含:
|
|
33
|
+
|
|
34
|
+
```markdown
|
|
35
|
+
# {workflow-name}
|
|
36
|
+
|
|
37
|
+
## 适用场景
|
|
38
|
+
- 什么类型的视频适合用这个 workflow
|
|
39
|
+
- 关键特征(单/多段、有无人物、产品类型等)
|
|
40
|
+
|
|
41
|
+
## 策略
|
|
42
|
+
|
|
43
|
+
### 首帧
|
|
44
|
+
- 选帧策略(哪个时间点最好、为什么)
|
|
45
|
+
- gen image 参数(单图/双图、prompt 关键词)
|
|
46
|
+
- 踩坑记录(什么不 work)
|
|
47
|
+
|
|
48
|
+
### Prompt
|
|
49
|
+
- prompt 风格和重点(哪些段需要重点写)
|
|
50
|
+
- 验证有效的 prompt 片段(可直接复用)
|
|
51
|
+
- 禁用/低效的描述方式
|
|
52
|
+
|
|
53
|
+
### 视频生成
|
|
54
|
+
- 工具选择和参数
|
|
55
|
+
- cfg_scale / duration / mode 配置
|
|
56
|
+
|
|
57
|
+
### 后处理
|
|
58
|
+
- 特殊的 ffmpeg 参数
|
|
59
|
+
|
|
60
|
+
## 成功案例
|
|
61
|
+
- 项目名 + 简要结果(链接到项目目录)
|
|
62
|
+
|
|
63
|
+
## 踩坑记录
|
|
64
|
+
- 试过但失败的方法,避免重蹈覆辙
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 何时创建新 Workflow
|
|
68
|
+
|
|
69
|
+
满足以下全部条件:
|
|
70
|
+
|
|
71
|
+
1. **用户满意** — 最终视频被用户认可
|
|
72
|
+
2. **新场景** — 没有已有 workflow 完全覆盖
|
|
73
|
+
3. **有可复用的经验** — 不是纯靠运气,有明确的策略可提炼
|
|
74
|
+
|
|
75
|
+
## 何时更新已有 Workflow
|
|
76
|
+
|
|
77
|
+
- 同类任务发现了更好的参数/策略
|
|
78
|
+
- 踩了新坑,值得记录避免下次再踩
|
|
79
|
+
- 工具更新导致旧策略需要调整
|
|
80
|
+
|
|
81
|
+
## 匹配逻辑
|
|
82
|
+
|
|
83
|
+
Phase 0 读取 README.md 后,按以下维度匹配:
|
|
84
|
+
|
|
85
|
+
1. **视频类型**:手持vlog / 产品展示 / 口播 / 纯展示
|
|
86
|
+
2. **片段结构**:单片段 / 多片段
|
|
87
|
+
3. **产品交互**:手持 / 桌面摆放 / 穿戴 / 无人物
|
|
88
|
+
4. **音频需求**:有口型同步 / 纯BGM / 无音频
|
|
89
|
+
|
|
90
|
+
完全匹配 → 直接复用策略。
|
|
91
|
+
部分匹配 → 以最接近的 workflow 为基础调整。
|
|
92
|
+
无匹配 → 走通用 pipeline。
|