@optima-chat/gen-cli 1.0.9 → 1.2.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/gen/SKILL.md +345 -0
- package/.claude/skills/multigrid-poster/SKILL.md +194 -0
- package/.claude/skills/multigrid-poster/layouts/2x2.json +34 -0
- package/.claude/skills/multigrid-poster/layouts/3x3.json +43 -0
- package/.claude/skills/multigrid-poster/scripts/compose.py +116 -0
- package/.claude/skills/multigrid-poster/scripts/placeholder.png +0 -0
- package/.claude/skills/multigrid-poster/shared/fonts/MaShanZheng-Regular.ttf +0 -0
- package/.claude/skills/video-edit/SKILL.md +189 -0
- package/.claude/skills/video-gen/SKILL.md +718 -0
- package/.claude/skills/video-gen/templates/INDEX.md +78 -0
- package/.claude/skills/video-gen/templates/before-after-beauty.md +183 -0
- package/.claude/skills/video-gen/templates/drama-fmcg.md +183 -0
- package/.claude/skills/video-gen/templates/kol-reaction-food.md +193 -0
- package/.claude/skills/video-gen/templates/multi-point-apparel.md +185 -0
- package/.claude/skills/video-gen/templates/pain-solution-home.md +184 -0
- package/.claude/skills/video-gen/templates/pdp-360-showcase.md +189 -0
- package/.claude/skills/video-gen/templates/pdp-feature-highlight.md +182 -0
- package/.claude/skills/video-gen/templates/scene-digital.md +183 -0
- package/dist/commands/avatar.d.ts +9 -0
- package/dist/commands/avatar.d.ts.map +1 -0
- package/dist/commands/avatar.js +155 -0
- package/dist/commands/avatar.js.map +1 -0
- package/dist/commands/doctor.d.ts +9 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +293 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/video.d.ts.map +1 -1
- package/dist/commands/video.js +21 -25
- package/dist/commands/video.js.map +1 -1
- package/dist/commands/voice.d.ts +9 -0
- package/dist/commands/voice.d.ts.map +1 -0
- package/dist/commands/voice.js +123 -0
- package/dist/commands/voice.js.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/services/generation-api.d.ts +69 -4
- package/dist/services/generation-api.d.ts.map +1 -1
- package/dist/services/generation-api.js +114 -8
- package/dist/services/generation-api.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pdp-feature-highlight
|
|
3
|
+
type: pdp-feature
|
|
4
|
+
category: product-detail-page
|
|
5
|
+
duration_sweet_spot: 20-30s
|
|
6
|
+
design_principle: "每个字段对应一个可预见的失败模式;字段密度按镜头风险不对称"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Template: 功能亮点型(PDP / 详情页 · 数码家电)
|
|
10
|
+
|
|
11
|
+
> **第一性原理**:本模板每个字段对应一个具体的失败模式。
|
|
12
|
+
> **适合**:数码 / 家电 / 工具 / 办公设备 · 需要演示**多个功能点**的详情页视频
|
|
13
|
+
> **高风险镜头**:#1(产品整体)· #3/#5/#7(每个功能演示)· #9(规格叠加)
|
|
14
|
+
> **核心挑战**:每个功能点的演示**必须可兑现**(不能说的做不到)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# A · 项目卡
|
|
19
|
+
|
|
20
|
+
| 字段 | 填写 | 不填的后果 |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| `{product_name}` | | PRODUCT_LOCK 无锚点 |
|
|
23
|
+
| `{feature_count}`(通常 3-5 个)| | 镜头数量定不了 |
|
|
24
|
+
| `{feature_1}` / `{feature_2}` / `{feature_3}` | | 骨架空 |
|
|
25
|
+
| `{spec_sheet}`(关键参数)| | 末尾叠加不完整 |
|
|
26
|
+
| `{aspect_ratio}`(PDP 默认 1:1 或 16:9)| | 与社媒尺寸混淆 |
|
|
27
|
+
| `{technical_depth}`(小白向 / 专业向)| | 字幕用词错层 |
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
# B · 骨架(Product-Feature1-Feature2-Feature3-Spec)
|
|
32
|
+
|
|
33
|
+
| 段 | 时长 | 必须决定的事 |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| PRODUCT | 0-4s | 产品整体静止呈现 |
|
|
36
|
+
| FEATURE 1 | 4-10s | 功能 1 演示(命名 + 动作 + 效果)|
|
|
37
|
+
| FEATURE 2 | 10-16s | 功能 2 演示 |
|
|
38
|
+
| FEATURE 3 | 16-22s | 功能 3 演示(最强,放最后)|
|
|
39
|
+
| SPEC | 22-27s | 关键参数叠加 + 品牌 |
|
|
40
|
+
|
|
41
|
+
**PDP 功能型铁律**:每个功能**必须有"动作"** —— 光看图片不算功能演示。
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
# C · 镜头表(10 镜 · 27s · ASL ~2.7s)
|
|
46
|
+
|
|
47
|
+
| # | 时长 | 画面 | 字幕 | 运镜 | PRODUCT_LOCK | REF_IMG | NEGATIVE |
|
|
48
|
+
|---|---|---|---|---|---|---|---|
|
|
49
|
+
| **1** | **0-4s** | **`{product_hero}` 产品全景 + 轻转** | `{product_name}` | **静止 + 轻推** | **★ full** | **`refs/product.jpg`** | **no perspective glitch** |
|
|
50
|
+
| 2 | 4-5s | 全屏图标 "01" | 01 | — | — | — | — |
|
|
51
|
+
| **3** | **5-10s** | **`{feature_1_demo}`** 功能 1 操作 | `{feature_1_name}` | **CU + 特效标注** | **★ same** | **`refs/feature_1.jpg`** | **no UI garble, no fake reading** |
|
|
52
|
+
| 4 | 10-11s | 全屏图标 "02" | 02 | — | — | — | — |
|
|
53
|
+
| **5** | **11-16s** | **`{feature_2_demo}`** 功能 2 操作 | `{feature_2_name}` | **CU + 特效** | **★ same** | `refs/feature_2.jpg` | — |
|
|
54
|
+
| 6 | 16-17s | 全屏图标 "03" | 03 | — | — | — | — |
|
|
55
|
+
| **7** | **17-22s** | **`{feature_3_demo}`** 功能 3(最强)| `{feature_3_name}` | **CU + 慢镜** | **★ same** | `refs/feature_3.jpg` | **no spec fakery** |
|
|
56
|
+
| 8 | 22-23s | 全屏 "SPECS" 标题 | SPECS | — | — | — | — |
|
|
57
|
+
| **9** | **23-26s** | **`{spec_overlay}` 参数列表 + 产品底图** | `{spec_list}` | **静止 + 字幕动画** | **★ same** | **`refs/product.jpg`** | **no fake params, no wrong units** |
|
|
58
|
+
| 10 | 26-27s | 品牌 logo + 留白 | `{brand_line}` | 静止 | — | `refs/logo.jpg` | — |
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
# D · PRODUCT_LOCK 规范
|
|
63
|
+
|
|
64
|
+
```yaml
|
|
65
|
+
product_lock:
|
|
66
|
+
name: "{product_name}"
|
|
67
|
+
must_specify:
|
|
68
|
+
- physical_form: "{外观 + 尺寸}"
|
|
69
|
+
- color_finish: "{颜色 + 材质}"
|
|
70
|
+
- every_ui_element: "{屏幕 / 按钮 / LED 指示灯的位置和状态}"
|
|
71
|
+
- technical_spec_sheet: "{真实参数,不能编造}"
|
|
72
|
+
consistency_method:
|
|
73
|
+
primary: "same seed #1/#3/#5/#7/#9"
|
|
74
|
+
backup: "功能演示镜头可以真机拍摄 + AI 后期整合"
|
|
75
|
+
reference_image: "refs/product.jpg + 每个功能特写"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
# E · 参考图清单
|
|
81
|
+
|
|
82
|
+
| 文件 | 用途 | 必须 |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| `refs/product.jpg` | 产品全景 | ✅ |
|
|
85
|
+
| `refs/feature_1.jpg` | 功能 1 演示参考(含 UI 界面 / 动作)| ✅ |
|
|
86
|
+
| `refs/feature_2.jpg` | 功能 2 | ✅ |
|
|
87
|
+
| `refs/feature_3.jpg` | 功能 3 | ✅ |
|
|
88
|
+
| `refs/spec_sheet.png` | 参数表设计稿 | ⚠️ 推荐 |
|
|
89
|
+
| `refs/logo.jpg` | 品牌 | ⚠️ 推荐 |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
# F · 通用默认值
|
|
94
|
+
|
|
95
|
+
```yaml
|
|
96
|
+
aspect: "16:9" # PDP 功能型默认横屏(匹配详情页)
|
|
97
|
+
total_duration: 27
|
|
98
|
+
pacing: moderate(每个功能 5-6s)
|
|
99
|
+
asl: 2.7
|
|
100
|
+
bgm:
|
|
101
|
+
pdp: "tech / corporate BGM"
|
|
102
|
+
social_crossover: "节奏感 electronic"
|
|
103
|
+
# PDP 功能型不加 CTA;社媒版本加 CTA 应切到 scene-digital 模板
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
# G · 平台 Delta(PDP 为主,兼顾社媒复用)
|
|
109
|
+
|
|
110
|
+
| 用途 | 配置 |
|
|
111
|
+
|---|---|
|
|
112
|
+
| **京东 / 淘宝详情页** | 16:9 · 中文规格 · 静音兼容 |
|
|
113
|
+
| **天猫国际** | 16:9 · 中英双字幕 |
|
|
114
|
+
| **亚马逊 A+** | 16:9 · 英文规格 · 无 CTA |
|
|
115
|
+
| **独立站 / Shopify** | 16:9 · 可叠加 "Add to Cart" overlay |
|
|
116
|
+
| **社媒复用(非推荐)** | 改 9:16 + 加 CTA + 加 hashtag(实际应该用 scene-digital)|
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
# H · 失败模式 Checklist
|
|
121
|
+
|
|
122
|
+
## H.1 生成前
|
|
123
|
+
|
|
124
|
+
- [ ] 每个功能对应**真实可验证的参数**(规格表不能编)
|
|
125
|
+
- [ ] 每个功能有独立 REF_IMG(含 UI 界面清晰的参考)
|
|
126
|
+
- [ ] `PRODUCT_LOCK.every_ui_element` 填完(屏幕显示不能乱)
|
|
127
|
+
- [ ] NEGATIVE 含 `no UI garble, no fake reading, no wrong spec units`
|
|
128
|
+
|
|
129
|
+
## H.2 导出前
|
|
130
|
+
|
|
131
|
+
- [ ] 产品外观在 #1/#3/#5/#7/#9 完全一致
|
|
132
|
+
- [ ] 功能演示**真实可兑现**("5 秒快充" 要能在真机测得出来)
|
|
133
|
+
- [ ] 规格参数**单位正确**(mm / cm / g / kg / W / mAh / MHz 不混)
|
|
134
|
+
- [ ] UI 界面**字体清晰**(AI 常生成模糊假 UI)
|
|
135
|
+
- [ ] **无 CTA / 无价格**(PDP 铁律)
|
|
136
|
+
|
|
137
|
+
## H.3 发布前
|
|
138
|
+
|
|
139
|
+
- [ ] 静音播放时功能演示依然清晰?
|
|
140
|
+
- [ ] 技术术语准确(不用泛词如 "AI 智能")?
|
|
141
|
+
- [ ] 参数宣传**可交付**(做不到的不写)?
|
|
142
|
+
- [ ] 比例符合目标详情页?
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
# I · 成本预估
|
|
147
|
+
|
|
148
|
+
```yaml
|
|
149
|
+
production_cost:
|
|
150
|
+
per_second_rate_usd:
|
|
151
|
+
standard: TBD # 填自 Optima credits 换算表
|
|
152
|
+
hifi: TBD # 填自 Optima credits 换算表
|
|
153
|
+
complexity_note: "UI / 特效标注多"
|
|
154
|
+
human_review: "45 min(技术参数审查)"
|
|
155
|
+
editing_fx: "2 hours(数字叠加 + 图标 + 参数动画)"
|
|
156
|
+
total: "$8 + 3 hours"
|
|
157
|
+
note: "PDP 一次做好长期用,产品不改则不重做 → 长期 ROI 极高"
|
|
158
|
+
|
|
159
|
+
breakeven_math:
|
|
160
|
+
pdp_value_model: "详情页转化率 +2-5%"
|
|
161
|
+
typical_uplift: "中高客单数码产品 +1% 转化 = +¥500/日(按日单 50 · 单 ¥500 · 毛利 20%)"
|
|
162
|
+
pdp_video_payback: "~2 周"
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
# J · 复用边界
|
|
168
|
+
|
|
169
|
+
**✅ 直接套用**:
|
|
170
|
+
手机 · 平板 · 耳机 · 音箱 · 相机 · 电动工具 · 家电 · 智能穿戴 · 游戏设备
|
|
171
|
+
|
|
172
|
+
**❌ 不适合**:
|
|
173
|
+
- 纯外观型产品(无功能)→ `pdp-360-showcase.md`
|
|
174
|
+
- 需要场景代入(而非技术参数)→ `scene-digital.md`
|
|
175
|
+
- 功能点只有 1-2 个(不值得 27s)→ 简化版 PDP
|
|
176
|
+
- 功能无法可视化(软件功能)→ 屏录教程型
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
# 相关
|
|
181
|
+
|
|
182
|
+
- 姊妹模板:`pdp-360-showcase.md`(外观展示型 PDP)
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: scene-digital
|
|
3
|
+
type: scene-based
|
|
4
|
+
category: digital-3c
|
|
5
|
+
duration_sweet_spot: 25-35s
|
|
6
|
+
design_principle: "每个字段对应一个可预见的失败模式;字段密度按镜头风险不对称"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Template: 场景化使用型(数码 / 3C)
|
|
10
|
+
|
|
11
|
+
> **第一性原理**:本模板每个字段对应一个具体的失败模式。
|
|
12
|
+
> **适合**:耳机 / 键盘 / 相机 / 智能家居 / 数码配件,客单价 ¥200–2000
|
|
13
|
+
> **高风险镜头**:#3(产品首出 + 使用场景)· #5(核心功能特写)· #10(CTA)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# A · 项目卡
|
|
18
|
+
|
|
19
|
+
| 字段 | 填写 | 不填的后果 |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| `{product_name}` | | PRODUCT_LOCK 无锚点 |
|
|
22
|
+
| `{product_type}`(耳机/键盘/...)| | 决定参考图视角 |
|
|
23
|
+
| `{usage_scenario}`(通勤/办公/游戏/居家)| | Scene 段没画面 |
|
|
24
|
+
| `{core_feature}`(降噪/机械手感/HDR)| | 无核心卖点 |
|
|
25
|
+
| `{price}` | | CTA 不完整 |
|
|
26
|
+
| `{target_user}`(程序员/差旅/学生)| | Hook 找不到共鸣 |
|
|
27
|
+
| `{pain_being_solved}`("开放办公室噪音")| | Scene 没张力 |
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
# B · 五段骨架(Scene-Problem-Product-Demo-CTA)
|
|
32
|
+
|
|
33
|
+
| 段 | 时长 | 必须决定的事 |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| SCENE | 0-5s | 建立使用场景(办公室 / 通勤 / 居家)|
|
|
36
|
+
| PROBLEM | 5-10s | 场景中的具体痛点可视化 |
|
|
37
|
+
| PRODUCT | 10-15s | 产品首次出现 + 开箱 / 佩戴 |
|
|
38
|
+
| DEMO | 15-27s | **核心功能**多角度演示(通常 2-3 个子镜头) |
|
|
39
|
+
| CTA | 27-32s | 价格 + 平台优惠 + 购物车指示 |
|
|
40
|
+
|
|
41
|
+
**场景类铁律**:SCENE 和 PRODUCT 必须**连贯在同一空间**,不能跳场。
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
# C · 镜头表(11 镜 · 30s · ASL ~2.7s)
|
|
46
|
+
|
|
47
|
+
| # | 时长 | 画面 | 字幕 | 运镜 | PRODUCT_LOCK | REF_IMG | NEGATIVE |
|
|
48
|
+
|---|---|---|---|---|---|---|---|
|
|
49
|
+
| 1 | 0-3s | `{scene_wide}` 场景全景 | `{scene_label}`("9AM 办公室")| 广角 + 缓推 | — | `refs/scene.jpg` | no CGI look |
|
|
50
|
+
| 2 | 3-5s | `{user_in_scene}` 人物代入 | `{user_emotion}` | MS | — | — | no stock-footage feel |
|
|
51
|
+
| 3 | 5-7.5s | `{problem_visual}` 痛点可视化(噪音/键盘卡顿/画质差)| `{problem_word}` | CU | — | — | — |
|
|
52
|
+
| 4 | 7.5-10s | `{reaction_CU}` 人物无奈反应 | `{emotion_label}` | CU | — | — | no exaggerated expression |
|
|
53
|
+
| **5** | **10-12.5s** | **`{product}` 出场 / 开箱** | `{product_name}` | **静止 + 轻推** | **★ full** | **`refs/product.jpg`** | **no variations, no color shift** |
|
|
54
|
+
| 6 | 12.5-15s | `{product_worn_used}` 佩戴/连接 | "秒连 / 一键配对" | 跟手 | **★ same** | **`refs/product.jpg`** | no hand distortion |
|
|
55
|
+
| **7** | **15-20s** | **`{feature_demo_1}`** 功能 1 演示 | `{feature_1_label}` | **CU + 特效** | **★ same** | `refs/feature_1.jpg` | **no UI glitch, no fake reading** |
|
|
56
|
+
| 8 | 20-24s | `{feature_demo_2}` 功能 2 | `{feature_2_label}` | MS | **★ same** | `refs/feature_2.jpg` | — |
|
|
57
|
+
| 9 | 24-27s | `{user_happy}` 使用后满足 | `{result_emotion}` | MS + 自然光 | — | — | — |
|
|
58
|
+
| **10** | **27-30s** | **`{product_CU}` + 价格 + 优惠标** | `{cta_line}` | **CU + 字幕** | **★ hero** | **`refs/product.jpg`** | **no burned subtitle, no fake price** |
|
|
59
|
+
| 11 | 30-32s | `{brand_logo}` 品牌收尾 | `{brand}` | 静止 | — | `refs/logo.jpg` | no logo distortion |
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
# D · PRODUCT_LOCK 规范
|
|
64
|
+
|
|
65
|
+
```yaml
|
|
66
|
+
product_lock:
|
|
67
|
+
name: "{product_name}"
|
|
68
|
+
must_specify:
|
|
69
|
+
- form_factor: "{e.g. over-ear headphones / mechanical keyboard / action camera}"
|
|
70
|
+
- color_finish: "{e.g. matte black + silver hinge + LED indicator}"
|
|
71
|
+
- key_detail: "{e.g. volume dial on right cup / RGB backlight pattern / lens hood}"
|
|
72
|
+
- brand_mark_position: "{where logo appears}"
|
|
73
|
+
consistency_method:
|
|
74
|
+
primary: "same seed #5/#6/#7/#8/#10"
|
|
75
|
+
backup: "image-to-video chain #5 → #6 (开箱到佩戴的连贯)"
|
|
76
|
+
reference_image: "refs/product.jpg (≥1500x1500 · 4 角度 · 含功能部位特写)"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
# E · 参考图清单
|
|
82
|
+
|
|
83
|
+
| 文件 | 用途 | 必须 |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| `refs/product.jpg` | 产品多角度 | ✅ |
|
|
86
|
+
| `refs/scene.jpg` | 使用场景参考(办公室 / 通勤)| ✅ |
|
|
87
|
+
| `refs/feature_1.jpg` | 功能 1 的视觉 / UI | ✅ |
|
|
88
|
+
| `refs/feature_2.jpg` | 功能 2 的视觉 / UI | ⚠️ 推荐 |
|
|
89
|
+
| `refs/logo.jpg` | 品牌 logo 清晰图 | ⚠️ 推荐 |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
# F · 通用默认值
|
|
94
|
+
|
|
95
|
+
```yaml
|
|
96
|
+
aspect: "9:16"
|
|
97
|
+
total_duration: 32
|
|
98
|
+
pacing: moderate
|
|
99
|
+
asl: 2.9
|
|
100
|
+
bgm:
|
|
101
|
+
douyin: "商家原声 + 环境音"
|
|
102
|
+
tiktok: "tech-electronic / original sound"
|
|
103
|
+
xhs: "咖啡馆氛围 / 白噪音"
|
|
104
|
+
hook_template: "{target_user} 的 {pain_being_solved} 有救了"
|
|
105
|
+
cta_template: "{price} 点左下购买 · 首发立减 {discount}"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
# G · 平台 Delta
|
|
111
|
+
|
|
112
|
+
| | 抖音小店 | TikTok Shop | 小红书 |
|
|
113
|
+
|---|---|---|---|
|
|
114
|
+
| 字幕 | 中文 + 技术参数 | 英文大写 + spec | 中文 + 生活场景化描述 |
|
|
115
|
+
| 时长 | 32s | 25s(砍 #2 #9)| 40s(加 unbox 细节)|
|
|
116
|
+
| BGM | 原声解说 | original sound | 氛围音 |
|
|
117
|
+
| CTA 话术 | "左下角小黄车 限时减 50" | "🔗 Link below · Free shipping" | "评论区问链接" |
|
|
118
|
+
| Hashtag | `#数码好物 #效率神器` | `#techreview #edc #worksetup` | `#数码 #效率 #通勤好物` |
|
|
119
|
+
| 封面帧 | #5 开箱动作 | #7 功能特写 | #9 使用满足感 |
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
# H · 失败模式 Checklist
|
|
124
|
+
|
|
125
|
+
## H.1 生成前
|
|
126
|
+
|
|
127
|
+
- [ ] 产品参考图含**功能部位特写**(数码类关键细节多)
|
|
128
|
+
- [ ] `PRODUCT_LOCK.key_detail` 填写(如耳机转盘位置、键帽字体)
|
|
129
|
+
- [ ] NEGATIVE 含 `no UI glitch, no fake spec, no brand confusion`
|
|
130
|
+
|
|
131
|
+
## H.2 导出前
|
|
132
|
+
|
|
133
|
+
- [ ] 产品在 #5-#11 外观一致(特别检查**按钮 / 接口 / 接缝**)
|
|
134
|
+
- [ ] 功能演示画面**技术参数真实**(CPU / FPS / 分贝 / 续航时长)
|
|
135
|
+
- [ ] 场景转换流畅(#1 → #5 空间是否合理)
|
|
136
|
+
- [ ] 人物和产品交互姿势合理
|
|
137
|
+
|
|
138
|
+
## H.3 发布前
|
|
139
|
+
|
|
140
|
+
- [ ] 静音能看懂核心功能?
|
|
141
|
+
- [ ] 技术术语准确(no "AI智能"泛词,具体到技术名)
|
|
142
|
+
- [ ] 价格 / 优惠当下有效?
|
|
143
|
+
- [ ] 各平台 Delta 改完?
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
# I · 成本预估
|
|
148
|
+
|
|
149
|
+
```yaml
|
|
150
|
+
production_cost:
|
|
151
|
+
per_second_rate_usd:
|
|
152
|
+
standard: TBD # 填自 Optima credits 换算表
|
|
153
|
+
hifi: TBD # 填自 Optima credits 换算表
|
|
154
|
+
complexity_note: "场景 + 功能 UI 多"
|
|
155
|
+
human_review: "45 min"
|
|
156
|
+
editing_fx: "2 hours(功能演示特效 + 参数标注)"
|
|
157
|
+
per_platform_delta: "25 min × 3 = 75 min"
|
|
158
|
+
total: "$7.7 + 4.5 hours"
|
|
159
|
+
|
|
160
|
+
breakeven_math:
|
|
161
|
+
margin_typical: "30-50%(数码毛利中等)"
|
|
162
|
+
conversion_rate: "0.8-1.5%(客单高决策慢)"
|
|
163
|
+
realistic_range_per_platform: "50K-300K views"
|
|
164
|
+
break_even_views_for_500yuan_item: "~8K 播放(按 1% 转化 · 30% 毛利)"
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
# J · 复用边界
|
|
170
|
+
|
|
171
|
+
**✅ 直接套用**:
|
|
172
|
+
耳机 · 键盘 · 鼠标 · 摄像头 · 智能音箱 · 便携相机 · 移动电源 · 数据线管理
|
|
173
|
+
|
|
174
|
+
**❌ 不适合**:
|
|
175
|
+
- 大家电(需要 KOL 长测评)
|
|
176
|
+
- 软件 / App(切换到纯屏录演示)
|
|
177
|
+
- 高度专业设备(需要技术 KOL 而非通用场景)
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
# 相关
|
|
182
|
+
|
|
183
|
+
- 数码 KOL 参考:影视飓风 · Fireship
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* `gen avatar train <video-file> --external-id <id>` — train a HeyGen digital_twin avatar
|
|
4
|
+
* from a local video file. CLI handles asset upload + submit + poll, then prints look_id.
|
|
5
|
+
*
|
|
6
|
+
* Phase 2 doctor-avatar feature. See spec §13 + §13.4 (clean-bg requirement).
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerAvatarCommand(program: Command): void;
|
|
9
|
+
//# sourceMappingURL=avatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../src/commands/avatar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QA6JrD"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { success, info, warning } from '../utils/logger.js';
|
|
5
|
+
import { outputSuccess, outputError, isPrettyMode } from '../utils/output.js';
|
|
6
|
+
import { addEnhancedHelp } from '../utils/helpText.js';
|
|
7
|
+
import { GenerationApiClient, GenerationApiError } from '../services/generation-api.js';
|
|
8
|
+
/**
|
|
9
|
+
* `gen avatar train <video-file> --external-id <id>` — train a HeyGen digital_twin avatar
|
|
10
|
+
* from a local video file. CLI handles asset upload + submit + poll, then prints look_id.
|
|
11
|
+
*
|
|
12
|
+
* Phase 2 doctor-avatar feature. See spec §13 + §13.4 (clean-bg requirement).
|
|
13
|
+
*/
|
|
14
|
+
export function registerAvatarCommand(program) {
|
|
15
|
+
const avatar = program.command('avatar').description('医生 avatar(数字人)训练相关命令(Phase 2)');
|
|
16
|
+
const trainCmd = avatar
|
|
17
|
+
.command('train')
|
|
18
|
+
.description('用本地视频训练 HeyGen digital_twin avatar,产出 avatar look_id')
|
|
19
|
+
.argument('<video-file>', '视频文件路径(.mp4 / .mov 等,2-5 分钟推荐)')
|
|
20
|
+
.requiredOption('--external-id <id>', '业务方医生标识(写入 doctor_avatar_profiles)')
|
|
21
|
+
.option('--name <name>', 'HeyGen 侧 avatar name(默认 doctor-avatar)')
|
|
22
|
+
.option('--clean-bg', '声明视频背景已干净(白墙/医院/棚拍/绿幕)', false)
|
|
23
|
+
.option('--accept-baked-bg', '明确接受脏背景被 baked 进 avatar look(spec §13.4 — 仅用于探针 / 非上线场景)', false)
|
|
24
|
+
.action(async (videoFile, options) => {
|
|
25
|
+
const pretty = isPrettyMode(options);
|
|
26
|
+
try {
|
|
27
|
+
// §13.4: video background gets baked into avatar look. Force the operator to make
|
|
28
|
+
// an explicit choice — either declare clean-bg or accept the consequences.
|
|
29
|
+
if (!options.cleanBg && !options.acceptBakedBg) {
|
|
30
|
+
outputError('BG_DECISION_REQUIRED', '请二选一(spec §13.4 — 背景会被 baked 进 avatar look,无法撤销):\n' +
|
|
31
|
+
' --clean-bg 视频背景已干净(白墙/医院/棚拍/绿幕)\n' +
|
|
32
|
+
' --accept-baked-bg 接受当前视频背景成为 avatar 永久背景(仅探针/非上线场景)', options);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (options.cleanBg && options.acceptBakedBg) {
|
|
36
|
+
outputError('BG_DECISION_CONFLICT', '--clean-bg 和 --accept-baked-bg 二选一,不能同时指定', options);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const videoPath = path.resolve(videoFile);
|
|
40
|
+
if (!fs.existsSync(videoPath)) {
|
|
41
|
+
outputError('VIDEO_NOT_FOUND', `视频文件不存在: ${videoPath}`, options);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (pretty && options.acceptBakedBg) {
|
|
45
|
+
warning('已显式接受脏背景被 baked,生成视频时无法替换 avatar 内置背景');
|
|
46
|
+
}
|
|
47
|
+
const client = new GenerationApiClient();
|
|
48
|
+
// Step 1: upload video asset
|
|
49
|
+
const upSpinner = pretty ? ora('上传视频到 HeyGen 资产存储...').start() : null;
|
|
50
|
+
const asset = await client.uploadHeyGenAsset(videoPath);
|
|
51
|
+
if (pretty)
|
|
52
|
+
upSpinner.succeed(`视频已上传 (asset_id=${asset.asset_id}, ${(asset.size_bytes / 1024 / 1024).toFixed(1)} MB)`);
|
|
53
|
+
// Step 2: submit avatar-train task
|
|
54
|
+
const trainSpinner = pretty ? ora('提交 avatar 训练任务...').start() : null;
|
|
55
|
+
const result = await client.submitAndPoll('avatar-train', {
|
|
56
|
+
video_asset_id: asset.asset_id,
|
|
57
|
+
external_id: options.externalId,
|
|
58
|
+
name: options.name,
|
|
59
|
+
training_video_clean_bg: options.cleanBg,
|
|
60
|
+
}, {
|
|
61
|
+
timeout: 1800000, // 30 min — avatar training can be slow
|
|
62
|
+
onProgress: (status) => {
|
|
63
|
+
if (pretty)
|
|
64
|
+
trainSpinner.text = `avatar 训练中 (${status})...`;
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
if (result.status === 'completed') {
|
|
68
|
+
const groupId = result.result_meta?.avatar_group_id;
|
|
69
|
+
const lookIds = result.result_meta?.look_ids ?? [];
|
|
70
|
+
const looksCount = result.result_meta?.looks_count;
|
|
71
|
+
const previewUrl = result.result_meta?.preview_image_url;
|
|
72
|
+
if (pretty) {
|
|
73
|
+
trainSpinner.succeed('avatar 训练完成!');
|
|
74
|
+
success(`avatar_group_id: ${groupId}`);
|
|
75
|
+
success(`avatar look_id (用于 video gen): ${lookIds[0] || '(none captured)'}`);
|
|
76
|
+
info(`looks_count: ${looksCount} (Phase 2 v1 仅存第一个 look,见 spec §13.5)`);
|
|
77
|
+
if (previewUrl)
|
|
78
|
+
info(`预览图: ${previewUrl}`);
|
|
79
|
+
info(`task_id: ${result.task_id}`);
|
|
80
|
+
info(`external_id: ${options.externalId}`);
|
|
81
|
+
info(`使用: gen doctor profile ${options.externalId} 查看完整 profile`);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
outputSuccess({
|
|
85
|
+
task_id: result.task_id,
|
|
86
|
+
status: result.status,
|
|
87
|
+
avatar_group_id: groupId,
|
|
88
|
+
look_ids: lookIds,
|
|
89
|
+
looks_count: looksCount,
|
|
90
|
+
preview_image_url: previewUrl,
|
|
91
|
+
external_id: options.externalId,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
if (pretty) {
|
|
97
|
+
trainSpinner.info(`任务状态: ${result.status}`);
|
|
98
|
+
if (result.error_message)
|
|
99
|
+
info(`错误: ${result.error_message}`);
|
|
100
|
+
info(`使用 'gen task get ${result.task_id}' 查看最新状态`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
outputSuccess({
|
|
104
|
+
task_id: result.task_id,
|
|
105
|
+
status: result.status,
|
|
106
|
+
error_code: result.error_code ?? null,
|
|
107
|
+
retryable: result.retryable ?? false,
|
|
108
|
+
error_message: result.error_message,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
if (err instanceof GenerationApiError) {
|
|
115
|
+
outputError(err.code, err.message, options);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
outputError('AVATAR_TRAIN_FAILED', `avatar 训练失败: ${err}`, options);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
addEnhancedHelp(trainCmd, {
|
|
123
|
+
examples: [
|
|
124
|
+
'# 训练医生 avatar (棚拍/白墙背景)',
|
|
125
|
+
'$ gen avatar train ./doctor-video.mp4 --external-id doc-123 --clean-bg',
|
|
126
|
+
'',
|
|
127
|
+
'# 视频背景不干净(将来需抠图)— 先训出来再讨论',
|
|
128
|
+
'$ gen avatar train ./hospital-recording.mp4 --external-id doc-123',
|
|
129
|
+
],
|
|
130
|
+
outputJson: `{
|
|
131
|
+
"success": true,
|
|
132
|
+
"data": {
|
|
133
|
+
"task_id": "task-uuid",
|
|
134
|
+
"status": "completed",
|
|
135
|
+
"avatar_group_id": "174fa88e...",
|
|
136
|
+
"look_ids": ["04182555..."],
|
|
137
|
+
"looks_count": 4,
|
|
138
|
+
"preview_image_url": "https://heygen/preview.jpg",
|
|
139
|
+
"external_id": "doc-123"
|
|
140
|
+
}
|
|
141
|
+
}`,
|
|
142
|
+
relatedCommands: [
|
|
143
|
+
{ command: 'voice clone <audio-file> --external-id <id>', description: '训练 voice' },
|
|
144
|
+
{ command: 'doctor onboard <audio> <video> --external-id <id>', description: '一次同时训 voice + avatar' },
|
|
145
|
+
{ command: 'doctor profile <external-id>', description: '查看医生 profile' },
|
|
146
|
+
],
|
|
147
|
+
notes: [
|
|
148
|
+
'推荐视频 2-5 分钟,正面拍摄,光线均匀',
|
|
149
|
+
'**spec §13.4**: HeyGen 把整段视频画面(包括背景)整体作为 avatar look — 上线产品要求干净背景',
|
|
150
|
+
'looks_count 通常 = 4,但 Phase 2 v1 只存第一个 look_id(待 v1.1 扩展)',
|
|
151
|
+
'训练时长 5-30 分钟',
|
|
152
|
+
],
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../src/commands/avatar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* `gen doctor` namespace — Phase 2 doctor-avatar high-level commands:
|
|
4
|
+
* gen doctor onboard <audio> <video> --external-id <id>
|
|
5
|
+
* gen doctor video --avatar <id> --voice <id> --text <...>
|
|
6
|
+
* gen doctor profile <external-id>
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerDoctorCommand(program: Command): void;
|
|
9
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAMrD"}
|