如何使用 Claude Code 和 AIHubMix 制作 AI 产品广告

推理时代阅读约 9 分钟
如何使用 Claude Code 和 AIHubMix 制作 AI 产品广告

只需一张清晰的产品图、Claude Code 和 AIHubMix API,你就可以在 Seedream 中生成角色参考图,将其注册为虚拟人物素材,并使用 Seedance 制作 AI 产品广告。

本教程基于一个真实的芦荟喷雾广告项目,包含项目结构、配置、命令和完整的视频提示词。目标输出是一条20 秒、720p、9:16 竖屏广告,其中的人物和场景均由 AI 生成。

Claude Code 和 AIHubMix 共同支撑整个工作流。Claude Code 负责读取项目说明、修改提示词并组织执行流程。AIHubMix 提供统一的模型接入入口,使图像和视频生成可以在同一个项目中完成。

模型 ID、参数和错误处理方式来自 2026 年 9 月 16 日的项目快照。复用前请先核对当前 API。命令使用随附的 flow.py ,且必须在项目根目录下运行。

下载完整入门包

下载代码、提示词、配置文件和示例图片:

https://drive.google.com/uc?export=download&id=1nXcj26Fq3daHeTd0SynS7_QEXgH8z4u_

解压后进入 seedance-starter 目录。该包包含 flow.py、两个 schema 快照、五个提示词文件、产品图片和三张参考图。Python 脚本仅使用标准库。

  • 从视频阶段开始: 使用随附的三张参考图,配置你的密钥,然后从第 4 步开始。
  • 从你自己的产品开始: 替换产品图片和提示词细节,将随附的参考图移出 assets/ ,然后从第 3 步开始。

将 .env.example 复制为 .env ,并填入你自己的 API 密钥。你的账户需要具备相关模型的访问权限、所需的异步任务权限以及足够的配额。API 生成会产生使用费用。

1. 准备产品图片和项目

示例产品是 Nature Republic Aloe Vera Mist。改编此工作流时,请同时更新图片、产品描述和使用动作。

文件用途
assets/product.png原始产品图片
prompts/prompt-a.txt主角人像提示词
prompts/prompt-b.txt人物手持产品提示词
prompts/prompt-c.txt产品使用提示词
prompts/prompt-video.txt视频时间线、镜头和音频要求
prompts.json尺寸、时长、参考依赖关系和提示词路径
flow.pyAPI 请求、素材注册、轮询和下载
seedream.schema.json, seedance.schema.json缓存的 API schema 快照

Claude Code 用于读取项目说明,并修改配置和提示词。 flow.py 通过 AIHubMix 实际发送请求。

为什么 AIHubMix 适合这一工作流

AI 产品广告工作流通常需要多个模型。图像模型负责生成人物和产品参考图;视频模型负责生成动作和镜头运动。AIHubMix 覆盖了大多数主流模型,因此你可以通过同一个 API 服务按任务选择模型,而无需为每个提供商分别维护账户、认证方式和请求入口。

AIHubMix 还连接多家供应商,并自动选择可用的低延迟线路。对于需要依次完成图像生成、素材处理和视频生成的工作流,这可以减轻单一供应商不稳定带来的影响。模型可用性、路由和响应时间仍取决于当前的服务状况。

在项目根目录下创建 .env 文件,或在环境变量中提供相同的变量:

AIHUBMIX_API_KEY=replace_with_your_api_key

项目通过 .gitignore 排除 .env 。分享时只能提供变量名和示例,切勿分享真实密钥。

整个工作流从一张清晰的产品图片开始。

2. 设定输出目标,并区分图像与视频参数

prompts.json 的相关部分如下所示。编辑真实文件时,请保留现有的 stills 数组和其他字段。

{
  "size": "1080x1920",
  "aspect_ratio": "9:16",
  "duration": 20,
  "resolution": "720p",
  "generate_audio": true,
  "video_prompt_file": "prompts/prompt-video.txt"
}

size 属于图像生成。 aspect_ratio、 duration、 resolution 和 generate_audio 属于视频生成。脚本会分别构建两个请求,而不是把整个配置对象同时发送给两个接口。

项目使用以下模型 ID:

  • Seedream: doubao-seedream-5-0-pro-260628
  • Seedance: doubao-seedance-2-5-260628

随附的 schema 快照显示,图像接口接受 size ,而视频接口接受 aspect_ratio 。两者混用会导致请求被拒绝。 flow.py 会在发送请求前检查缓存的 schema 属性,但这并不是完整的参数校验。

3. 按顺序生成三张角色参考图

每张图片作用不同,后面的图片依赖前面的图片:

参考图内容输入
A:角色人像确定面部、发型、服装、房间和光线本示例中仅使用文本提示词
B:手持产品同一人物手持瓶身,标签朝向镜头产品图 + A
C:使用产品同一人物按压喷雾泵头产品图 + B

提示词会重复角色细节,并描述产品的形状、颜色、标签布局以及自然的握持方式。

运行:

python3 flow.py stills

结果会保存为 assets/frame-01.jpg 、 frame-02.jpg 和 frame-03.jpg 。请检查角色一致性、包装还原度以及使用动作的真实感。

脚本会跳过已存在的文件。 如果修改了某个提示词,请先备份并移走对应的输出文件,再重新运行。修改 A 后,可能还需要重新生成 B 和 C。

参考图用于确立角色身份、产品呈现方式和产品使用方式。

4. 托管图片并注册虚拟人像素材

入门包中不包含作者账户的任何素材 ID。请在你自己的账户中注册参考图。

本项目使用公开图片 URL 进行注册。原始工作流使用了固定到提交 SHA 的 GitHub raw URL,但只要是无需认证即可直接返回图片的托管方式,都可以使用。

GitHub 的 /blob/ URL 返回的是 HTML 页面,不能用作图片 URL。

请将此占位域名替换为你上传文件的实际地址:

IMAGE_BASE='https://your-public-image-host.example/campaign'
python3 flow.py check "$IMAGE_BASE/frame-01.jpg" "$IMAGE_BASE/frame-02.jpg" "$IMAGE_BASE/frame-03.jpg"
python3 flow.py assets "$IMAGE_BASE/frame-01.jpg" "$IMAGE_BASE/frame-02.jpg" "$IMAGE_BASE/frame-03.jpg"

check 用于验证 HTTP 200 状态以及图片 Content-Type。 assets 会创建或复用一个 virtual_portrait 素材组,注册每张图片,等待其变为 active 状态,并将素材 ID 写入 state.json 。

这一步源于项目中的一次实际失败:直接将写实人物 URL 传给视频接口,返回了 doubao_real_person_required 错误。本次广告中的人物由 AI 生成,因此 virtual_portrait 是正确的分类。真人照片必须经过相应的验证流程,且不能标记为虚拟人像。

同一个视频请求中使用的所有素材应属于同一个素材组。

参考图已生成,三个素材均已处于 active 状态;截取此截图时,视频任务仍在运行。

5. 将视频提示词写成带镜头限制的时间线

最终的项目提示词将一个连续的 20 秒镜头分为四个阶段:

时间人物动作产品位置
0–5 秒看向镜头并展示瓶身位于她的脸旁,标签朝向镜头
5–10 秒举起瓶子并按压喷雾泵头保持在画面之内
10–15 秒闭上眼睛,感受喷雾落在脸上位于画面下三分之一处
15–20 秒睁开眼睛,再次展示产品回到她的脸旁,标签朝向镜头

早期的一个结果镜头推得过近,导致产品丢失。因此,最终提示词将运镜限制为中近景,要求产品始终可见,并要求在前三秒和后三秒内标签清晰可读。

以下是完整的 prompts/prompt-video.txt 。若换成其他产品,请更新品牌、包装描述和使用动作。这些说明是生成目标,结果仍需人工审核。

One continuous 20-second vertical beauty commercial take, no cuts, in a sunlit minimalist vanity corner.

0-5s: the same 24-year-old East Asian woman in an oversized sage-green linen shirt over a white ribbed tank top stands at the vanity holding the translucent light-green Nature Republic Aloe Vera 92% Soothing Gel Mist beside her cheek, the label facing camera and fully legible. She looks to camera with a warm, easy smile and turns the bottle slightly so the label catches the morning light.

5-10s: she lifts the bottle just above eye level and presses the fine-mist pump. A soft cone of aloe mist sprays across her face and catches the light as a faint sparkle of micro-droplets.

10-15s: her eyes close and her chin lifts into a small contented smile as the mist settles, tiny droplets resting on her cheekbone and brow. The bottle stays visible in the lower third of the frame throughout this beat.

15-20s: she opens her eyes, brings the bottle back up beside her cheek with the label square to camera, and holds a final calm look at the lens.

Camera: one slow, smooth push-in from a chest-up framing to a mid-close framing ONLY. Do not push past a mid-close shot. The product must stay inside the frame for the entire take, and the label must be clearly legible in both the first three seconds and the last three seconds.

Look: soft diffused morning sunlight from camera left, photorealistic skin texture with real moisture on the skin, mist rendered as genuinely photographed spray rather than digital particles, premium K-beauty advertising. Keep the product packaging, colours, materials, label layout and label text exactly as in the reference images; do not redesign or re-letter the product. No text overlays, no captions, no watermarks.

Audio: a quiet bright room, one soft short pump-spray hiss, a gentle breath. No music, no voiceover.

音频生成已启用,但提示词只要求房间环境音、一次喷雾声和轻柔的呼吸声,不包含音乐或旁白。

6. 生成并保存视频

素材注册完成后,提交 asset:// 引用。以下命令读取已保存的 ID,并将每个 ID 作为单独参数传入:

python3 - <<'PYCODE'
import json
import subprocess
import sys
from pathlib import Path

state = json.loads(Path("state.json").read_text())
refs = ["asset://" + asset_id for asset_id in state["asset_ids"]]
subprocess.run([sys.executable, "flow.py", "video", *refs], check=True)
PYCODE

使用参数列表还能避免源项目中的一个 zsh 问题:如果多个 ID 存储在同一个普通字符串中,脚本可能会将其作为一个无效参数接收。

脚本会保存视频任务 ID,轮询直到 completed ,并将输出下载到 out/video.mp4 。再次下载可能会覆盖该路径,因此请备份你想要对比的版本。

恢复已有任务或重新下载其结果,请运行:

python3 flow.py status

如果创建请求的响应丢失,可以列出最近的任务并恢复相关 ID:

python3 flow.py tasks
python3 flow.py status VIDEO_TASK_ID

在创建新任务之前先查找已有任务,可以避免意外的重复生成。

7. 检查输出并迭代

源项目保留了 video-v1-10s.mp4 和最终的 video.mp4 。第一个版本只有 10 秒,且没有充分展示产品使用过程,因此工作流进行了第二轮提示词迭代。

请对照以下清单检查每个结果:

  • [ ] 时长、分辨率和宽高比符合目标。
  • [ ] 角色的面部、服装和场景保持一致。
  • [ ] 产品始终可见,且开头和结尾时标签可以辨认。
  • [ ] 手持和喷雾动作符合产品的实际使用方式。
  • [ ] 瓶身形状、包装和文字没有明显变化。
  • [ ] 镜头没有推得过近,音频符合要求。

如果视频时长不对,请同时检查配置和实际请求。如果产品移出画面,请加强镜头限制。如果使用动作时间太短,请更明确地分配时间和动作描述。仅编辑prompts/prompt-video.txt不需要重新生成参考图;只有在视觉参考需要改变时,才需要重新生成并注册它们。

常见问题

为什么看起来正确的模型名称会返回 404?

在源项目中,缩短的 Seedream 名称返回了model_not_found。请使用当前端点接受的完整 API 模型 ID,不要假定营销展示名称也是 API 标识符。

为什么我能在浏览器中打开图片,但仍然无法注册?

请确认该 URL 返回的是图片本身,而不是 HTML、分享页面或登录页面。注册前请使用python3 flow.py check URL...进行检查。

为什么修改提示词后参考图没有变化?

stills会跳过已存在的文件。请备份并移走需要重新生成的图片,然后检查下游的参考图是否也需要重新生成。

HTTP 200 是否意味着视频已完成?

不是。脚本会根据任务的status进行分支判断,只有当任务状态达到completed后才会下载。

开始制作你的第一个版本

准备一张产品图片,配置 AIHubMix 访问权限,并选择图像和视频模型。然后让 Claude Code 调整产品描述和提示词。生成三张参考图,检查并注册它们,创建视频,并使用检查清单决定下一轮迭代的方向。

当未来的项目需要另一个模型时,保持相同的文件结构和工作流程,然后更新 AIHubMix 的模型选择以及特定模型的参数即可。这就是统一 API 服务对于使用多个 AI 模型的内容团队的实际价值:模型可以根据任务更换,而工作流程仍然可以复用。

一个网关接入多家 AI 服务商, 为生产环境而生。

访问推理时代官网