关于 ugc-ads
ugc-ads 是用于根据产品网址制作 UGC 广告的 Pika 技能。它提取产品信息、编写多语言视频提示词,并通过分阶段流程生成视频、字幕和可读叠字。
主要功能
- 01提取产品页信息并识别类别
- 02默认使用 Seedance,也可选 Kling
- 03使用头像和产品截图作参考
- 04编写多语言对白与口型提示
- 05添加字幕和文字叠层
适用场景
- 01为产品页面制作 UGC 风格广告
- 02生成不同宽高比的广告视频
- 03添加字幕及可读品牌或规格文字
MCP 相关
该技能使用 Pika MCP 工具进行图像分析、视频生成、网页截图、编辑、字幕处理和任务状态轮询。付费生成前须披露费用并获得用户批准。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ pika-labs/ pika-plugins --skill ugc-ads安装后在 Claude Code 中输入/ugc-ads确认已加载。
详细介绍
/pika:ugc-ads
参数
| 参数 | 默认值 | 说明 |
|---|---|---|
url | 必填 | 产品 URL——用于判断类别和替换桥段 |
avatar_url | 内置备用值 | 人设肖像 URL;作为 @Image1 参考图传入。省略时,该技能会使用预先生成的皮克斯风格女性创作者肖像 |
provider | seedance | seedance:擅长 UGC 自拍/对镜头口播视角,支持原生唇形同步、单个提示词中的多段内容,以及 3:4 画幅。kling:使用显式的 shots[],仅支持 9:16/16:9 |
aspect_ratio | 9:16 | 3:4 仅适用于 seedance(kling 不接受 3:4) |
variants | 未设置 | 用于共享生成导出的可选逗号分隔列表。支持:9:16、16:9、1:1。可共享成本高昂的 UGC 渲染,然后在最后阶段重新取景。 |
category | 自动 | HAUL / APP / FOOD / BEAUTY / FITNESS / TECH;根据 URL 自动选择 |
captions | true | 烧录在最终视频上的 TikTok 风格分词字幕 |
费用透明度门槛
在进行任何付费 MCP 调用之前,调用一次 identity_balance({verbose: true})。显示当前余额、近期消耗速率和剩余可用时间,然后使用以下确切消息设置运行门槛:
预计费用:典型 Seedance UGC 广告约需 4,000 点数(约 $40),包含备用方案/重试预算。费用超过 $5;回复
proceed继续,或回复cancel停止。
在用户回复 proceed 之前,不要调用任何付费 MCP 工具。如果用户回复 cancel,则停止,不生成内容。产品 URL 确认后、头像分析、截图捕获、视频生成、字幕处理或付费重试之前,均须执行此门槛。
运行时预期
典型端到端运行时间:6–12 分钟。明细:
- 步骤 1(WebFetch)+ 步骤 3(capture_website 截图):约 10–30 秒
- 步骤 7(
generate_reference_video):seedance 约 3–5 分钟,kling 约 5–7 分钟 - 步骤 7b/c(卡通化 + 重试):如果 seedance 内容审核拒绝该头像,则额外增加约 1–2 分钟
- 步骤 8(确定性品牌/规格叠加):1–2 次
edit_text_overlay调用,总计约 30 秒–5 分钟 - 步骤 9(字幕):单次
add_captions调用,约 30 秒–5 分钟(一次性完成转录和烧录)
如果运行超过 15 分钟仍无进展,则说明出了问题——检查工具报告的生成状态和错误消息。
生成前的挂钟计时守护
产品 URL 可用且费用门槛通过后,在技能启动时开始计时。等待用户回复 proceed 的时间不计入准备时间,也不会触发此守护。首次付费生成调用是 generate_reference_video,也是耗时最长的付费阶段,必须在技能启动后 5 分钟内调用。如果技能启动后 5 分钟内尚未调用 generate_reference_video,则在进行任何付费生成调用之前停止,并报告 failed_pre_generation_timeout,同时提供目前已有的信息:已获取的产品事实、选定的类别、头像来源、截图状态、对话草稿以及确切的阻塞原因。不要继续打磨脚本措辞、提示词依据或镜头顺序。
每完成一个准备阶段后,以及付费生成调用前,打印一行进度检查点:
Stage 1/3 done — product fetched and categorized.Stage 2/3 done — avatar and screenshot ready, composing dialogue.Stage 3/3 done — prompt locked, calling Seedance now.
脚本和提示词最多迭代 2 轮。达到最多 2 轮后,将现有内容提交给 generate_reference_video;不要继续润色开场、包袱或屏幕特写的措辞。
长时间运行的 task_status 轮询
当任何长时间运行的生成或编辑调用返回带有 task_id 的结果(无论是否包含初始状态),包括 {task_id}、{task_id, status: "queued"},或初始状态为 queued、running 或 processing 时,立即记录任务 ID 和开始时间。
- 紧密循环调用
task_status({task_id}),直到任务进入终态(completed | failed | cancelled)。不要手动休眠,也不要使用 Bash 轮询;工作进程会让每次状态调用保持打开状态。 - 当状态为
queued、running或processing时,每 60 秒输出一行可见进度:Seedance i2v queued for {N}m {S}s... still processing。轮询 Kling、GPT-image-2、caption 或 edit 任务时,替换提供方/阶段标签。 - 状态为
completed时,提取返回的结果 URL 并继续。 - 状态为
failed或cancelled时,向用户显示失败信息,包含task_id、状态和最后一条状态消息。 - 从最初提交开始累计 15 分钟后,如果任务仍未进入终态,则调用
task_cancel({task_id}),然后向用户显示失败信息。如果取消操作报告任务已处于终态,则再次调用一次状态查询,并报告该终态结果。 - 原始任务仍处于
queued、running或processing状态时,不要提交重复请求。 - 异步轮询预算:一次只允许一个活动任务,且轮询窗口为 15 分钟。轮询时限耗尽后,取消任务并向用户显示失败信息;除非后续步骤明确允许在原始任务进入终态后进行单独且有上限的重试,否则不要提交另一个付费渲染请求。
引擎选择:默认使用 Seedance,失败时使用 Kling
UGC 自拍/面对镜头口播广告默认使用 Seedance,因为它支持原生唇形同步、通过单个提示词控制多段节奏,还可选择 3:4 输出。仅当调用方明确传入 provider=kling,或 Seedance 的限定次数卡通化重试耗尽后用户在停止提示中选择 Kling 时,才使用 Kling。Kling 的取舍是宽高比支持更严格,但具有独立的审核流程,并支持显式分镜。
步骤
0. 解析输入(空参数菜单)
从 $ARGUMENTS 中移除标志和 key=value 参数。如果没有剩余的产品 URL,且先前上下文中也没有可用的产品 URL,则打印此菜单并停止:
这条 UGC 广告要推广什么产品? 必填:
- 产品 URL — 用于获取产品名称、类别、视觉参考和语言的页面
可选:
avatar_url=、provider=seedance|kling、aspect_ratio=9:16|3:4、variants=9:16,16:9,1:1、category=auto|HAUL|APP|FOOD|BEAUTY|FITNESS|TECH、captions=true|false。
如果提供了产品 URL,则静默跳过此步骤。
1. 获取页面并分类
对 URL 使用 WebFetch:提取 product_name、brand_name、价值主张、品牌颜色、产品形态、包装、主打文案、目标用户、类别,以及页面的主要语言。如果传入了 category=,则使用该值;否则依据信任 WebFetch 得出的信号;如果无法判断,实物产品归为 HAUL,数字产品归为 APP。
根据获取的页面内容,整理两份有依据的事实清单:
{
"grounded_specs": [
{
"claim_text": "250W total output",
"value": "250",
"unit": "W",
"source_quote": "visible source-page text containing the exact value",
"source_url": "<product URL>"
}
],
"claims_allowlist": ["250W total output"]
}
每项数值规格声明(W、mAh、%、分钟数、端口、价格、尺寸、数量、充电速度、电池容量、排名)都必须来自页面上可见的文本,并包含 source_quote。如果页面上没有可见内容支持某个数字,则不要将其列入 grounded_specs 和 claims_allowlist。不要根据产品类别、型号名称、常识或竞争对手页面推断规格。
2. 确定头像(缺失时使用内置头像)
- 如果传入了
avatar_url→ 按原样使用。 - 如果未传入 → 使用此内置备用头像:
预先生成的 3D 动画皮克斯风格年轻女性创作者肖像——预先卡通化,因此 Seedance 审核可直接接受;风格中性,适合任何类别。在最终摘要中说明使用了备用头像,以便调用方知道下次应提供自己的肖像,保持人物形象一致。https://cdn.pika.art/v2/files/agent/17d62bf9-0edb-49e4-9ba9-2c5419fa518f/seedream-1777624057811.jpeg
2.5 创作者肖像的头像类型探测
在步骤 7 之前,以及任何付费 generate_reference_video 调用之前,运行此探测。它适用于调用者提供的 avatar_url、内置备用头像,或任何被选作 @Image1 的创作者肖像。内置备用头像已经是非 IP 风格化创作者肖像,但仍须在最终摘要中记录其来源。
调用一次 analyze_media:
query: "Classify this image for paid video generation. Is it a photograph of a real human face, an AI-generated realistic portrait, a stylized / illustrated character, or a recognizable trademarked / copyrighted character such as Batman, Pikachu, or Mickey Mouse? Return strict JSON only: { \"avatar_type\": \"real_human\" | \"ai_realistic\" | \"stylized_illustrated\" | \"recognized_ip\", \"recognized_character\": string | null, \"moderation_risk\": \"low\" | \"medium\" | \"high\", \"recommendation\": \"proceed\" | \"warn\" | \"reject\" }. Use null for `recognized_character` when no specific character is recognized; never write \"none\", \"unknown\", or explanatory prose in that field."
根据结果进行分流:
- 识别为 IP / 版权风险 -> 仅在以下情况下停止:
avatar_type为"recognized_ip",或recognized_character指明了某个具体角色(例如"Batman"),或moderation_risk为"high"且recommendation为"reject"。recognized_character: null、空字符串、"none"、"unknown"、"n/a",以及低/中等的moderation_risk,单独出现时都不足以停止。请在真人/风格化分流之前运行此检查。即使 chibi Batman 的avatar_type是 stylized / illustrated,它仍然是 Batman。 - 真人 / AI 生成的写实肖像 -> 正常继续。
- 风格化 / 插画 -> 继续时须明确警告:Kling 可能会接受风格化头像,但 Seedance 审核结果可能不一致;只有在用户提供或接受该头像后才能继续。
- 商标 / 版权保护角色 -> 生成前停止。显示以下消息:
The avatar appears to be a trademarked character ([X]). Most video providers will moderate this and refuse to generate. Pass avatar_url=<real-looking-photo-url> to override.
3. 捕获产品截图(尽力而为)
调用 capture_website,并设置 mode: "screenshot"。对于手持产品类别(APP / FITNESS / BEAUTY),使用 mobile=true,以便捕获的页面以手机竖屏形式呈现;对于桌面场景类别(HAUL / TECH / FOOD),使用 mobile=false。
如果调用失败(超时、浏览器池不可用),重试一次。如果仍然失败,则不使用截图继续操作——此技能会降级,但仍可正常运行。此时,特写镜头仅根据文字描述页面,且 Beat 2 的 reference_images 仅为 [avatar_url]。
捕获 URL → screenshot_url(或 null)。
4. 撰写提示词
完整提示词是一个多节拍字符串,通过一次 generate_reference_video 调用传入。使用结构化叙述文字(不要用 Markdown 项目符号)。每个节拍都有一行 Says: "...",用于口型同步。整支 15 秒广告的目标语速约为每秒 5.5–6 个词(总计约 85–90 个词)。@Image1 是头像,@Image2 是可用时的截图。
所有 Says: "..." 行都必须使用第 1 步的 WebFetch 检测到的语言。 seedance 和 kling 都支持多语言口型同步;如果产品页面是中文、日语、西班牙语等,对白也应使用对应语言。第 5 步中的开场钩子类型与语言无关——请根据该语言的自然语体调整修辞方式。
**规格依据规则:**禁止编造数字。任何口播或视觉呈现的数字/单位声明都必须在 claims_allowlist 中逐字出现。如果某个数字不在 claims_allowlist 中,就将台词改写为定性描述(例如“充电很快”“多个接口”“大容量电池”),或省略该声明。除非来源明确支持该声明,否则不要说“28 分钟充至 50%”“3 个接口”“140W”、价格、数量或时间范围。
**品牌/规格文字呈现规则:**不要要求 Seedance 或视频模型根据叙述文字呈现品牌字标、产品字标、包装标签或规格文字。视频模型生成的文字会乱码。提示词可以将 @Image2 作为参考,但任何必须清晰可读的新品牌名称或规格文案,都应在稍后的确定性步骤 8 中添加为叠加层。
HOOK (0–3 sec) <visual setting + creator framing + face/body cue>. Says to camera, fast and energetic: "<hook line>". <style anchor — POV handheld, authentic, raw>.
JUMP CUT 1 (3–6 sec) <wide POV — creator's body language, product partially in frame edge>. <face cue>, says fast: "<setup line>".
JUMP CUT 2 (6–9 sec) <next visual beat — could be the screen close-up showing @Image2 OR another reaction beat, depending on which beat the dialogue arc puts the reveal>. Says (or voice continues over the shot if it's a screen close-up), fast and confident: "<reveal line>".
JUMP CUT 3 (9–12 sec) <next visual beat — same logic; one of the JUMP CUTs is the screen close-up, the others are wide-POV reaction shots>. Says, fast: "<insight twist line>".
OUTRO (12–15 sec) <selfie POV, mid-chest framing, same setting>. Says to camera, fast: "<punchline line>".
avatar is image 1, asset is image 2
屏幕特写节拍——全片恰好一次,位置由对白决定:
- 将屏幕特写放在揭示台词落在的那个 JUMP CUT(1、2 或 3)上。大多数广告会将其放在 JUMP CUT 2;如果叙事需要,也可以放在 JUMP CUT 1 或 JUMP CUT 3。根据内容选择,不要根据序号选择。
- 屏幕特写节拍须原样展示
@Image2,并包含一个指向手势(单根手指从画面边缘伸入,指向核心文字或产品——不可点击、滑动、滚动,也不可悬停在 CTA 上)。指向手势是全片唯一的屏幕互动。 - 其他 JUMP CUT 都是广角 POV 反应节拍:双手保持放在膝盖上、床上或身体两侧。
信任 @Image2——展示产品页面时,请引用图片;不要用叙述文字描述其 UI。描述 UI 会导致模型虚构额外的面板/下拉菜单/侧边栏/动画。引用图片;相信它。
5. 类别精髓
每种精髓都是撰写 5 个节拍前要阅读的简报。从第 1 步的类别中选择一种,并据此撰写贴合真实产品的 Says: "..." 行。
**类别数字限制:**类别原型用于指导修辞和镜头,不代表可以编造日期、时长、数量、折扣、费用、评分、充电时间、接口数量、输出数值或紧迫时限。除非 claims_allowlist 中有完全一致的声明,否则任何数字表达都必须改写。若 claims_allowlist 中没有匹配的数字,请使用非数字表达,例如“使用之后”“在日常流程中”“有来源支持的规格”“上市优惠”或“现已推出”。
HAUL_UNBOX
- 适用场景与原因:时尚、手袋、珠宝、鞋履、设计师新品、街头服饰、带有包装故事的奢华化妆品、配饰——凡是品牌包装和质感/材质就是价值卖点的产品都适用。观众会因身临其境的拆箱快感和“我刚买到这个”的社交证明而下单;顾客付钱买的正是质感和五金,因此特写应聚焦材质,而非功能。不要用于 TECH(→ TECH_UNBOX)或护肤/化妆品上脸场景(→ BEAUTY_APPLY)。
- 感官锚点:薄纸窸窣声、面料滑动声、五金碰撞声(链条/扣环/搭扣)、指尖下的皮革/织物纹理、烫金闪光。
- 场景:自然窗光下凌乱的白色床铺;结尾展示时,背景中出现浴室镜子;街头服饰新品也可以在桌面/地板上展示。
- 特写节拍设计:不是屏幕,而是产品特写。
@Image2是产品照片(或品牌网站的手机版视图);手指轻点一次五金细节(链条、扣环、压印徽标)。 - 对话风格:开场采用神秘预告——把拆箱描述成观众还不知道里面装着什么;开场台词中不要说出产品名称。叙事弧线:以拆箱之谜开场 → 说出品牌名称和新品背景 → 揭示材质/廓形,同时特写聚焦五金 → 分享触感/穿戴体验(上身是什么感觉)→ 用一句妙语让观众想象自己拥有这件单品。
APP_REVEAL
- 适用场景与原因:SaaS、AI 工具、移动/网页应用、Agent 类产品、开发者工具、效率工具——凡是屏幕本身就是产品的场景都适用。观众看到实时 UI 快速完成任务时更容易下单;特写节拍就是演示,开场和结尾则提供社交证明。不要用于纯硬件(→ TECH_UNBOX)。
- 感官锚点:拇指轻微滑动、品牌色高亮、带有细微动态效果的 UI、房间环境音。
- 场景:舒适的卧室或沙发第一视角;画面边缘露出牛仔裤/运动裤;温暖的窗光。
- 特写节拍设计:床上的笔记本电脑(桌面截图),或手中的手机(移动端截图——在第 3 步中设置
mobile=true)。 - 对话风格:开场采用困惑又好奇的语气——创作者还不知道该如何归类这个东西,这正是重点。开场不要使用功能列表或营销话术;要采用“我不知道该怎么称呼这个”/“这也太神奇了”这样的语气,让观众等着听它的名字。叙事弧线:以困惑的开场引发好奇 → 用通俗说法说出产品名称和交互方式(“你只要跟它说话”“它能用 Y 构建出 X”)→ 说出它能生成什么(用逗号分隔的具体示例),同时特写展示页面 → 加入个人洞察式转折(它取代了什么/如何改变用户的工作流)→ 用一句妙语收尾,并隐含或明确邀请观众“去试试”。
FOOD_ASMR
- 适用场景与原因:食品品牌、饮料、厨房工具、零食、餐厅外带产品——凡是感官高潮(倾倒/滋滋声/蒸汽/第一口)承载价值卖点的产品都适用。观众会因饥饿感而下单——展示感官高潮,不要用语言描述。
- 感官锚点:包装窸窣声、刀切砧板声、滋滋声、倾倒的液流、升腾的蒸汽、咬下第一口时满足的呼气声。
- 场景:大理石台面或温暖的木质厨房,俯拍构图。
- 特写节拍设计:特写产品/菜品,而非屏幕;只有品牌提供外卖/食谱应用时,才在台面上手持手机。
- 对话风格:开场采用展示而不讲述的方式——把内容呈现为观众眼前正在展开的演示,而非一段描述。手部动作或第一个食材已经开始移动时,说出开场台词;画面本身引发好奇。叙事弧线:以演示开场 → 说出产品名称和第一印象 → 随着过程发生,讲述感官高潮(倾倒/滋滋声/蒸汽)→ 分享满足感受(“这是我现在的首选”)→ 用一句妙语收尾,并引导观众查看食谱或购物链接。
BEAUTY_APPLY
- 适用场景与原因:护肤、彩妆、化妆品、香水、护发产品、身体护理——凡是以使用前后对比和使用仪式感为价值主张的产品。观众会因匹配光线下的视觉变化而转化;开场和结尾的对称呈现能让效果看起来真实可信。非以包装为主打的奢侈品(→ HAUL_UNBOX)。
- 感官锚点:按压泵头、挤出产品、涂抹肌肤、提亮光泽、液滴凝珠、刷子扫过。
- 场景:浴室镜前、自然日光或梳妆台灯光;开场和结尾使用相同角度。
- 特写节奏点:产品特写(手持的瓶子/软管/粉盒),而不是屏幕。
- 对话风格:开场采用日常使用的社会认同——通过日常流程中的具体时刻,传达真实使用感,而非编造使用时长。开场埋下呼应结尾效果的伏笔。叙事节奏:日常使用开场 → 产品名称 + 有来源依据的关键成分或宣称 → 随着使用过程进行旁白(特写展示手指/刷子涂抹肌肤)→ 展示使用后效果(与开场角度相同)→ 用体现独特性或复购意愿的点睛之语收尾。
FITNESS_TRANSFORM
- 适用场景与原因:健身器材、补剂、恢复工具、运动服、带追踪功能的健身应用——凡是以努力到成果的转变为价值主张的产品。观众会因共鸣感十足的挣扎以及努力得来的成果而转化——光展示蛋白奶昔瓶还不够,必须展示训练过程。
- 感官锚点:沉重的呼吸声、粉勺碰到粉末、器材咔嗒声、汗水映着光、训练后的呼气。
- 场景:健身房或家庭健身房;画面边缘出现健身装备;地面或长凳高度。
- 特写节奏点:手持手机展示应用统计数据/心率/已用时间,或产品包装特写(罐中的粉勺、倾倒瓶子)。
- 对话风格:开场采用令人共鸣的抗拒感——说出挣扎/阻力/不想做这件事的心情(“我真的不想做这个”,“今天差点就跳过了”,“今天本来应该是休息日”);先分享疲惫感,再展示训练过程,以此赢得信任。叙事节奏:抗拒感开场 → 说出产品名称 + 非数字化的日常习惯或有来源依据的宣称 → 特写展示设备或粉勺,同时旁白描述训练中的时刻 → 分享能赢得信任的满足感与领悟 → 用体现会持续使用的点睛之语收尾。
TECH_UNBOX
- 适用场景与原因:小工具、硬件、电子产品、智能家居设备、可穿戴设备、外设、AI 硬件(Framework 笔记本电脑、AirPods、Whoop、Rabbit r1、Friend 吊坠、机械键盘、人体工学设备)——凡是以设备本身和首次使用体验为价值主张的产品。开箱仪式感能彰显高端定位;观众会想知道“它真的好用吗/它能做什么”,因此首次使用是促成转化的关键时刻。非 HAUL(→ HAUL_UNBOX),也非纯软件/SaaS(→ APP_REVEAL)。
- 感官锚点:美工刀划开包装、撕下塑料膜、抽出泡沫内托、开机提示音、按下实体按键、触觉反馈咔嗒声、风扇启动。
- 场景:开箱时采用木桌和俯拍构图;首次使用时手持拍摄;持续使用时展示桌面/腿上使用情境。
- 特写节奏点:拆箱并开机后的设备本身。
@Image2通常是设备屏幕在关键 UI 时刻的实拍照片(首次测量、已配对状态、打开主要功能);如果设备没有屏幕,则展示设备使用过程中的清晰主视觉照片。 - 对话风格:开场采用开箱到货仪式感——点明此刻正在发生的事(“刚收到这个”,“现在拆开看看”)。期待感胜过描述;开场埋下“它能做什么?”这个问题,并由首次使用环节给出答案。不要一开始就讲规格。叙事节奏:到货开场 → 说出产品名称 +
claims_allowlist中有来源依据的规格亮点;如果没有,则使用定性亮点 → 特写展示设备运作,同时揭晓首次使用体验 → 分享工作流变化带来的领悟(“它替代了/改变了/解决了我的 X”)→ 用指引观众去哪里查看的点睛之语收尾,不要编造价格或紧迫感。
6. 配音——模型默认语音
此技能不支持语音克隆输入;视频模型会使用自己的默认语音生成口语对白。不会获取或传入语音样本。继续执行步骤 7。
7. 生成——首次尝试使用头像,遭拒后转为卡通风格并重试
步骤 2.5 中的头像类型探测通过后,首先尝试调用步骤 2 中解析出的头像(调用方提供的头像或内置备用头像),保持原样。仅当 seedance 拒绝调用时,才调整头像风格。
重试次数上限:Seedance 生成最多进行 2 次视频尝试:7a 中使用原头像渲染一次,7c 中使用卡通化头像重试一次。不要开始第三次 Seedance 渲染。如果第二次尝试失败,则显示 7d 中的消息;仅当用户明确指定 provider=kling 或在停止消息后选择使用 Kling 时,才切换到 Kling。
7a. 首次尝试——头像保持原样
调用 generate_reference_video:
provider:seedance(默认),或用户传入provider=kling时使用klingaspect_ratio:9:16(默认);仅 seedance 允许使用3:4resolution:720p(仅 seedance)duration:15reference_images:[avatar_url, screenshot_url](如果步骤 3 失败,则移除screenshot_url)prompt:步骤 4 中的多段式字符串sound:true(默认——模型生成环境音和唇形同步)
对于 provider=kling:将多段式描述转换为 shots: [{prompt, duration}, ...](5 个镜头 × 3 秒 = 总计 15 秒),并添加概述广告内容的顶层 prompt。参考图使用 <<<image_1>>> / <<<image_2>>>,而非 @Image1 / @Image2。
如果调用返回 { task_id, status: "queued" },则按照上述异步轮询预算调用 task_status(task_id) 进行轮询,直到任务进入终态(completed | failed | cancelled)。若状态为 completed,则获取 result.url → video_url,并继续执行步骤 8。
7b. 遭拒时——自动将头像转为卡通风格
如果 7a 因 image_urls / reference_images 返回 422 content_policy_violation(seedance + fal-queue 的审核会将看起来过于写实的肖像标记出来——即使是某些 Pixar 风格的 3D 头像也可能被标记),则就地调整头像风格:
调用 generate_image_edit:
provider: "seedream"(原生 Pixar/3D 动画风格)images: [avatar_url]aspect_ratio:与广告的宽高比相同resolution: "1K"watermark: false(仅 seedream 支持的参数——确保调整风格后的头像不带服务提供商水印,以便后续重新生成唇形同步视频)prompt: "Stylized 3D game character render — Unreal Engine 5 / Overwatch / Valorant / Apex Legends visual style. Anatomically grounded facial proportions with subtle stylization: slightly larger expressive eyes, defined sculpted cheekbone planes, smooth skin shader (smoother than photoreal, no micropore detail), idealized but believable features. PBR materials with subtle subsurface scattering, strand-based hair simulation, crisp cloth shader. Cinematic three-point studio lighting with strong rim light. Clearly a stylized AAA-game-character render — NOT photorealistic person, NOT Pixar plastic-toy cartoon, NOT exaggerated big-head proportions. Same person, same glasses, same outfit, same accessories. Centered medium portrait, neutral indoor background."
获取返回的 URL → avatar_url_cartoon。
7c. 使用卡通化头像重试 seedance
重新执行 7a 中完全相同的 generate_reference_video 调用,仅替换头像参考图:reference_images: [avatar_url_cartoon, screenshot_url](如果步骤 3 失败,则使用 [avatar_url_cartoon])。其他参数保持不变。获取 result.url → video_url。
7d. 最终备用方案——仍遭拒
如果 7c 也返回 content_policy_violation,则停止。告知用户:即使自动调整了风格,该头像在 seedance 审核看来仍过于写实;请用户自行提供风格化程度更高的肖像,或使用 provider=kling 重新运行(kling 使用独立的审核流程,可接受写实头像)。
8. 确定性的品牌/规格叠加层
在字幕之前,使用确定性的生成后叠加层添加清晰易读的品牌/规格文案。这一步刻意与 Seedance 提示词分开,因为视频模型渲染文本时会破坏品牌字标和规格标签。
根据步骤 1 构建叠加文案:
{
"brand_overlay_text": "<brand_name>",
"grounded_spec_overlay_text": "<one short source-backed claim from claims_allowlist, or empty>",
"overlay_font_color": "#111111 | #ffffff"
}
规则:
brand_overlay_text始终使用 WebFetch 返回的确切brand_name。如果brand_name为空,则使用product_name;不要让模型自行编造徽标/字标。grounded_spec_overlay_text必须为空,或是claims_allowlist中的一条确切声明。绝不要叠加claims_allowlist中不存在的数字。- 选择
overlay_font_color时,应考虑与生成画面的对比度,而非品牌美学。如果截图/产品表面为浅色或不确定,请使用#111111;仅当画面明显较暗时才使用#ffffff。后续 OCR 必须能够读取叠加文案。 - 不要将此步骤用于字幕或逐词字幕;步骤 9 会通过一次
add_captions调用处理字幕。
调用一次 edit_text_overlay 添加品牌名称:
edit_text_overlay(
video_url: video_url,
text: brand_overlay_text,
position: "top_left",
font_size: 54,
font_color: overlay_font_color,
start_s: 0.2,
end_s: 15
)
将返回的 URL 保存为 brand_guarded_url。如果 grounded_spec_overlay_text 不为空,则在 brand_guarded_url 上再调用一次 edit_text_overlay:
edit_text_overlay(
video_url: brand_guarded_url,
text: grounded_spec_overlay_text,
position: "top_right",
font_size: 42,
font_color: overlay_font_color,
start_s: 6,
end_s: 10
)
将返回的 URL 保存为 guarded_video_url。如果无需叠加规格文案,则设置 guarded_video_url = brand_guarded_url。如果任一叠加调用返回 { task_id },请按照长时间运行任务约定轮询 task_status。如果确定性叠加失败,请停止并报告失败情况,不要交付唯一可读的品牌/规格文案依赖 Seedance 的视频。
在添加字幕前,对叠加层进行逐帧 OCR。视频级分析可能会漏掉短暂显示在顶部角落的叠加层,因此请提取一帧,确保两个叠加层都应在画面中可见:
extract_frame(
video_url: guarded_video_url,
time_s: grounded_spec_overlay_text ? 7 : 1
)
# Save returned url as overlay_qa_frame_url
analyze_media(
media: overlay_qa_frame_url,
query: "Expected brand text: ${brand_overlay_text}
Expected spec text: ${grounded_spec_overlay_text}
Return JSON only: { \"visible_text_ocr\": string[], \"brand_visible\": boolean, \"spec_visible\": boolean, \"observations\": string[] }. OCR/read all visible text. brand_visible is true only if the exact expected brand text above is readable. spec_visible is true if expected spec text is empty or the exact expected spec text above is readable."
)
如果 brand_visible 为 false,或 grounded_spec_overlay_text 不为空但 spec_visible 为 false,请停止并使用相反的 overlay_font_color(#111111 ↔ #ffffff)重新渲染一次确定性叠加层。重新提取 overlay_qa_frame_url 并再次运行同一项 OCR 检查。如果重试仍然失败,请停止并报告 overlay_qa_frame_url 和 OCR JSON;不要继续添加字幕。
9. 字幕——一次性样式化烧录(默认开启)
如果请求了 variants,请勿在此步骤调用单输出的 add_captions。让 guarded_video_url 保持无字幕状态,并继续执行宽高比变体,先对每个请求的宽高比重新构图,再添加一次字幕。
如果未提供 variants 且 captions=false,请跳过字幕生成,并设置 final_url = guarded_video_url。否则,使用一次 add_captions 调用,而不是按片段串联调用 edit_text_overlay——速度快得多(单次调用 ≤5 分钟,顺序调用需 5–8 分钟),而且样式开箱即用,字幕位置恰当。
调用 add_captions:
video_url:步骤 8 中的guarded_video_urlstyle:"tiktok"(默认——逐词紫色高亮、Bebas Neue、全大写,渲染在画面底部;经典 TikTok 创作者风格,确保人脸和屏幕清晰可见)。可选项:"hormozi"(中下部黄色高亮,风格更强烈——会覆盖部分手持手机的特写片段)、"classic"(底部普通字幕栏,最稳妥)、"karaoke"(渐进式颜色填充,也位于底部)。font_size:60——覆盖各样式的默认值;针对 9:16 画面可读性调校,同时避免字幕过于抢眼。language:传入步骤 1 检测到的页面语言的 BCP-47 代码("en"、"zh"、"ja"、"es"等)——跳过自动检测,避免 CJK 字符被错误地导向仅支持拉丁字符的字体路径。
将返回的 URL 保存为 final_url。
宽高比变体
如果用户希望从同一条 UGC 广告生成竖屏短视频、横屏和方形信息流版本,请使用可选参数 variants=9:16,16:9,1:1。variants 会将 aspect_ratio 覆盖为原生 9:16;aspect_ratio=3:4 仅适用于单条输出,不得与 variants 组合使用。如果用户同时请求 variants 和 aspect_ratio=3:4,请使用原生 9:16 变体流程,并说明 3:4 仅适用于单条输出。
调用一次 generate_reference_video,生成原生 9:16 广告,然后运行一次步骤 8 的确定性叠加处理,生成 guarded_video_url。不要为了额外变体重新运行产品获取、头像分析、屏幕截图、头像卡通化、Seedance/Kling 生成、确定性叠加处理或任何其他成本高昂的提供方调用。
不要运行步骤 9 中用于单条输出的 add_captions 调用。先构建原始 variant_sources,再构建扁平的 variant_urls 对象:
{
"9:16": "<native final_url>",
"16:9": "<edit_reframe url>",
"1:1": "<edit_reframe url>"
}
- 对于
9:16,设置variant_sources["9:16"] = guarded_video_url。 - 对于
16:9和1:1,调用edit_reframe(video_url=guarded_video_url, target_aspect="<aspect>", fill_mode="blur"),并将每个返回的 URL 保存到variant_sources。模糊填充会在模糊背景上保留完整的原生竖屏广告,而不是裁掉创作者或字幕。 - 如果
captions=true,请在重新构图后添加字幕:对每个variant_sources值运行add_captions,以便烧录字幕适配相应宽高比,然后将添加了字幕的 URL 保存到variant_urls。如果captions=false,请将未添加字幕的原生版本和重新构图版本 URL 直接保存到variant_urls。 - 设置
final_url = variant_urls["9:16"],使主要交付内容与请求的原生变体一致。 - 将
edit_reframe和各变体的字幕烧录视为成本较低的最终合成/重新构图阶段。如果重新构图失败,请返回成功的变体 URL,以及失败的宽高比和工具错误;不要重新提交成本高昂的生成任务。
请注意——变体使用模糊填充。
16:9和1:1会在模糊背景上保留完整的原生9:16广告。请让创作者、产品和字幕保持居中,以便清晰阅读,但不要将这些输出描述为裁剪后的变体。
10. 返回结果
单独一行返回 final_url,并附上一行摘要:说明运行的类别、头像是调用方提供/内置回退/卡通化恢复、使用了屏幕截图还是回退到文本描述、选择的提供方、检测到的对白语言,以及是否烧录了字幕。如果请求了 variants,请在同一响应中包含扁平的 variant_urls 对象。
生成后质量门槛
在宣布成功前,如果已烧录字幕,请对 final_url 调用 analyze_media;如果 captions=false,则对 guarded_video_url 调用,并要求返回结构化判定。如果请求了 variants,请对每个 variant_urls 值运行相同的质量检查,并按宽高比标注任何警告。
调用 analyze_media 之前,请在查询中填入具体预期:包含准确的 brand_name、准确的 product_name,以及作为 JSON 数组的实际 claims_allowlist 值。不要留下让模型自行推断的占位符。
Expected brand: ${brand_name}
Expected product: ${product_name}
Allowed numeric/spec claims: ${JSON.stringify(claims_allowlist)}
Return JSON only: {
"verdict": "clean" | "degraded" | "catastrophic",
"visible_text_ocr": string[],
"unauthorized_numeric_claims": string[],
"observations": string[],
"quality_warning": string | null,
"re_roll_suggestion": string | null
}
OCR / read all visible text. Use the concrete expected values above when checking that `brand_name` and `product_name` are spelled correctly anywhere they appear, deterministic brand/spec overlays are legible, captions are present when requested and not garbled, and no visible numeric claim appears unless it exactly matches one of the actual `claims_allowlist` values above. Also check that the avatar / creator remains visually stable, the product screenshot or prose fallback matches the product page, and there are no black frames or wrong-product shots.
- 如果
verdict为clean,则正常返回final_url。 - 如果
verdict为degraded,则返回final_url和quality_warning,供用户在发布前检查。 - 如果
verdict为catastrophic,如果visible_text_ocr包含乱码的品牌/规格文本,如果brand_name拼写错误,或者unauthorized_numeric_claims包含任何不在claims_allowlist中的声明,则不要将广告视为已完成;应显示判定结果和re_roll_suggestion,而不是宣布成功。
失败模式
| 症状 | 可能原因 | 处理方法 |
|---|---|---|
| 无法抓取或截取产品页面 | 页面设有访问限制、遭到屏蔽,或产品相关证据过少 | 仅在调用方提供的产品信息明确时使用;否则停止并请求提供产品摘要或更合适的 URL。 |
| 头像预检发现可识别的知识产权形象、不安全的相似 likeness,或无法使用的面部取景 | 提供的创作者图片不适合付费生成 | 在付费生成前停止并请求提供更安全的创作者图片;如果调用方未提供头像,则改用内置的风格化创作者形象。 |
生成图片或视频时,服务提供方返回 4xx 或 moderation_blocked | 提示词、源图片或产品内容被确定性地拒绝 | 不要使用相同的载荷重试。移除被拒绝的输入;仅当该阶段有文档说明的备用服务提供方时,才切换到该提供方。 |
| 一次颜色重试后,确定性的叠加文字 OCR 仍然失败 | 品牌/规格文案仍不可读 | 使用 overlay_qa_frame_url 和 OCR JSON 停止;不要继续生成字幕或最终交付内容。 |
| 变体重新取景或逐变体烧录字幕失败 | 昂贵的原生广告已成功生成,但后续低成本的最终合成步骤失败 | 返回已成功的变体以及失败的宽高比/工具错误;不要重新抓取产品、准备头像或生成视频。 |
关键短语
这些锚点可以防止广告偏离方向,变成泛泛的产品演示:
| 短语 | 位置 | 关键原因 |
|---|---|---|
HOOK + 3 JUMP CUTs + OUTRO | 提示词骨架 | 强制采用 TikTok 风格的多次剪辑节奏,而不是连续不断的讲解者镜头。 |
Every beat has a Says: "..." line | 提示词骨架 | 为视频引擎的所有节拍提供明确的唇形同步素材。 |
Trust @Image2 | 屏幕特写规则 | 当已提供真实截图时,防止虚构产品界面。 |
exactly one 屏幕特写节拍 | 提示词构成 | 避免广告变成屏幕录制,而不是创作者风格的展示。 |
Write all Says lines in the language detected from step 1 | 对白规则 | 避免默认将本地化产品页面配上英语对白。 |
forbid inventing numbers | 提示词依据 | 防止没有依据的规格声明出现在旁白或叠加文字中。 |
Deterministic brand/spec overlays | 步骤 8 | 避免依赖视频模型渲染可读的品牌名称和规格文案。 |
single add_captions call | 字幕步骤 | 避免连续叠加文字造成质量下降和内容偏移。 |
示例
/pika:ugc-ads https://pika.me avatar_url=https://cdn/face.png→ APP_REVEAL,9:16,seedance,真实截图,开启字幕/pika:ugc-ads https://maisonbrune.com avatar_url=https://cdn/face.png aspect_ratio=3:4→ HAUL_UNBOX,3:4,seedance/pika:ugc-ads https://pika.me avatar_url=https://cdn/face.png provider=kling captions=false→ APP_REVEAL,9:16,kling shots[],无字幕/pika:ugc-ads https://pika.me→ 无avatar_url→ 使用内置的 Pixar 风格女性创作者头像,全流程运行