ugc-testimonial
UGC 口播种草视频。商品 + 人设 → 口播脚本与成片,达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。
Install
npx skills add https://github.com/dlazy-ai/ecommerce-skills/tree/main/skills/ugc-testimonial
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install dlazy-ai-ecommerce-skills@llmmart
git clone https://github.com/dlazy-ai/ecommerce-skills.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole dlazy-ai/ecommerce-skills collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
ugc-testimonial — UGC 口播种草
投流素材里转化最好的一类往往不是精致广告,而是看起来像真人随手拍的推荐。
这个技能生成那种质感:手持、家里的光、说人话。
一、能力边界
| 能做 | 说明 |
|---|---|
| 口播脚本 | 商品 + 人设 → 一段能照着念的话 |
| 分镜 | 口播镜头 + 商品特写的交替结构 |
| UGC 质感 | 手持轻晃、室内自然光、非专业构图 |
| 多人设 | 同一商品换人设出多版做 A/B |
| 不能做 | 说明 |
|---|---|
| 对口型 | 生成模型做不好唇形同步,成片建议配旁白而不是同期声 |
| 冒充真人 | 不要声称是真实买家评价,见下方「合规」 |
二、合规先说
UGC 风格 ≠ 伪造评价。生成的内容不能声称是真实买家的真实使用体验。
| 可以 | 不可以 |
|---|---|
| AI 生成的演示型口播 | 冒充具名真实买家的评价 |
| 「这件我穿了一周」的场景演绎 | 伪造好评截图、伪造买家秀 |
| 按平台要求标注 AI 生成 | 隐瞒 AI 生成身份(部分平台强制标注) |
各平台对 AI 生成内容的标注要求不同,投放前确认目标平台的规则。
三、人设与脚本
人设三要素:谁、什么场景、为什么可信。
| 人设 | 开场白范式 |
|---|---|
| 通勤白领 | 「每天挤地铁,我需要一件不用打理的……」 |
| 学生党 | 「预算两百,我对比了五家……」 |
| 宝妈 | 「带娃根本没时间收拾自己,所以……」 |
| 健身人群 | 「练完一身汗,这件……」 |
脚本骨架(15 秒)
0-3s 钩子:说一个具体的痛点,不说商品
3-8s 转折:为什么这个能解决 —— 给一个可验证的细节
8-12s 展示:镜头切到商品特写
12-15s 落点:给一个行动理由,语气随意
写口播的三条铁律
- 说具体的。「特别暖和」无效,「零下五度我只穿了这一件」有效。
- 留犹豫。真人说话有停顿和自我修正,全是完美长句就假了。
- 不念参数。参数放字幕,嘴里说感受。
四、工具调用
export DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>
node scripts/video.mjs --mode storyboard --task ugc-testimonial \
--board examples/ugc-board.json --outdir out/ugc --subtitles
分镜里交替口播镜头与商品镜头:
{
"shots": [
{ "id": "talk1", "seconds": 4, "image": "assets/model/face-a.jpg",
"prompt": "Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the olive cable-knit sweater.",
"caption": "零下五度,我就穿了这一件" },
{ "id": "detail1", "seconds": 3, "image": "docs/flat-lay/garment-flatlay.jpg",
"prompt": "Handheld close-up of the sweater texture, phone-camera look, natural indoor light.",
"caption": "粗棒针织,比看起来厚" },
{ "id": "talk2", "seconds": 4, "image": "assets/model/face-a.jpg",
"prompt": "Handheld selfie-style shot, same woman, she pulls the collar up and smiles, same apartment.",
"caption": "洗了三次也没变形" }
]
}
关键 prompt 词:handheld、selfie-style、slight natural camera shake、
phone-camera look、natural indoor light、casual —— 这些制造「不专业」的质感。
不要写 cinematic、professional lighting、studio,那会把 UGC 感抹掉。
五、执行流程
- 先定人设。问用户卖给谁,人设跟着买家画像走。
- 写脚本给用户确认。口播文案比画面更决定转化。
- 锁脸。多个口播镜头必须是同一个人,用 brand-kit 的
model.reference。 --dry-run过一遍,再真跑。- 配旁白。生成的视频不做唇形同步,成片后用剪辑软件配一条旁白,比同期声自然。
六、常见问题
| 现象 | 原因 | 怎么办 |
|---|---|---|
| 看起来还是像广告 | prompt 里有 cinematic / professional |
换成 handheld / phone-camera look |
| 几个镜头不是同一个人 | 没锁脸 | 用 --brand 带 model.reference |
| 嘴型对不上 | 模型不做唇形同步 | 别用同期声,配旁白;或改用不露脸的手持镜头 |
| 表情僵硬 | 人脸是视频模型弱项 | 缩短口播镜头,多用商品特写切换 |
Tips
- 口播镜头短、商品镜头长。人脸生成越久越容易崩,3–4 秒一切。
- 同一脚本换人设出三版做 A/B,投流看数据说话。
- 字幕必须有。大部分人静音刷视频。
Files (ecommerce-skills)
-
examples
-
brand.yaml 1.6 KB
# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成,不要直接改这里。 # 店铺品牌视觉规范 —— 所有生图技能读这一份,保证几百个 SKU 看起来像同一家店。 # node scripts/brand.mjs --brand brand.yaml --for flat-lay # node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...' brand: name: 示例品牌 # 一句话概括调性,会原样进 prompt tone: quiet minimalist, warm and lived-in, never glossy or commercial model: # 锁模特:给一张脸的参考图,所有技能都会把它作为最后一张参考图传入 reference: assets/model/face-a.jpg description: East Asian woman, late twenties, natural makeup, shoulder-length black hair body: slim, height around 168cm photography: background: seamless off-white studio backdrop, RGB 248 248 246 lighting: soft large softbox from camera left, gentle fill, no hard shadows camera: 85mm equivalent, eye level, shallow depth of field grade: neutral white balance around 5200K, low contrast, slightly lifted blacks crop: full body with headroom, product centered layout: # 给带排版的技能(主图 / 详情页)用 margin: at least 8% empty margin on all sides typeface: clean sans-serif, no decorative fonts text_color: near-black on light background forbid: - no visible brand logos other than the product's own - no text or watermark - no exaggerated poses or dramatic wind effects - no oversaturated colors # 可选:把这些直接写进合规目标,生成时就按平台要求出图 compliance: platform: amazon -
ugc-board.json 1002 B
{ "_note": "UGC 口播分镜示例。口播镜头与商品镜头交替,口播镜头必须用同一张脸的参考图。", "shots": [ { "id": "talk1", "seconds": 4, "image": "examples/face.jpg", "prompt": "Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the product. Phone-camera look, not cinematic.", "caption": "零下五度,我就穿了这一件" }, { "id": "detail1", "seconds": 3, "image": "examples/shot-detail.jpg", "prompt": "Handheld close-up of the product texture, phone-camera look, natural indoor light, slight shake.", "caption": "粗棒针织,比看起来厚" }, { "id": "talk2", "seconds": 4, "image": "examples/face.jpg", "prompt": "Handheld selfie-style shot, same woman, same apartment, she pulls the collar up and smiles. Phone-camera look, not cinematic.", "caption": "洗了三次也没变形" } ] }
-
-
references
-
provider-cli.md 4.7 KB
<!-- 由 scripts/build-skills.mjs 从 shared/references/provider-cli.md 同步生成,不要直接改这里。 --> # 后端调用参考 技能正文只写「要生成什么」。认证、计费、错误码、输出结构这些每个技能都一样的东西放在这里, **用到时再读**,不占技能的常驻上下文。 --- ## 一、认证 ### 默认后端 dLazy ```bash dlazy login # 设备码流程,远程 shell 也能用,自动写入本地配置 dlazy auth set <KEY> # 已有 key 时直接写入 ``` key 存在用户配置目录(macOS/Linux `~/.dlazy/config.json`,Windows `%USERPROFILE%\.dlazy\config.json`), 权限限本机用户。也可以每次调用用环境变量 `DLAZY_API_KEY` 传入。 手动获取:登录 [dlazy.com](https://dlazy.com) → [API Key 页面](https://dlazy.com/dashboard/organization/api-key)。 key 按组织隔离,可随时轮换或吊销。 ### 其他后端 本技能库不锁定单一厂商。配好任意一家的 key 即可跑: | 后端 | 环境变量 | 说明 | | --- | --- | --- | | `dlazy` | `dlazy login` 或 `DLAZY_API_KEY` | 默认,最省事 | | `openai` | `OPENAI_API_KEY` | 走 `/v1/images/edits` 与 `/v1/images/generations` | | `gemini` | `GEMINI_API_KEY` | Nano Banana 系列 | | `fal` | `FAL_KEY` | | | `replicate` | `REPLICATE_API_TOKEN` | | | `ark` | `ARK_API_KEY` + `ARK_MODEL` | 火山方舟,模型 ID 需按开通情况填 | 选路优先级:`--provider` 参数 > `PROVIDER` 环境变量 > 第一个配了 key 的 > `dlazy`。 ```bash node scripts/gen.mjs --doctor # 看当前哪个后端可用 ``` 各后端的模型 ID 可用 `GEN_MODEL_OPENAI` / `GEN_MODEL_GEMINI` / `GEN_MODEL_FAL` / `GEN_MODEL_REPLICATE` / `GEN_MODEL_ARK` 覆盖。**厂商目录会变,以各家最新文档为准。** --- ## 二、两种调用方式 ### 方式 A:统一入口(推荐) ```bash node scripts/gen.mjs --task <技能名> --prompt '...' --images a.jpg b.jpg --save out.jpg ``` 它负责:后端选路、默认尺寸档位、失败重试(429/5xx 指数退避)、落盘建目录、成本估算。 ```bash node scripts/gen.mjs --task flat-lay --prompt '...' --dry-run # 不调用不计费,只看要发什么 node scripts/gen.mjs --help ``` ### 方式 B:直接用 dLazy CLI 不想引入 Node 依赖时,技能正文里的 `dlazy ...` 命令可以原样执行,效果等价。 ```bash npx @dlazy/cli@1.2.3 <command> # 不装全局二进制 ``` - CLI 源码:[github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli) · npm 包 `@dlazy/cli` --- ## 三、数据流向 调用 dLazy 时:提示词与参数发往 `api.dlazy.com`;传入的本地图片会上传到 `files.dlazy.com` 供模型读取;产出 URL 同样托管在 `files.dlazy.com`。这是云端生成 API 的通用形态。 换成其他后端时,数据流向对应厂商,不经过 dLazy。 --- ## 四、输出结构 `gen.mjs`(加 `--json`): ```json { "ok": true, "task": "flat-lay", "provider": "dlazy", "model": "gpt-image-2", "files": ["docs/flat-lay/output-sku001.jpg"], "texts": [], "estimatedCredits": 60, "elapsedMs": 58213 } ``` dLazy CLI 原生: ```json { "ok": true, "result": { "tool": "gpt-image-2", "data": { "urls": ["https://files.dlazy.com/data/ai/....jpg"] }, "savedPath": "docs/flat-lay/example-output.jpg" } } ``` 加 `--no-wait` 的异步任务不返回 `data`,返回 `task: { generateId, status }`, 用 `dlazy status <generateId> --wait` 轮询。 文本类模型(如质检)产出在 `result.data.texts[0]`: ```bash dlazy claude-sonnet-5 --prompt '...' --images x.jpg \ | python3 -c 'import sys,json;print(json.load(sys.stdin)["result"]["data"]["texts"][0])' ``` --- ## 五、错误处理 | Code | 类型 | 示例 | | --- | --- | --- | | 401 | 未授权 / 无 key | `ok: false, code: "unauthorized"` | | 501 | 缺必填参数 | `error: required option '--prompt <prompt>' not specified` | | 502 | 本地文件读不到 | `Error: Image file not found: ...` | | 503 | 余额不足 | `ok: false, code: "insufficient_balance"` | | 503 | 服务端错误 | `HTTP status code error (500)` | | 504 | 异步任务失败 | `=== Generation Failed ===` / `Prompt violates safety policy` | **给 Agent 的硬性要求** 1. 命中 `insufficient_balance` → 明确告诉用户算力不足,并给出充值入口 <https://dlazy.com/dashboard/organization/settings?tab=credits> 2. 命中 `unauthorized` / 缺 key → 告诉用户去 <https://dlazy.com/dashboard/organization/api-key> 取 key,用 `dlazy auth set <key>` 存好再继续。 3. 用 `gen.mjs` 时,429 与 5xx 已自动重试;仍失败才向用户报错。 4. **不要**为了「跑通」而偷偷降级参数(尺寸、档位、批量),先问用户。 -
video-backends.md 2 KB
<!-- 由 scripts/build-skills.mjs 从 shared/references/video-backends.md 同步生成,不要直接改这里。 --> # 视频后端配置 图像模型的默认值写死在 `lib/tasks.json` 里,视频模型没有——**因为各家的视频模型 ID 差异大、更新快,写死只会误导**。所以视频技能要求你显式指定。 ## 指定模型 ```bash export DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID> # 或每次调用时 node scripts/video.mjs --mode clip --task main-image-video --model <id> ... ``` 没设会直接报错,不会拿一个猜的模型名去跑。 ## 各后端 | 后端 | 怎么配 | 说明 | | --- | --- | --- | | `dlazy` | `DLAZY_VIDEO_MODEL` | 用 `dlazy --help` 看当前账号可用的视频工具 | | `fal` | `FAL_KEY` + `GEN_MODEL_FAL=<视频模型路径>` | 产出在 `videos[]` 或 `video.url` | | `replicate` | `REPLICATE_API_TOKEN` + `GEN_MODEL_REPLICATE=<owner/model>` | 产出为 URL | 图生视频时参考图走 `--images`,与图像技能一致。 ## 合成依赖 拼接与字幕需要 ffmpeg: ```bash brew install ffmpeg # macOS apt install ffmpeg # Debian/Ubuntu ``` 没装也能跑——片段照常生成,脚本会输出 `concat.txt`,装好后一条命令补拼。 ## 字幕的三级降级 1. **烧录进画面**:需要 ffmpeg 带 libass。很多发行版的预编译包没有。 2. **软字幕轨**:`-c:s mov_text` 封进 MP4,播放器可开关。几乎总能成。 3. **都不行**:`.srt` 留在产物目录旁边,可导入剪辑软件。 脚本自动逐级尝试,不用你判断。查本机是否支持烧录: ```bash ffmpeg -hide_banner -filters | grep ' subtitles ' ``` ## 分镜文件 ```json { "shots": [ { "id": "s1", "seconds": 3, "image": "main.jpg", "prompt": "Slow push-in on the product, soft light sweeps across the surface.", "caption": "三层加厚,零下也不怕" } ] } ``` `caption` 会按 `seconds` 累加时间轴自动生成 SRT,不用手对时间码。
-
-
scripts
-
lib
-
miniyaml.mjs 2.8 KB · in bundle
-
providers.mjs 11.9 KB · in bundle
-
tasks.json 3.1 KB
{ "_note": "技能 → 默认模型与参数。dlazy 列为默认后端的模型名;其他后端走 providers.mjs 的通用映射,可用 GEN_MODEL_<PROVIDER> 覆盖。", "_credits": { "gpt-image-2": 60, "seedream-5.0": 30, "seedream-5.0-pro": 45, "banana-pro": 25, "claude-sonnet-5": 3 }, "tasks": { "flat-lay": { "model": "gpt-image-2", "size": "1024x1536", "quality": "high", "format": "jpeg" }, "wear-everything": { "model": "gpt-image-2", "size": "1024x1536", "quality": "medium", "format": "jpeg" }, "image-fusion": { "model": "seedream-5.0", "size": "3:4", "resolution": "2k" }, "one-shot": { "model": "gpt-image-2", "size": "1024x1536", "quality": "medium", "format": "jpeg" }, "fission-pattern": { "model": "gpt-image-2", "size": "1024x1536", "quality": "medium", "format": "jpeg" }, "item-detail": { "model": "seedream-5.0-pro", "size": "3:4", "resolution": "2k" }, "creative-scene": { "model": "banana-pro", "size": "1024x1536", "format": "jpeg" }, "batch-image": { "model": "seedream-5.0", "size": "3:4", "resolution": "2k" }, "to-3d": { "model": "gpt-image-2", "size": "1024x1024", "quality": "high", "format": "jpeg" }, "clothing-extraction": { "model": "gpt-image-2", "size": "1024x1024", "quality": "high", "format": "jpeg" }, "fabric-on-body": { "model": "gpt-image-2", "size": "1024x1536", "quality": "high", "format": "jpeg" }, "clothing-detail": { "model": "gpt-image-2", "size": "1024x1024", "quality": "high", "format": "jpeg" }, "clothing-grass-planting": { "model": "gpt-image-2", "size": "1024x1536", "quality": "medium", "format": "jpeg" }, "item-selling-point": { "model": "seedream-5.0-pro", "size": "1:1", "resolution": "2k" }, "item-change-background": { "model": "gpt-image-2", "size": "1024x1024", "quality": "high", "format": "jpeg" }, "remove-watermark": { "model": "gpt-image-2", "size": "1024x1024", "quality": "high", "format": "jpeg" }, "material-enhancement": { "model": "gpt-image-2", "size": "1024x1024", "quality": "high", "format": "jpeg" }, "item-repair": { "model": "gpt-image-2", "size": "1024x1024", "quality": "high", "format": "jpeg" }, "detect-task": { "model": "claude-sonnet-5", "text": true }, "listing-optimizer": { "model": "gpt-image-2", "size": "1024x1024", "quality": "high", "format": "jpeg" }, "cross-border-localize": { "model": "seedream-5.0-pro", "size": "1:1", "resolution": "2k" }, "brand-kit": { "model": "gpt-image-2", "size": "1024x1536", "quality": "high", "format": "jpeg" }, "platform-compliance": { "model": "claude-sonnet-5", "text": true }, "main-image-video": { "model": "$DLAZY_VIDEO_MODEL", "video": true }, "product-video-ad": { "model": "$DLAZY_VIDEO_MODEL", "video": true }, "ugc-testimonial": { "model": "$DLAZY_VIDEO_MODEL", "video": true } } }
-
-
brand.mjs 4.4 KB · in bundle
-
gen.mjs 9.3 KB · in bundle
-
video.mjs 8.4 KB · in bundle
-
-
skill.md 4.9 KB
--- name: ugc-testimonial description: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片,达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。 --- # ugc-testimonial — UGC 口播种草 投流素材里转化最好的一类往往不是精致广告,而是**看起来像真人随手拍的推荐**。 这个技能生成那种质感:手持、家里的光、说人话。 --- ## 一、能力边界 | 能做 | 说明 | | --- | --- | | 口播脚本 | 商品 + 人设 → 一段能照着念的话 | | 分镜 | 口播镜头 + 商品特写的交替结构 | | UGC 质感 | 手持轻晃、室内自然光、非专业构图 | | 多人设 | 同一商品换人设出多版做 A/B | | 不能做 | 说明 | | --- | --- | | 对口型 | 生成模型做不好唇形同步,成片建议配旁白而不是同期声 | | 冒充真人 | 不要声称是真实买家评价,见下方「合规」 | --- ## 二、合规先说 UGC 风格 ≠ 伪造评价。生成的内容**不能声称是真实买家的真实使用体验**。 | 可以 | 不可以 | | --- | --- | | AI 生成的演示型口播 | 冒充具名真实买家的评价 | | 「这件我穿了一周」的场景演绎 | 伪造好评截图、伪造买家秀 | | 按平台要求标注 AI 生成 | 隐瞒 AI 生成身份(部分平台强制标注) | 各平台对 AI 生成内容的标注要求不同,投放前确认目标平台的规则。 --- ## 三、人设与脚本 **人设三要素**:谁、什么场景、为什么可信。 | 人设 | 开场白范式 | | --- | --- | | 通勤白领 | 「每天挤地铁,我需要一件不用打理的……」 | | 学生党 | 「预算两百,我对比了五家……」 | | 宝妈 | 「带娃根本没时间收拾自己,所以……」 | | 健身人群 | 「练完一身汗,这件……」 | **脚本骨架(15 秒)** ``` 0-3s 钩子:说一个具体的痛点,不说商品 3-8s 转折:为什么这个能解决 —— 给一个可验证的细节 8-12s 展示:镜头切到商品特写 12-15s 落点:给一个行动理由,语气随意 ``` **写口播的三条铁律** 1. **说具体的**。「特别暖和」无效,「零下五度我只穿了这一件」有效。 2. **留犹豫**。真人说话有停顿和自我修正,全是完美长句就假了。 3. **不念参数**。参数放字幕,嘴里说感受。 --- ## 四、工具调用 ```bash export DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID> node scripts/video.mjs --mode storyboard --task ugc-testimonial \ --board examples/ugc-board.json --outdir out/ugc --subtitles ``` 分镜里交替口播镜头与商品镜头: ```json { "shots": [ { "id": "talk1", "seconds": 4, "image": "assets/model/face-a.jpg", "prompt": "Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the olive cable-knit sweater.", "caption": "零下五度,我就穿了这一件" }, { "id": "detail1", "seconds": 3, "image": "docs/flat-lay/garment-flatlay.jpg", "prompt": "Handheld close-up of the sweater texture, phone-camera look, natural indoor light.", "caption": "粗棒针织,比看起来厚" }, { "id": "talk2", "seconds": 4, "image": "assets/model/face-a.jpg", "prompt": "Handheld selfie-style shot, same woman, she pulls the collar up and smiles, same apartment.", "caption": "洗了三次也没变形" } ] } ``` **关键 prompt 词**:`handheld`、`selfie-style`、`slight natural camera shake`、 `phone-camera look`、`natural indoor light`、`casual` —— 这些制造「不专业」的质感。 不要写 `cinematic`、`professional lighting`、`studio`,那会把 UGC 感抹掉。 --- ## 五、执行流程 1. **先定人设**。问用户卖给谁,人设跟着买家画像走。 2. **写脚本给用户确认**。口播文案比画面更决定转化。 3. **锁脸**。多个口播镜头必须是同一个人,用 [brand-kit](../brand-kit/skill.md) 的 `model.reference`。 4. **`--dry-run` 过一遍**,再真跑。 5. **配旁白**。生成的视频不做唇形同步,成片后用剪辑软件配一条旁白,比同期声自然。 --- ## 六、常见问题 | 现象 | 原因 | 怎么办 | | --- | --- | --- | | 看起来还是像广告 | prompt 里有 `cinematic` / `professional` | 换成 handheld / phone-camera look | | 几个镜头不是同一个人 | 没锁脸 | 用 `--brand` 带 `model.reference` | | 嘴型对不上 | 模型不做唇形同步 | 别用同期声,配旁白;或改用不露脸的手持镜头 | | 表情僵硬 | 人脸是视频模型弱项 | 缩短口播镜头,多用商品特写切换 | --- ## Tips - **口播镜头短、商品镜头长**。人脸生成越久越容易崩,3–4 秒一切。 - **同一脚本换人设出三版**做 A/B,投流看数据说话。 - **字幕必须有**。大部分人静音刷视频。
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.