Files
Popiai-skill/social-media/hilo-promo/SKILL.md
T

215 lines
9.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: hilo-promo
display-name-zh: AI推广视频
description: |
AI视频APP推广创作助手,专用于制作竖版(9:16)社交媒体推广短视频。
基于「图片模板」,自动完成角色洗图、换脸写真生成、口播TTS、
数字人口型同步、多段合成,输出 1080×1920 竖版推广视频及可选 4:5 裁切版。
触发词:模板视频、template video、推广视频、promo video、推广模板、
make a promo video、social media ad、换脸写真、图片模板推广。
version: 1.2.1
summary-cn: 用图片模板生成竖版推广短视频
summary-en: Photo templates to vertical promo video
tags: [Video, Marketing, Promo, AI-Template]
tags-cn: [视频, 营销, 推广, AI模板]
exported-by: MiniMax-hub
---
# AI Video Promo Creator
> 基于图片模板,输出竖版(1080×1920)推广教程视频。流程:角色洗图 → 换脸写真 → 口播 TTS → 数字人 PiP → 教程段 → 拼接合成。
---
## 全局约定
| 约定 | 规则 |
|------|------|
| 工作目录 | `./{project_name}/`,从需求自动提取 |
| 阶段推进 | 每阶段完成后展示结果,用 `question` 确认再推进 |
| 口播语言 | 默认英文,可由用户指定 |
| 生图 prompt | 始终英文 |
---
## 阶段一:需求解析
收集以下信息,缺失项向用户提问:
| 信息项 | 说明 |
|--------|------|
| 角色参考图 | 图片路径或文字外貌描述 |
| 模板图来源 | 写真模板图片路径或 URL |
| 口播脚本 | 英文文案;无则阶段四自动生成 |
| 尾板视频 | 默认 `{skill_root}/assets/endcard_en.mp4` |
**共享素材预检**:进入阶段二前检查 `{skill_root}/assets/` 下列文件,缺失则 `curl` 下载:
| 文件 | CDN URL |
|------|---------|
| `endcard_en.mp4` | `https://cdn.hailuoai.com/pre/2026-04-24-14/video/1777012954453480092-1777012954413.mp4` |
| `tut_001.mp4` | `https://cdn.hailuoai.com/pre/2026-04-24-14/video/1777013069159453139-1777013069157.mp4` |
**产出**`./{project_name}/brief.md`
---
## 阶段二:角色形象生成(洗图)
1. **有参考图**`read_media` 提取外貌特征(英文 prompt 格式)→ 以原图为垫图生成角色图,宽高比 `3:4`,追加 `realistic photo, high quality, studio lighting, solid color background`
2. **无参考图**:基于描述构造英文 prompt → 图片生成,`3:4`
3. ⏸ 用户确认
**产出**`./{project_name}/character.jpg`
---
## 阶段三:换脸写真生成
1. 获取模板图(用户提供或 `image_search` 搜索)
2. 若模板图含数字人 PiP 小画面,用 `read_media` 仅分析背景风格,忽略数字人区域
3. 换脸生成(≤3 张逐张,>3 张批量):`image_paths=[character.jpg, 模板图]`,prompt 要求保留姿势/服装/背景/光线,仅替换面孔
**生成后 Review(必须执行,不合格重新生成)**
| 检查项 | 不合格处理 |
|--------|------------|
| 无文字水印 | prompt 加 `remove all text, no text in image` |
| 风格统一 | 统一场景/光线描述重新生成 |
| 人物一致 | 重新生成 character.jpg 或更换垫图 |
| 肤色一致 | prompt 加 `same skin tone, consistent skin tone throughout entire body` |
4. ⏸ 用户确认
**产出**`./{project_name}/photos/photo_0N.jpg`
---
## 阶段四:口播制作
1. **脚本**:需求中已有则直接用;无则自动生成:
> `I was shocked at how I looked in the [主题] photoshoot — I got them in one click. No budget, no makeup, just download Hilo AI, upload a selfie, get studio-level photos in seconds! Try it yourself!`
2. **生成语音**`audios_generation`,调用 `get_voice_id` 按角色性别/风格选声音
3. **获取时间戳**`audio_transcribe_lyrics` → 写入 `voiceover_subtitle.json`(禁止手动拆分时间戳)
**产出**`voiceover.mp3` / `voiceover_script.txt` / `voiceover_subtitle.json`
---
## 阶段五:数字人生成
> ⚠️ 三步必须完整执行(绿幕生成 → 口型同步 → 抠像),严禁跳过抠像直接叠加带背景的数字人,否则最终视频报废。
**Step 1:生成绿幕肖像**
- 若服装含绿色调,改用蓝幕(`#0000FF`),Step 3 同步调整 chromakey 颜色
- prompt 指定:`#00FF00 solid green screen background, half-body portrait`
- 输出:`digital_person/green_screen.jpg`
**Step 2:口型同步视频**
- **方案 A(首选)**Kling Avatar`image_path=green_screen.jpg``audio_path=voiceover.mp3`
- **方案 B(仅 A 明确失败后启用)**:Seedance 2.0,生成 2 段各 15s`generate_audio: true`,不传 `reference_audio_urls`,prompt 描述自然说话动作与绿幕背景
**Step 3:抠像**
- 调用 `scripts/green_screen_keying.py --input talking_head_green.mp4 --output pip_clean.mov`
- 先输出前 5s demo 让用户确认抠像效果,通过后处理完整视频
**⚠️ 强制自查(用户确认前必须通过,不通过禁止展示)**:
```python
import numpy as np, subprocess
from PIL import Image
for t in [0.5, 2.0, 5.0]:
subprocess.run(["ffmpeg","-y","-i","digital_person/pip_clean.mov",
"-ss",str(t),"-frames:v","1",f"/tmp/chk_{t}.png"], capture_output=True)
alpha = np.array(Image.open(f"/tmp/chk_{t}.png"))[:,:,3]
print(f"t={t}s visible={(alpha>10).sum()*100//alpha.size}% maxAlpha={alpha.max()}")
# 可见像素 < 5% 或 maxAlpha=0 → 过度抠像;降级方案:改用 talking_head_green.mp4 + chromakey 实时抠像(参数见 spec.md
```
**产出**`digital_person/green_screen.jpg` / `talking_head_green.mp4` / `pip_clean.mov`
> 📖 PiP 合成参数(缩放/坐标/图层顺序)见 [`references/spec.md → 数字人 PiP 规范`](references/spec.md)
---
## 阶段六:教程段制作
**目标**5.5s 教程段(seg1=1.5s + seg2=2.0s + seg3=2.0s),1080×1920
**Step 1tut_002 — App 首页截图 + 微振动**
- image agent **editing** `{skill_root}/assets/tut_002_layout_ref.png`:将某一模板卡片替换为本项目模板画面,添加紫色矩形发光边框(`neon purple glow rectangular border`),其余界面保持不变;模板画面未知则向用户询问
- PIL 帧动画制作 2s 微振动:`dy = 4·e^{-2.5t}·sin(2π·7t)`30fps → `tut_002_v.mp4`
**Step 2tut_004 — 角色上传弹出动画**
- 底图:`assets/tut_003.png`(空白)/ `assets/tut_004.png`(已上传),照片区坐标 `PX1=288,PY1=288,PX2=791,PY2=1192`
- 弹出动画(2s30fps):0~0.3s 空白 → 0.3~0.55s 从 1.35× 缩到 1.0× 带白色闪光 → 0.55s 后冻结
- 叠加 whoosh 音效(`adelay` 对齐至 0.3s)→ `tut_004_v.mp4`
**Step 3:标准化 + 拼接**
- 调用 `scripts/tutorial_synthesis.py pipeline`
- 完整 ffmpeg 命令见 [`references/spec.md → 教程段拼接命令`](references/spec.md)
⏸ 用户确认 → 产出 `tut_combined.mp4`
---
## 阶段七:基本拼接
**视频结构(3 段)**:写真切换(3-4s, xfade 转场) → 写真3+教程段叠加(8-12s) → 尾板(5s)
> ℹ️ 数字人 PiP 与字幕在阶段八叠加,本阶段只拼接基本素材。
**⚠️ 拼接前必须统一流规格**:time_base / 声道数 / 帧率不一致会导致时长翻倍或音频静音。所有文件统一编码为 `libx264 / 30fps / 1080×1920 / aac 48kHz stereo`
完整标准化命令见 [`references/spec.md → 拼接标准化命令`](references/spec.md)。concat list 必须用**绝对路径**。
调用 `scripts/composite.py image`,用 `ffprobe` 核查时长/分辨率/音频轨。
**产出**`final_v*.mp4`(无字幕/数字人/BGM
---
## 阶段八:最终合成
> ⚠️ 字幕、数字人 PiP、BGM 三者必须全部叠加后再展示给用户。
**Step 1:生成 BGM** — audio agentupbeat pop/electronic 无人声,时长 = 视频时长+3s,末尾 fade out 3s
**Step 2PIL 字幕 MOV** — Arial Black 全大写,白色+橙红描边(210,70,10) stroke=4,自适应字号(56→22pt 最大宽756px),底边 y=1344,逐句单行显示。完整渲染代码见 [`references/spec.md → 字幕渲染`](references/spec.md)
**Step 3ffmpeg composite** — 图层顺序:底层视频 → 字幕 → 数字人 PiP(最顶层)
chromakey:先采样角落像素实测绿幕颜色(勿硬编码),**similarity ≤ 0.10**(深色皮肤临界值,≥0.15 开始误抠人物),blend=0.02scale=400:-2,位置 x=0:y=H-h`enable='lte(t\,{vo_end})'`。完整 filter_complex 见 [`references/spec.md → composite filter_complex`](references/spec.md)
**Step 4:强制自查(展示前必须通过)**
```python
import numpy as np, subprocess
from PIL import Image
subprocess.run(["ffmpeg","-y","-i","final.mp4","-ss","3","-frames:v","1","/tmp/pip_chk.png"], capture_output=True)
pip = np.array(Image.open("/tmp/pip_chk.png").convert("RGB"))[1380:1920, 0:400]
print(f"PiP std={pip.std(axis=(0,1)).astype(int)}")
# std dev R < 5 → 数字人不可见,禁止展示
# 排查顺序:1.similarity过大 2.图层顺序错误 3.enable表达式错误 4.pip_clean.mov alpha全零
```
**产出**`final.mp4`9:16,含字幕+数字人+BGM/ `final_4x5.mp4`(可选)
---
## 共享素材
路径:`{skill_root}/assets/`,视频文件由阶段一预检自动下载。
| 文件 | 说明 |
|------|------|
| `endcard_en.mp4` | 5s 英文尾板(Hilo AI 搜索框 CTA |
| `tut_001.mp4` | App Store 页面(1.5s |
| `tut_003.png` | Use Template 空白上传界面 |
| `tut_004.png` | Use Template 已上传界面 |
| `tut_002_layout_ref.png` | App 首页布局参考截图 |
| `subtitle_style_ref.jpg` | 字幕样式参考图 |
> 📖 详细技术规范(ffmpeg 命令 / 字幕渲染 / PiP 坐标 / 音频混合)见 [`references/spec.md`](references/spec.md)