本文件取代原 jimeng-workflow.md,定义技能对接阿里云百炼 · 万相 3.0(wan3.0-video)的工程要点。技能所有"调用 AI 视频接口"的步骤都以本文件为准。
wan3.0-video(标准版)/ wan3.0-video-prime(高速版)。All-in-One,按 input.media 的 type 与 prompt 意图自动路由任务类型。reference_audio 传入即可。media 数组顺序在内部对应素材即可,绝不能在 prompt 文本里写 Image 1 / Image 2 / Audio 1 这类标记。实测 wan3 会把 prompt 中出现的 Image N/Audio N 文字当成对白直接念出来,形成"开头莫名其妙的一段话"(BUG B)。正确做法:用自然语言描述画面与音色,例如"一位女性…身处怡呵美门店内…""原生清晰女声普通话对白(音色参考随附音频)",不出现任何 Image N/Audio N 字样。素材内容靠 media 数组顺序与画面/音色描述间接对应,不必显式编号。X-DashScope-Async: enable。{WorkspaceId} 与 region):
https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1/services/aigc/video-generation/video-synthesishttps://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/...GET https://{WorkspaceId}.{region}.maas.aliyuncs.com/api/v1/tasks/{task_id}llm- 前缀:用户从百炼控制台拿到的 …maas.aliyuncs.com/compatible-mode/v1 是 LLM 对话网关(OpenAI 兼容模式),视频生成不使用它。视频主机为 https://{WorkspaceId}.{region}.maas.aliyuncs.com(无 llm- 前缀、/api/v1 之后才是视频路径)。脚本按 config.workspace_id + config.region 自动拼,或显式覆盖 config.api_base。Authorization: Bearer $DASHSCOPE_API_KEY。密钥必须走环境变量,禁止写死。task_id(24h 有效)→ 轮询 tasks/{task_id} 至 SUCCEEDED → 取 output.video_url → 下载。| 素材 | 来源 | media type | prompt 引用 | 约束 |
|---|---|---|---|---|
| 人物完整形象照 | 生成物料:以 character_5view + uniform_detail(固定素材)为参考生成并确认(见 asset-collection.md 第二节) |
reference_image |
Image 1 |
全片同脸/同发型/同年龄感/同制服;胸牌样式与确认稿一致、不可变更 |
| 门店空间实景图(按动线 zone 选取) | 技能内置资源:从 assets/store-spatial-index/ 按动线 zone 选取对应 zone 实景图(见第二节),LOGO 随实景自然呈现 |
reference_image |
自然语言描述 | 按动线 zone 选图;U01–U03 禁用;多 zone 可多张;LOGO 随实景(品牌墙/发光字展柜)自然出现 |
| 门店空间实景图(zone 参考,技能内置) | 技能内置资源:assets/store-spatial-index/ 下的 Z0X_0Y_*.png(10 张 9:16 实景图,区域/机位/可用-禁用区见 references/store-spatial-index.md) |
reference_image |
自然语言描述 | 按脚本各 Shot 所在 zone 选取对应实景图传入(本技能唯一场景来源);U01–U03 禁用;人物真实经过的过渡空间(如走廊 Z05)必须传对应图,只靠俯瞰图+文字会脑补「幽灵硬件」 |
| 插画参考图 1/2 | 自动生成(抽象可视化风格启发) | reference_image |
Image 3 / Image 4 |
无真人皮肤/血液/文字 |
| 音色文件 | 公网 URL config.brand_assets.voice_ref.url(优先)或本地 assets/brand/voice_ref.*(兜底) |
reference_audio |
Audio 1 |
单段 ≤15s;超长则裁剪一段代表音色 |
| (生成输入,不提交)人物五视角图 / 制服细节图 | 固定素材,仅用于生成 Image 1,本身不提交 wan3 | — | — | 锁死、不可被自动生成覆盖 |
⚠️ 表中"prompt 引用"列的
Image 1/Image 2/Image 3/Image 4/Audio 1只是素材顺序的内部代号,绝不能原样写进 prompt 文本(否则会被 wan3 当对白念出,见第一节)。prompt 里用自然语言描述画面与音色即可,素材靠 media 数组顺序间接对应。提交的是确认的物料,不是原始 3 项文件本身。
一个 prompt 描述整段 [T] 秒(T 由 Shot 台词时间分配表求和得出、≤30)的连续画面(不要拆成多个 Shot 分开发请求)。要把它当作一条专业编导分镜来写——人物必须在门店场景里"活"起来,不能一直正对镜头站桩。必须覆盖四块:人物行为动线 / 运镜组合 / 插画展示方式 / 门店丰富元素(对应 elements.md 元素 25/26/27/12)。结构范式:
范式按官方「总体描述 + 镜头序号 + 时间戳 + 分镜内容」公式组织;时间戳用英文
Shot N [x-y s],台词用花括号{}圈出。⚠️ 绝不在 prompt 里写Image N/Audio N(会被当对白念出);用自然语言描述画面与音色。
【总体描述】
一位身穿[米白]美容师制服、[深栗色半扎长发 + 斜刘海]、胸牌样式与参考形象照一致的女美容师,
在怡呵美门店内(依据随附门店实景参考图,背景虚化,可见门店场景元素——依动线规划,如前台、美容床、沙发、产品陈列架等,
一名店员从画面边缘虚化走过)拍摄。画面中的女美容师、门店与插画均依据随附参考图生成,
须保持人物脸型/发型/制服/胸牌一致,门店场景须与随附实景参考图一致(怡呵美 LOGO 随实景自然呈现),插画为卡通动漫风抽象可视化(无真人、无文字)。
整体动线:[开场端坐于面诊桌前自然引入话题,中段起身缓步走向产品陈列架、边走边说,
结尾保持站立、抬手手势收束];说话间以自然手势比划、轻微点头等真实肢体动作呈现。
镜头语言:[开场中近景极轻微横摇,人物走动时跟随拍摄,讲到核心点时缓慢推近,结尾缓慢拉远收束];
整体手持微晃保留真实手机拍摄质感。
语气与节奏:她自然亲和地讲解,像真人面对面聊天一样有温度有起伏——问句好奇上扬、肯定句沉稳、
列举句轻快有层次、收束句温和坚定;整体语速比自然对话放慢约一半、从容舒缓,让内容自然撑满约[T秒](T=Shot 时间分配表之和,≤30s),
句与句之间留约[0.5s]自然气口,不赶。
声音:原生清晰女声普通话对白(音色参考随附音频)、轻微环境音、无背景音乐;
口播须有自然语调起伏与停顿,禁止平淡匀速念稿。
硬性约束:口播须严格限于下列分镜台词(含已写入定本的语气词),禁止模型自行添加、删改或自由发挥任何台词之外的语句或语气词(定本已含的语气词须逐字照读,不得省略);
插画以画中画形式呈现,形状随机选用正方形或圆形;单个插图宽度不超过画面宽度的 1/2、高度按宽高比等比例;可置于画面任意位置,但任何情况下不得遮挡人物面部;禁止全屏覆盖;绝对禁止出现字幕、任何画面文字、
卡通化人物、塑料皮肤、变脸、服装漂移、场景跳变、或其他清晰正脸人物抢镜。
结构说明:以下「Shot序号 + 时间戳 + 分镜内容」为本片分镜脚本;Shot序号与时间戳是给模型的
节奏结构指令,不是台词,禁止当作语音读出;也禁止在任意空白时段补加台词或语气词。
【分镜脚本】
Shot 1 [0-4s]:[开场中近景,女美容师端坐面诊桌前,手持微晃手机质感,镜头极轻微横摇];
她好奇上扬地提问{[口播句1]},句末留自然气口。
Shot 2 [4-7.5s]:[仍端坐,中近景];她自然沉稳肯定{[[订期]去角质的→按用户文案填,见下方多音字提示]},语气笃定、不赶。
Shot 3 [7.5-12.5s]:[她起身缓步走向产品陈列架、边走边说,镜头跟随拍摄];列举句轻快有层次{[口播句3]}。
Shot 4 [12.5-19.5s]:[走到陈列架前站立,讲到核心点时镜头缓慢推近;此处画面右侧嵌入圆形画中画
展示[插画1](抽象可视化,无真人无文字,禁全屏)]。该句放慢加重带警示,讲到「[核心重音点]」时
稍作重音并留自然停顿{[口播句4]}。
Shot 5 [19.5-26s]:[切换为画面正方形画中画展示[插画2](同风格,不铺满整屏)];她自然亲和{[口播句5]}。
Shot 6 [26-30s]:[结尾缓慢拉远收束,她保持站立、抬手手势收束,中近景];收束句温和坚定{[口播句6]},留足停顿感。
⚠️ 上例 Shot 时间戳按 T=30s 演示(各 Shot 时长之和 = 30)。实战中 T 由本片 Shot 台词时间分配表求和得出(可能 26s、24s 等),须把末 Shot 结束时间改为 T、并把
--duration传 T,不要硬撑到 30(详见assets/script-template.md第五节)。
{} 圈出、逐句写进各 Shot 的「分镜内容」,wan3 原生生成语音并对口型;{} 之外的是画面/运镜描述,不会被当台词。assets/store-spatial-index/《空间索引.json》 与 《00_俯瞰图_修订_带布局编号V4.jpeg》 理解店内整体布局,动线长度与走动速度须与 T 匹配,切忌走太快或动线过长(避免瞬移式跨区 / 赶场感)。Shot N [x-y s] 连续铺满本段总时长 T(即 0→T,如 0–26s),既是分镜结构也是节奏约束,也等于 duration 的实际值(本例 T=30 即 0–30s;若 Shot 表求和得 26s 则为 0–26s)T 由各 Shot 时长求和得出,必须 ≤30。wan3 实测在「强制时长 > 口播实际长度」的空白时段会自动编造废话填充(padding 幻觉),故 Shot 时间分配须让台词真实撑满时间戳区间——靠放慢语速 + 句间留足气口,而非空撑时长。推荐直接传算出的 T(不要硬撑到 30);若内容确实偏短,可改用 −1 智能时长(按内容自动定长,上限 30s)。duration 须传本段算出的 T(各 Shot 时长之和,≤30),不要写死 30;ratio=9:16,resolution 按 config;若口播偏短或要规避 padding,也可设 −1 智能时长(按内容自动定长,上限 30s)。怡呵美 LOGO 不另行生成,随门店空间实景图自然呈现在成片:
assets/store-spatial-index/ 的 zone 实景图(品牌墙 Z01「YIHEMEI 你的水光肌肤管理师」/ 发光字展柜 Z02 等本身就含怡呵美 LOGO),动线主场景若途经含 LOGO 的 zone,LOGO 即在画面中。技能在用户确认脚本后,调用 scripts/generate_video.py:
export DASHSCOPE_API_KEY="sk-xxx"
python scripts/generate_video.py \
--config scripts/config.json \
--prompt "<脚本模板第五节:整段 prompt>" \
--media \
/abs/人物_完整形象照.jpg:reference_image \ # Image 1(由 character_5view + uniform_detail 生成、确认)
/abs/门店_实景_Z02.jpg:reference_image \ # Image 2(按动线 zone 从 store-spatial-index 选取的实景图,LOGO 随实景自然呈现)
/abs/插画_参考1.jpg:reference_image \ # Image 3
/abs/插画_参考2.jpg:reference_image \ # Image 4
"https://cdn.x/voice_ref.mp3:reference_audio" \ # Audio 1(config URL 透传,或本地路径)
--duration <T> --ratio 9:16 --resolution 720P \ # T = 各 Shot 时长之和(≤30,由 Shot 时间分配表算出)
--output /abs/成片.mp4
脚本会自动:公网 URL 素材直接透传(config.reupload_external_urls=true 时先下载再编码 base64 直传)、本地素材(人物形象照/门店实景图/插画)读取后编码 base64 直传→建任务→轮询→下载到 output_dir,并把结果打印到 stdout(VIDEO_PATH=...)。技能捕获后把视频 present 给用户确认。
media[].url 支持公网 URL 直传,也支持图像 base64 直传(data:{mime};base64,{b64})。固定 3 项若填了公网 URL(config.brand_assets),脚本默认直接透传;若 wan3 不接受站外 URL,把 config.reupload_external_urls 设为 true,脚本会先下载再编码 base64 直传。本地生成的图(人物形象照/门店内景/插画)一律编码 base64 直传,无需文件上传端点。llm-….maas.aliyuncs.com/compatible-mode/v1 是 LLM 网关,视频端点主机不带 llm- 前缀。若视频调用报 404,确认 config.workspace_id/region 是否拼出 https://{ws}.{region}.maas.aliyuncs.com;可显式填 config.api_base 覆盖。reference_audio 单段 ≤15s、≤15MB;音色样本过长先裁剪。duration 必须 ≤30,且应等于本段 Shot 时间分配表之和 T(见 SKILL.md 第 5/8 步);超了先在技能侧精简口播。X-DashScope-Async: enable 会报"current user api does not support synchronous calls"。Image N/Audio N 被当对白念出(BUG B):在 prompt 文本里出现的 Image 1/Audio 1 等素材编号会被 wan3 当成台词念出来,表现为"片头莫名其妙的一段话"。解法:prompt 中绝不写 Image N/Audio N,改用自然语言描述画面与音色(如"一位女性…门店内…""音色参考随附音频")。已验证删掉编号后片头干净。duration 大于口播真实时长,wan3 会在空白段自动编造语句填充(如结尾冒出"也沒衣服看管的")。解法:让口播内容真实撑满时间戳区间(放慢语速 + 句间气口),或改用 duration=-1 智能时长;不要硬撑空时长。scripts/ 下的 extract_audio.py + asr_wordlevel.py 用法(从 mp4 抽音频→逐词时间戳)。reference_audio 本是提取音色,但若样本本身带口播语义,可能被前置到片头。建议从音色源音频的中段裁一段(避开句首)作 ≤15s 样本。references/store-spatial-index.md,图片在 assets/store-spatial-index/,按 zone 文件名选取对应图传入。scripts/generate_video.py 默认 poll timeout=1200s,30s 视频偶发耗时 >20 分钟仍 RUNNING → 脚本因超时而 RuntimeError 退出,但阿里云 task 并未失败。解法:保留 stdout 回显的 [轮询] task_id=...,用脚本周期性 GET {api_base}/api/v1/tasks/{task_id} 续轮询;status=SUCCEEDED 后 extract_video_url + download,不必重提任务。qwen3-asr-flash(SDK / 兼容模式 / 原生端点,均 400)与 paraformer-v2 文件转写(403 "current user api does not support synchronous calls",账号未开通)全部拒绝。音频核对只能走本地 ASR(funasr / faster-whisper,不外传素材),见上方"推荐流程·生成后 ASR 自查"。