--- 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 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 → 教程段拼接命令`](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 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 → 字幕渲染`](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`](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)