wan3-workflow.md 20 KB

百炼 wan3(万相3.0)视频生成工作流参考

本文件取代原 jimeng-workflow.md,定义技能对接阿里云百炼 · 万相 3.0(wan3.0-video)的工程要点。技能所有"调用 AI 视频接口"的步骤都以本文件为准。

一、模型与能力边界(决定技能流程)

  • 模型:wan3.0-video(标准版)/ wan3.0-video-prime(高速版)。All-in-One,按 input.media 的 type 与 prompt 意图自动路由任务类型。
  • 单段时长上限 30 秒 / 30fps:直接满足技能"一个片段 ≤30 秒"的硬约束。
  • 原生音视频:一次调用即生成"画面 + 原生语音对白 + BGM + 音效",且原生对口型。因此口播无需单独 TTS 再对口型——把口播写进 prompt 作为对白,音色文件作为 reference_audio 传入即可。
  • 多模态参考(最多 20 个素材):图片 ≤10 张(单张 ≤20MB)、音频 ≤5 段(单段 ≤15s、≤15MB)、视频 ≤5 段。本技能只用"图片参考 + 音频参考"。
  • 参考引用语法(重要坑·2026-09-18 修正):media 数组顺序在内部对应素材即可,绝不能在 prompt 文本里写 Image 1 / Image 2 / Audio 1 这类标记。实测 wan3 会把 prompt 中出现的 Image N/Audio N 文字当成对白直接念出来,形成"开头莫名其妙的一段话"(BUG B)。正确做法:用自然语言描述画面与音色,例如"一位女性…身处怡呵美门店内…""原生清晰女声普通话对白(音色参考随附音频)",不出现任何 Image N/Audio N 字样。素材内容靠 media 数组顺序与画面/音色描述间接对应,不必显式编号。
  • 不支持二次创作:wan3 虽有视频编辑 / 延长模式,但技能第 8 条要求"每次修改都重新组装完整脚本重发",故只用文生/参考生视频一种模式,禁用 edit / extend。

二、接口与鉴权

  • 异步调用:HTTP 仅支持异步,必须带请求头 X-DashScope-Async: enable。
  • 端点(注意 {WorkspaceId} 与 region):
    • 北京:https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1/services/aigc/video-generation/video-synthesis
    • 新加坡:https://{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。密钥必须走环境变量,禁止写死。
  • 地域一致:模型、Endpoint、API Key 必须同地域,跨地域调用会失败(本片 workspace 在 cn-beijing,Key 也须为 cn-beijing 地域)。
  • 流程:创建任务 → 拿 task_id(24h 有效)→ 轮询 tasks/{task_id} 至 SUCCEEDED → 取 output.video_url → 下载。

三、素材 → wan3 参考映射(技能固定 3 项 + 自动 2 类)

素材 来源 media type prompt 引用 约束
人物完整形象照 生成物料:以 character_5view + uniform_detail(固定素材)为参考生成并确认(见 asset-collection.md 第二节) reference_image Image 1 全片同脸/同发型/同年龄感/同制服;胸牌样式与确认稿一致、不可变更
门店空间实景图(按动线 zone 选取) 技能内置资源:从 assets/store-spatial-index/ 按动线 zone 选取对应 zone 实景图(见第二节),LOGO 随实景自然呈现 reference_image Image 2 按动线 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 由 Shot 表算出,≤30 秒)

一个 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 的「分镜内容」,wan3 原生生成语音并对口型;{} 之外的是画面/运镜描述,不会被当台词。
  • 人物行为动线按口播时长设计:单段(不论 T 长短)动作切换 ≤2 个、方向不反向(见 SKILL Step 8 元素 25);动作幅度随 T 伸缩,短于 30 秒更不宜多。
  • 运镜每条约 2–3 种按时间轴穿插,不全程单一机位;插画展示方式一场内可混用多种,不恒定为一种;门店丰富元素随机点缀 2–3 个,增加景深与真实感。
  • 时间戳即控速锚点(关键):Shot N [x-y s] 连续铺满本段总时长 T(即 0→T,如 0–26s),既是分镜结构也是节奏约束,也等于 duration 的实际值。T 由各 Shot 时长求和得出,必须 ≤30。wan3 实测在「强制时长 > 口播实际长度」的空白时段会自动编造废话填充(padding 幻觉),故 Shot 时间分配须让台词真实撑满时间戳区间——靠放慢语速 + 句间留足气口,而非空撑时长。推荐直接传算出的 T(不要硬撑到 30);若内容确实偏短,可改用 −1 智能时长(按内容自动定长,上限 30s)。
  • 时长参数 duration 须传本段算出的 T(各 Shot 时长之和,≤30),不要写死 30;ratio=9:16,resolution 按 config;若口播偏短或要规避 padding,也可设 −1 智能时长(按内容自动定长,上限 30s)。
  • 反向约束(硬性禁令)也写进 prompt 负向描述:无字幕/无文字/无卡通化/无塑料皮肤/无变脸/无服装漂移/无场景跳变。

五、LOGO 落位(保证成片一定出现 LOGO)

怡呵美 LOGO 不另行生成,随门店空间实景图自然呈现在成片:

  1. 门店场景直接采用 assets/store-spatial-index/ 的 zone 实景图(品牌墙 Z01「YIHEMEI 你的水光肌肤管理师」/ 发光字展柜 Z02 等本身就含怡呵美 LOGO),动线主场景若途经含 LOGO 的 zone,LOGO 即在画面中。
  2. 若某 Shot 所在 zone 实景图不含 LOGO、但成片需要在该处露出品牌,应在动线规划时改选含 LOGO 的 zone(如 Z01 品牌墙 / Z02 发光字展柜),而非事后合成。
  3. 门店空间实景图直接作为 Image 2 传入 wan3;不单独提交任何 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 给用户确认。

七、常见坑

  • 模型/Endpoint/Key 跨地域 → 直接失败,务必同地域。本片 workspace 在 cn-beijing,Key 也须 cn-beijing 地域。
  • 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"。

实测新增坑(2026-09-17 ~ 09-18,去角质频率项目验证)

  • 坑1 · Image N/Audio N 被当对白念出(BUG B):在 prompt 文本里出现的 Image 1/Audio 1 等素材编号会被 wan3 当成台词念出来,表现为"片头莫名其妙的一段话"。解法:prompt 中绝不写 Image N/Audio N,改用自然语言描述画面与音色(如"一位女性…门店内…""音色参考随附音频")。已验证删掉编号后片头干净。
  • 坑2 · 强制时长 > 口播长度 → padding 幻听:当 duration 大于口播真实时长,wan3 会在空白段自动编造语句填充(如结尾冒出"也沒衣服看管的")。解法:让口播内容真实撑满时间戳区间(放慢语速 + 句间气口),或改用 duration=-1 智能时长;不要硬撑空时长。
  • 坑3 · 多音字误读(如"定期"→"顶期"):wan3 端到端 TTS 对多音字消歧不稳定,纯文本时好时坏;拼音标注(如"定(dìng)期")反而会被整段念错(实测读成"定定妻"),不可用。可用近义替换规避:把"定期"换成"订期"(同音 dìng、无歧义、语义贴),或"按周期"/"有规律地"。提交前不要回改用户文案,该替换本身就是防错手段。
  • 推荐流程 · 生成后 ASR 自查:成片下载后用本地 ASR(funasr / faster-whisper,不外传素材)提取音频转文字,逐字核对:①片头是否乱读 ②时间数字/Shot序号是否被念出 ③多音字读音 ④片尾是否 padding 废话。先自查再交付,避免来回试错。详见技能 scripts/ 下的 extract_audio.py + asr_wordlevel.py 用法(从 mp4 抽音频→逐词时间戳)。
  • 参考音频语义前置:reference_audio 本是提取音色,但若样本本身带口播语义,可能被前置到片头。建议从音色源音频的中段裁一段(避开句首)作 ≤15s 样本。

实测新增坑(2026-09-21 · 四季防晒 DDKP-013 系列实战)

  • 坑4 · 场景背景漂移(长镜头/走位段背景被换房间):wan3 在 25–30s 长镜头或人物走位段,会把已锚定的门店背景自行换成陌生房间(品牌墙、吊灯、门全部消失,沙发变样)。解法:在「总体描述」+ 每个 Shot 里逐段锚定该 zone 的参考图元素清单(例如门厅 Z01:品牌墙「YIHEMEI 你的水光肌肤管理师」+ 丝带吊灯 + 白门 + 圆几绿植 + 白沙发;产品区 Z02:怡呵美发光字展柜 + 灯带层板 + 绿植),并在硬规则里写"人物未走位时背景禁止漂移成其他房间"。关键:人物真实经过的过渡空间(如走廊 Z05)必须传实景图,只靠俯瞰图 + 文字描述不够,否则模型会脑补出"幽灵硬件/第二个前台"。zone 实景图与 Z01–Z09 可用区 / U01–U03 禁用区 / V4 开放公共区关系 / 6 条空间锚定硬规则见 references/store-spatial-index.md,图片在 assets/store-spatial-index/,按 zone 文件名选取对应图传入。
  • 坑5 · 口播幻觉加词(句间/句末自行补词):TTS 会在口播文本外自行补词/补句(如"做好防晒"后凭空补"干皮",或把 prompt 表格里的"插画持续""窗口拉满"等元文本当台词念出)。解法:① prompt 内联完整「口播定本」作唯一台词依据(不止是引用文件名);② 显式负面示例"尤其禁止在『X』之后追加『Y』类词;禁止根据画面/主题自行补词";③ 明确写"prompt 其他文字(章节标题 / 表格表头 / 规格标注 / 结构说明)一律不出声"。
  • 坑6 · 单字发音缺陷(非多音字也读错):参考音频只克隆音色、不控制单字发音,个别字会稳定读错(例:"晒"shài→shi)。与坑3(多音字)不同,这连拼音标注都救不了。解法:① 改字绕过(最快,推荐救急)——把易错字换成近义/同音字且字数不变(例:末句"不是只有大太阳才需要防晒的"→"…需要防护的"),不动节奏/时长;② 重截参考音频基本无效(wan3 本就不控发音,且无原 30s 素材时不可行)。
  • 坑7 · 插画内出现人物(两个主角并置):PIP 插画里若出现任何人物/人形轮廓,会与口播真人并置成"两个女主角"。解法:红线——插画只画机理示意 / 物品 / 皮肤特写 / 光线氛围,不得出现任何人物、人形轮廓、手势、人影(生成插画的 prompt 必须显式写"画面中严禁出现任何完整人物或人物形象")。
  • 坑8 · 生成超时续轮询: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,不必重提任务。
  • 补 · 本账号百炼云端 ASR 不可用:qwen3-asr-flash(SDK / 兼容模式 / 原生端点,均 400)与 paraformer-v2 文件转写(403 "current user api does not support synchronous calls",账号未开通)全部拒绝。音频核对只能走本地 ASR(funasr / faster-whisper,不外传素材),见上方"推荐流程·生成后 ASR 自查"。