通过一张清晰的产品图片、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 并必须从项目根目录运行。下载完整的入门包
下载代码、提示、配置和示例图片
解压后,进入 seedance-starter 目录。该包包括 flow.py 、两个模式快照、五个提示文件、产品图片和三张参考图片。Python脚本仅使用标准库。
- 从视频阶段开始: 使用包含的三个参考,配置您的密钥,并从第4步开始。
- 从您自己的产品开始: 替换产品图片和提示细节,将包含的参考图片移出
assets/,并从第3步开始。
将 .env.example 复制到 .env 并添加您自己的API密钥。您的账户需要访问相关模型、任何所需的异步任务权限和足够的配额。API生成会产生使用费用。
1. 准备产品图片和项目
示例产品是自然共和国芦荟喷雾。在调整工作流程时,请更新图片、产品描述和使用动作。
| 文件 | 目的 |
|---|---|
assets/product.png | 原始产品图片 |
prompts/prompt-a.txt | 主要角色肖像提示 |
prompts/prompt-b.txt | 角色持有产品的提示 |
prompts/prompt-c.txt | 使用产品的提示 |
prompts/prompt-video.txt | 视频时间线、相机和音频要求 |
prompts.json | 维度、持续时间、参考依赖关系和提示路径 |
flow.py | API请求、资产注册、轮询和下载 |
seedream.schema.json, seedance.schema.json | 缓存的API模式快照 |
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
捆绑的模式快照显示图像端点接受 size,而视频端点接受 aspect_ratio。混合它们会导致拒绝。 flow.py 在发送请求之前检查缓存的模式属性,但这不是完整的参数验证。
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原始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 是正确的分类。真实人物照片必须遵循相应的验证过程,并且不得标记为虚拟。
在一个视频请求中使用的所有资产应属于同一组。

这些参考已经生成,所有三个资产都是活动的;当捕获此屏幕截图时,视频任务仍在运行。
5. 将视频提示写成带有相机限制的时间线
最终项目提示将一个连续的20秒镜头分为四个阶段:
| 时间 | 角色动作 | 产品位置 |
|---|---|---|
| 0–5秒 | 看着相机并展示瓶子 | 在她的脸旁,标签朝向相机 |
| 5–10秒 | 抬起瓶子并按下喷雾泵 | 保持在画面内 |
| 10–15秒 | 闭上眼睛,感受喷雾落下 | 画面的下三分之一 |
| 15–20秒 | 睁开眼睛,再次展示产品 | 回到她的脸旁,标签朝向相机 |
早期的结果将相机推得太近,导致产品消失。因此,最终提示限制了移动到中近景,要求产品保持可见,并要求在前后三秒内标签清晰可读。
以下是完整的 prompts/prompt-video.txt。对于其他产品,请更新品牌、包装描述和使用动作。这些说明是生成目标,仍然需要输出审查。
一个连续的20秒竖屏美容广告镜头,没有剪辑,在阳光明媚的极简化梳妆台角落。
0-5秒:同一个24岁的东亚女性穿着一件宽松的鼠尾草绿色亚麻衬衫,里面是一件白色的肋纹背心,站在梳妆台旁,手持透明的浅绿色自然共和国芦荟92%舒缓喷雾,标签面向相机且完全可读。她面带温暖、轻松的微笑看向相机,稍微转动瓶子,让标签捕捉到晨光。
5-10秒:她将瓶子抬到眼睛稍上方并按下细雾喷雾泵。柔和的芦荟喷雾在她的脸上喷洒,微小的水滴在光线下闪烁。
10-15秒:她闭上眼睛,微微抬起下巴,露出满意的微笑,喷雾落下,微小的水滴停留在她的颧骨和额头上。瓶子在这一段时间内保持在画面的下三分之一内可见。
15-20秒:她睁开眼睛,将瓶子重新举到脸旁,标签正对相机,最后对镜头保持平静的表情。
相机:从胸部以上的框架慢慢平滑地推入到中近景。不要超过中近景。产品必须在整个镜头中保持在画面内,标签在前后三秒内必须清晰可读。
外观:来自相机左侧的柔和扩散的晨光,逼真的皮肤纹理,皮肤上有真实的水分,喷雾呈现为真实拍摄的喷雾,而不是数字颗粒,高端K-Beauty广告。保持产品包装、颜色、材料、标签布局和标签文本与参考图像完全一致;不要重新设计或重新书写产品。没有文本覆盖,没有字幕,没有水印。
音频:安静明亮的房间,一个柔和的短喷雾声,一声轻柔的呼吸。没有音乐,没有旁白。
音频生成已启用,但提示仅请求房间音、一个喷雾声和轻柔的呼吸——没有音乐或旁白。
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模型选择和模型特定参数。这就是使用多个AI模型的内容团队统一API服务的实际价值:模型可以根据任务变化,而工作流程仍然可重用。



