9.6 KiB
| name | display-name-zh | description | version | summary-cn | summary-en | tags | tags-cn | exported-by |
|---|---|---|---|---|---|---|---|---|
| hilo-promo | AI推广视频 | AI视频APP推广创作助手,专用于制作竖版(9:16)社交媒体推广短视频。 基于「图片模板」,自动完成角色洗图、换脸写真生成、口播TTS、 数字人口型同步、多段合成,输出 1080×1920 竖版推广视频及可选 4:5 裁切版。 触发词:模板视频、template video、推广视频、promo video、推广模板、 make a promo video、social media ad、换脸写真、图片模板推广。 | 1.2.1 | 用图片模板生成竖版推广短视频 | Photo templates to vertical promo video | [Video Marketing Promo AI-Template] | [视频 营销 推广 AI模板] | 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
阶段二:角色形象生成(洗图)
- 有参考图:
read_media提取外貌特征(英文 prompt 格式)→ 以原图为垫图生成角色图,宽高比3:4,追加realistic photo, high quality, studio lighting, solid color background - 无参考图:基于描述构造英文 prompt → 图片生成,
3:4 - ⏸ 用户确认
产出:./{project_name}/character.jpg
阶段三:换脸写真生成
- 获取模板图(用户提供或
image_search搜索) - 若模板图含数字人 PiP 小画面,用
read_media仅分析背景风格,忽略数字人区域 - 换脸生成(≤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 |
- ⏸ 用户确认
产出:./{project_name}/photos/photo_0N.jpg
阶段四:口播制作
-
脚本:需求中已有则直接用;无则自动生成:
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! -
生成语音:
audios_generation,调用get_voice_id按角色性别/风格选声音 -
获取时间戳:
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 让用户确认抠像效果,通过后处理完整视频
⚠️ 强制自查(用户确认前必须通过,不通过禁止展示):
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 规范
阶段六:教程段制作
目标:5.5s 教程段(seg1=1.5s + seg2=2.0s + seg3=2.0s),1080×1920
Step 1:tut_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 2:tut_004 — 角色上传弹出动画
- 底图:
assets/tut_003.png(空白)/assets/tut_004.png(已上传),照片区坐标PX1=288,PY1=288,PX2=791,PY2=1192 - 弹出动画(2s,30fps):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 → 教程段拼接命令
⏸ 用户确认 → 产出 tut_combined.mp4
阶段七:基本拼接
视频结构(3 段):写真切换(3-4s, xfade 转场) → 写真3+教程段叠加(8-12s) → 尾板(5s)
ℹ️ 数字人 PiP 与字幕在阶段八叠加,本阶段只拼接基本素材。
⚠️ 拼接前必须统一流规格:time_base / 声道数 / 帧率不一致会导致时长翻倍或音频静音。所有文件统一编码为 libx264 / 30fps / 1080×1920 / aac 48kHz stereo。
完整标准化命令见 references/spec.md → 拼接标准化命令。concat list 必须用绝对路径。
调用 scripts/composite.py image,用 ffprobe 核查时长/分辨率/音频轨。
产出:final_v*.mp4(无字幕/数字人/BGM)
阶段八:最终合成
⚠️ 字幕、数字人 PiP、BGM 三者必须全部叠加后再展示给用户。
Step 1:生成 BGM — audio agent,upbeat pop/electronic 无人声,时长 = 视频时长+3s,末尾 fade out 3s
Step 2:PIL 字幕 MOV — Arial Black 全大写,白色+橙红描边(210,70,10) stroke=4,自适应字号(56→22pt 最大宽756px),底边 y=1344,逐句单行显示。完整渲染代码见 references/spec.md → 字幕渲染
Step 3:ffmpeg composite — 图层顺序:底层视频 → 字幕 → 数字人 PiP(最顶层)
chromakey:先采样角落像素实测绿幕颜色(勿硬编码),similarity ≤ 0.10(深色皮肤临界值,≥0.15 开始误抠人物),blend=0.02,scale=400:-2,位置 x=0:y=H-h,enable='lte(t\,{vo_end})'。完整 filter_complex 见 references/spec.md → composite filter_complex
Step 4:强制自查(展示前必须通过)
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