scenario-ugc

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Scenario UGC Creator Video

Scenario UGC创作者视频

Overview

概述

UGC is a register, not a length: content that reads as a person talking into their own phone, not a brand talking through a camera crew. Everything in this skill serves that register, and most failures come from importing ad craft into it. This skill routes the production; mechanics live in the sibling skills named per lane. Connection and the core loop: see the
scenario
skill in this repo. If a sibling skill named here is missing from your available skills, ask the user to install it (
npx skills add scenario-labs/skills --skill <name>
); unattended, proceed from tool schemas and flag the gap.
Two rules are non-negotiable. The product is never generated: demo shots start from an uploaded photo or footage of the real product (
scenario-product-shots
for stills). And the words are never invented: no fabricated testimonials, review counts, metrics, medical or financial claims, or legal copy; speak only lines the user supplied or approved, and prefer observable statements ("the texture looks lighter") over claims ("this cures acne").
UGC是一种风格调性,而非时长规格:它是普通人对着自己手机说话的内容感,而非品牌通过摄制团队输出的官方感。本技能的所有内容都服务于这一调性,大多数失败案例都是因为把广告制作的思路套了进来。本技能负责生产流程的调度,具体操作细节在按赛道命名的配套技能中。核心逻辑与闭环:参见本仓库中的
scenario
技能。如果此处提到的某个配套技能不在你的可用技能列表中,请让用户安装它(
npx skills add scenario-labs/skills --skill <name>
);若处于无人值守模式,则根据工具schema继续执行,并标注缺失的技能。
两条铁则不容商榷:产品绝对不能生成:演示镜头必须基于上传的真实产品照片或视频素材(静态图参见
scenario-product-shots
)。台词绝对不能编造:不得虚构用户证言、评论数量、数据指标、医疗或财务功效声明,以及法律相关文案;只能使用用户提供或认可的台词,优先使用可观察的表述("质地看起来更轻薄")而非功效断言("这个能治愈痤疮")。

Quick reference: route by speaker lane

快速参考:按说话者赛道分流

Discover members with
recommend
, passing the lane's capability and the user's own words: it ranks by measured cost and latency and names the purpose-built pick, where a capability-worded
search
returns hundreds of keyword hits with nothing to choose between them. Read
next_step
before taking a pick, per the
scenario
skill. Keep
search
for a member you can already name. Never assert a generative model's id as a constant. Scenario's own single-purpose tool models are named outright below: there is exactly one of each, so discovering them would only re-derive a constant.
LaneRouteContract
Portrait plus speech audioTalking-avatar members (
img2video
)
scenario-kling
Existing footage, new wordsLipsync members (
video2video
), audio or
text
, never both
scenario-kling
Recorded delivery, different faceMotion-control members (
video2video
, say "motion control" in the
recommend
prompt or lipsync members come back): character still plus the recording as driving
video
,
keepOriginalSound
keeps the voice; output lands at the member's own size, the still lending only its orientation
scenario-kling
Generated creator speaking nativelyNative-audio video families (
txt2video
), dialogue in quotes with the delivery named (pace, tone, one gesture)
scenario-veo
,
scenario-seedance
,
scenario-kling
Faceless voiceoverB-roll clips (
txt2video
) plus TTS narration (
txt2audio
)
scenario-video
,
scenario-elevenlabs
Product demo insertsImage-to-video off the uploaded product still
scenario-product-shots
,
scenario-video
Captions, cut, 9:16 masterAssembly tool models; text cards as image layers
scenario-video-assembly
,
scenario-text-overlay
Script in six spoken beats: hook (one concrete tension or result), context (why this speaker cares), product moment, proof (visible demo or a user-supplied fact), turn (objection answered or before-after), close (soft CTA). Write for the mouth, not the page: contractions, false starts allowed, no taglines. Spoken pace runs near 2.5 words a second, so a 25-second ad is roughly 60 words, but that is a first guess and avatar members undershoot it: observed rates run 1.76 to 1.94 words a second, and one member padded a 60-word script with 21s of silence instead. Time the returned clip before assembling, then trim the silences where there are any and cut the script where the delivery is simply slow. The compositor has no cut inside a layer, so a trim is one layer per kept segment, each with its own
trimStart
and
duration
.
Keep the register in every visual prompt: phone-height framing, available light, a real location with clutter, natural skin texture, one handheld drift at most. Cinematic grammar (dolly moves, golden-hour rim light, shallow anamorphic looks, graded color, retouched skin) reads as an ad and kills belief. Compose 9:16 natively, reframing any non-vertical still a lane consumes (the avatar portrait, a motion-control character still, the product photo) per
scenario-formats
before generating; a cropped 16:9 master frames like television.
使用
recommend
发现模型,传入对应赛道的能力和用户的原话描述:它会根据实测成本和延迟排序,给出专门适配的选项,而用能力关键词进行
search
会返回数百个结果,无法区分优劣。按照
scenario
技能的要求,选择前先阅读
next_step
。
search
仅用于你已经知道具体名称的模型。绝对不要把生成模型的ID当作常量硬编码。Scenario自家的单用途工具模型会在下面直接列出:每个类型只有一个,所以去发现它们只是多此一举。
赛道分流路径对应技能
人像+语音音频口播Avatar模型(
img2video
)
scenario-kling
已有视频素材,更换台词Lipsync模型(
video2video
),输入音频或
文本
,二选一不可同时提供
scenario-kling
已有录制口播,更换人物形象动作控制模型(
video2video
,在
recommend
提示词中说明"motion control",否则会返回Lipsync模型):输入人物静态照+作为驱动
视频
的口播录制素材,开启
keepOriginalSound
保留原声;输出分辨率由模型自身决定,静态照仅决定画面方向
scenario-kling
原生生成创作者口播原生音频视频类模型(
txt2video
),对话内容加引号,并说明表达风格(语速、语气、单个手势)
scenario-veo
,
scenario-seedance
,
scenario-kling
无脸旁白B-roll片段(
txt2video
)+ TTS旁白(
txt2audio
)
scenario-video
,
scenario-elevenlabs
产品演示插入片段基于上传的产品静态照生成图生视频
scenario-product-shots
,
scenario-video
字幕、剪辑、9:16母版剪辑合成工具模型;文本卡片作为图像层添加
scenario-video-assembly
,
scenario-text-overlay
脚本分为六个口播节拍:钩子(一个具体的冲突点或效果展示)、背景(讲述者为什么关注这件事)、产品出场、证明(可视化演示或用户提供的事实)、转折(回应质疑或前后对比)、收尾(软CTA)。要为口播写脚本,而非书面文案:允许使用缩略表达、卡壳起句等自然口语瑕疵,不要口号标语。口播语速约为每秒2.5个词,因此25秒的广告大概是60个词,但这只是初步估算,Avatar模型的语速会更慢:实测语速为每秒1.76到1.94个词,甚至有模型会给60词的脚本填充21秒的空白。合成前先给返回的视频计时,剪掉所有空白片段,语速过慢的地方直接删减脚本。合成器不支持图层内部裁剪,因此每保留一段片段就要对应一个图层,每个图层单独设置
trimStart
和
duration
参数。
所有视觉提示词都要保持UGC的风格调性:手机高度的取景、自然光、有杂物的真实场景、自然皮肤纹理,最多允许一处手持晃动的镜头感。电影化手法(推拉镜头、黄金时段轮廓光、浅景深变形宽银幕效果、调色、磨皮)会显得像广告,破坏真实感。直接原生制作9:16比例的内容,所有赛道用到的非竖屏静态素材(Avatar人像、动作控制人物静态照、产品照片)都要在生成前按照
scenario-formats
规范重新构图;裁剪16:9的横屏母版会显得像电视画面,缺乏手机感。

Worked example: 25-second founder ad from a portrait

实操示例:基于人像制作25秒创始人广告

  1. Brief once: offer, platform, runtime, the facts the founder may claim, tone. Collect the portrait and the real product photo, then run without stopping.
  2. Create this run's collection before the first generation (
    collection_create
    , catalog write lane,
    name
    only), then
    collection_add_assets
    each keeper as it lands; its returned
    itemCount
    is the receipt.
  3. Draft the six beats at about 60 words and confirm the wording with the user; the script is a claims surface, not just copy. Unattended, keep every line to wording the brief already supplied and cut any beat that would need a new claim.
  4. Voice:
    upload_asset
    the founder's recorded narration, or generate TTS per
    scenario-elevenlabs
    when they want a stand-in voice they approved.
  5. recommend
    with
    capability="img2video"
    and the brief in the user's words; pick from its ranked list by input contract (a script-taking member when the speech exists only as text, an audio-taking one when a recording exists), then by whether the member can be told not to burn in captions: some hallucinate gibberish subtitles that no negative prompt suppresses, and the ones with a switch cost several times more, which
    recommend
    prices for you.
  6. upload_asset
    the portrait. Prompt the speaker's hands empty and the set free of products: avatar members invent props and label type.
    model_run
    with
    dry_run=true
    first: avatar members sit far apart on price, so quote before spending.
  7. Run for real with
    wait=false
    , then
    jobs_wait
    with the returned job id, re-called with
    pending_job_ids
    on timeout, never a second
    model_run
    .
  8. Demo insert: animate the uploaded product photo with an image-to-video member (
    scenario-video
    ), 3 to 5 seconds, one micro-move. Whether
    aspectRatio
    survives a start image is per member and the schema note can be wrong either way, so read
    width
    and
    height
    off the returned asset rather than assuming the ratio held.
  9. Assemble with
    model_scenario-compose-video
    per
    scenario-video-assembly
    : talking head as the spine, insert cut over beats three and four, product-name card from
    scenario-text-overlay
    as an image layer, dropped outright when no approved product name exists, since inventing one is the fabrication the brief forbids. Every overlay layer needs an explicit
    width
    and
    height
    or the compositor scales it, and
    durationMode: "custom"
    pins the master's length against image layers that would stretch it. A succeeded compose job is not proof the layers drew or landed where sent: pull a frame from the composite and confirm the card is present and placed before delivering. Captions come last, on the finished cut, from the captioner
    scenario-video-assembly
    discovers with
    recommend
    (two exist, so no fixed id), positioned inside the platform's safe zone: the compositor has no text layer.
  10. asset_display
    the master. Gate every generated clip, the talking head included: take the frames from the platform, the free
    firstFrame
    and
    lastFrame
    off
    asset_get
    first and
    model_scenario-video-to-image-seq
    when a mid-clip frame is what settles it, then verify them against the uploads (
    scenario-asset-analysis
    ); a local extraction is not a substitute at any budget, because it yields no asset to file or audit and the gate stops being traceable; an invented product in the speaker's hands or legible generated type fails a clip exactly like label drift on the insert. Report spend by summing this run's own job records by job id:
    jobs_list
    is project-scoped and over-reports, and
    usage
    's headline figure is project-lifetime.
  1. 一次性收集需求:优惠信息、发布平台、视频时长、创始人可声明的事实内容、语气风格。收集人像照和真实产品照片,然后一气呵成完成制作。
  2. 首次生成前创建本次运行的素材集(
    collection_create
    ,目录写入赛道,仅传
    name
    参数),每生成一个可用素材就用
    collection_add_assets
    添加;返回的
    itemCount
    就是操作凭证。
  3. 按照六个节拍起草约60词的脚本,并和用户确认措辞;脚本是声明的载体,不只是文案。如果是无人值守模式,所有台词都必须严格使用需求中已提供的措辞,任何需要新增声明的节拍都直接删掉。
  4. 配音:
    upload_asset
    上传创始人录制好的旁白,如果用户需要经其认可的替代配音,则使用
    scenario-elevenlabs
    生成TTS语音。
  5. 调用
    recommend
    接口,传入
    capability="img2video"
    和用户原话描述的需求;从返回的排序列表中选择模型,首先看输入契约(如果只有文本台词就选支持文本输入的模型,如果有录制好的音频就选支持音频输入的模型),其次看模型是否支持关闭烧录字幕:有些模型会生成乱码字幕,负面提示词也无法抑制,而支持关闭字幕的模型价格要高出好几倍,
    recommend
    会帮你标注价格。
  6. upload_asset
    上传人像照。提示词中要说明说话者双手为空、场景中没有产品:Avatar模型会凭空生成道具和文字标签。先调用
    model_run
    并设置
    dry_run=true
    :不同Avatar模型的价格差异很大,所以要先报价再实际生成。
  7. 正式运行时设置
    wait=false
    ,然后用返回的任务ID调用
    jobs_wait
    ,超时的话用
    pending_job_ids
    重新调用,绝对不要重复调用
    model_run
    。
  8. 演示插入片段:用图生视频模型(
    scenario-video
    )给上传的产品照片添加动态效果,时长3-5秒,仅做一个微小动作。
    aspectRatio
    参数是否会被起始图片覆盖取决于具体模型,接口文档的说明可能不准,所以要从返回的素材中读取实际的
    width
    和
    height
    ,不要假设比例保持不变。
  9. 按照
    scenario-video-assembly
    规范调用
    model_scenario-compose-video
    进行合成:以口播视频为主干,在第三和第四个节拍处插入演示片段,用
    scenario-text-overlay
    生成的产品名称卡片作为图像层添加;如果没有经过认可的产品名称就直接去掉卡片,因为编造产品名属于需求禁止的虚构内容。每个叠加层都必须明确设置
    width
    和
    height
    ,否则合成器会自动缩放;设置
    durationMode: "custom"
    可以固定母版时长,避免被图像层拉长。合成任务成功不代表图层都正确渲染或位置正确:交付前要从合成视频中抽一帧,确认卡片存在且位置正确。字幕最后加,在成品剪辑上添加,字幕工具由
    scenario-video-assembly
    通过
    recommend
    发现(有两个可选,所以没有固定ID),字幕位置要在平台的安全区内:合成器没有文本图层。
  10. 调用
    asset_display
    展示母版视频。所有生成的片段(包括口播视频)都要经过审核:先从平台获取帧,先用
    asset_get
    接口免费获取
    firstFrame
    和
    lastFrame
    ,如果需要中间帧来确认就调用
    model_scenario-video-to-image-seq
    ,然后对照上传的原始素材进行验证(
    scenario-asset-analysis
    );任何预算下都不能用本地抽帧代替,因为本地抽帧不会生成可归档或审计的素材,审核过程也无法追溯;如果说话者手里出现了凭空生成的产品,或者有清晰的生成文字,该片段直接不合格,和插入片段的标签偏移问题一样严重。费用统计要按任务ID汇总本次运行的所有任务记录:
    jobs_list
    是项目级的,会多统计,而
    usage
    的总数据是项目全生命周期的。

Common mistakes

常见错误

  • Writing ad copy and handing it to a mouth: alliterative taglines collapse on a talking head; read the script aloud before generating.
  • Fabricating social proof: an invented "10,000 five-star reviews" is a claim the user never made; keep numbers and testimonials to supplied wording.
  • Prompting the creator like a commercial: tripod framing, perfect light, and a spotless studio kitchen read as an ad; imperfection is the format.
  • Passing both audio and
    text
    to a lipsync member: exclusive inputs; pick one.
  • Skipping
    dry_run
    on avatar and lipsync runs: per-member pricing varies too widely to guess.
  • Generating the product or any on-screen text: the product comes from the uploaded photo, type is overlaid in assembly. Native-speech members can caption the quoted line, and those captions collide with the ones the captioner places in the safe zone, so end every dialogue prompt with "no subtitles, no on-screen text". There the line is the only lever and costs nothing, and it is not a guarantee (one native-speech member captioned anyway at authoring time), so pull a frame before compositing; avatar members can hallucinate subtitles no prompt suppresses, which is why step 5 prices their caption switch.
  • One 40-second b-roll or generated-creator take: generate per-beat clips and cut on the beat turns; single long takes drift and cost more to retry. A talking-head script stays one take, trimmed in assembly.
  • Cropping a landscape master to 9:16: heads and captions land outside the safe zone; compose vertical from the start.
  • 写广告文案然后直接让数字人口播:押头韵的口号标语在口播里会非常违和;生成前一定要大声读一遍脚本。
  • 编造社交证明:虚构的"10,000条五星好评"是用户从未提过的声明;所有数字和证言都必须严格使用提供的措辞。
  • 把创作者提示词写得像商业广告:三脚架取景、完美光线、一尘不染的工作室厨房会显得像广告;不完美才是UGC的精髓。
  • 同时给Lipsync模型传入音频和
    文本
    :这两个输入是互斥的,只能选一个。
  • Avatar和Lipsync任务跳过
    dry_run
    :不同模型的定价差异极大,不能凭猜测。
  • 生成产品或任何屏幕文字:产品必须来自上传的照片,文字要在合成阶段叠加。原生语音模型可能会给台词加字幕,这些字幕会和字幕工具在安全区添加的字幕冲突,所以每个对话提示词的结尾都要加上"no subtitles, no on-screen text"。这句话是唯一的控制手段,而且没有成本,但也不是百分百有效(有一个原生语音模型即使加了提示还是会生成字幕),所以合成前一定要抽帧检查;Avatar模型可能会生成任何提示词都抑制不了的乱码字幕,这也是步骤5里要考虑字幕开关价格的原因。
  • 一次性生成40秒的b-roll或创作者视频:应该按节拍生成片段,在节拍转换处剪辑;单条长镜头容易出现内容偏移,重试成本也更高。口播脚本可以用单条长镜头,在合成阶段裁剪即可。
  • 把横屏母版裁剪成9:16:人脸和字幕会落到安全区之外;从一开始就按竖屏构图。