通义万相视频编辑统一模型(vace)支持多种视频编辑功能:
| 功能 | 说明 |
|---|---|
| 多图参考 | 参考多张图像(主体与背景),生成连贯的视频内容 |
| 视频重绘 | 提取视频特征(动作、构图等),结合提示词生成新视频 |
| 局部编辑 | 对视频指定区域进行增加、修改或删除元素 |
| 视频延展 | 基于图像或视频生成延续性内容,延长至5秒 |
| 视频画面扩展 | 对视频在上、下、左、右四个方向按比例扩展 |
模型名称: wan2.1-vace-plus
处理耗时: 约5-10分钟(具体耗时受限于排队任务数量和服务执行情况)
DASHSCOPE_API_KEYpip install requests由于视频编辑模型处理时间较长,仅支持异步获取模型结果。需要发起两个请求:创建任务获取任务ID,然后根据任务ID查询结果。
参考多张图像(主体与背景),生成连贯的视频内容。
import os
import requests
import time
# 配置API Key
api_key = os.getenv("DASHSCOPE_API_KEY")
base_url = "https://dashscope-intl.aliyuncs.com/api/v1" # 新加坡地域
# 如果使用北京地域,替换为:https://dashscope.aliyuncs.com/api/v1
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
"X-DashScope-Async": "enable"
}
# 步骤1:创建任务
create_url = f"{base_url}/services/aigc/video-generation/video-synthesis"
payload = {
"model": "wan2.1-vace-plus",
"input": {
"function": "image_reference",
"prompt": "视频中,一位女孩自晨雾缭绕的古老森林深处款款走出,她步伐轻盈,镜头捕捉她每一个灵动瞬间。当她站定,环顾四周葱郁林木时,她脸上绽放出惊喜与喜悦交织的笑容。这一幕,定格在了光影交错的瞬间,记录下她与大自然的美妙邂逅。",
"ref_images_url": [
"http://wanx.alicdn.com/material/20250318/image_reference_2_5_16.png",
"http://wanx.alicdn.com/material/20250318/image_reference_1_5_16.png"
]
},
"parameters": {
"prompt_extend": True,
"obj_or_bg": ["obj", "bg"],
"size": "1280*720"
}
}
response = requests.post(create_url, headers=headers, json=payload)
result = response.json()
print("创建任务响应:", result)
if response.status_code == 200 and "output" in result:
task_id = result["output"]["task_id"]
print(f"任务ID: {task_id}")
# 步骤2:轮询查询任务结果
query_url = f"{base_url}/tasks/{task_id}"
while True:
time.sleep(30) # 每30秒查询一次
query_response = requests.get(query_url, headers={"Authorization": f"Bearer {api_key}"})
query_result = query_response.json()
task_status = query_result["output"]["task_status"]
print(f"任务状态: {task_status}")
if task_status == "SUCCEEDED":
video_url = query_result["output"]["video_url"]
print(f"视频生成成功!URL: {video_url}")
break
elif task_status == "FAILED":
print(f"任务失败: {query_result['output'].get('message', '未知错误')}")
break
else:
print(f"创建任务失败: {result}")
提取视频特征(动作、构图等),结合提示词生成新视频。
import os
import requests
import time
api_key = os.getenv("DASHSCOPE_API_KEY")
base_url = "https://dashscope-intl.aliyuncs.com/api/v1"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
"X-DashScope-Async": "enable"
}
# 创建任务
create_url = f"{base_url}/services/aigc/video-generation/video-synthesis"
payload = {
"model": "wan2.1-vace-plus",
"input": {
"function": "video_repainting",
"prompt": "视频展示了一辆黑色的蒸汽朋克风格汽车,绅士驾驶着,车辆装饰着齿轮和铜管。背景是蒸汽驱动的糖果工厂和复古元素,画面复古与趣味。",
"video_url": "http://wanx.alicdn.com/material/20250318/video_repainting_1.mp4"
},
"parameters": {
"prompt_extend": False,
"control_condition": "depth"
}
}
response = requests.post(create_url, headers=headers, json=payload)
result = response.json()
if response.status_code == 200 and "output" in result:
task_id = result["output"]["task_id"]
print(f"任务ID: {task_id}")
# 轮询查询结果
query_url = f"{base_url}/tasks/{task_id}"
while True:
time.sleep(30)
query_response = requests.get(query_url, headers={"Authorization": f"Bearer {api_key}"})
query_result = query_response.json()
task_status = query_result["output"]["task_status"]
print(f"任务状态: {task_status}")
if task_status == "SUCCEEDED":
video_url = query_result["output"]["video_url"]
print(f"视频生成成功!URL: {video_url}")
break
elif task_status == "FAILED":
print(f"任务失败: {query_result['output'].get('message', '未知错误')}")
break
对视频指定区域进行增加、修改或删除元素。
import os
import requests
import time
api_key = os.getenv("DASHSCOPE_API_KEY")
base_url = "https://dashscope-intl.aliyuncs.com/api/v1"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
"X-DashScope-Async": "enable"
}
# 创建任务
create_url = f"{base_url}/services/aigc/video-generation/video-synthesis"
payload = {
"model": "wan2.1-vace-plus",
"input": {
"function": "video_edit",
"prompt": "视频展示了一家巴黎风情的法式咖啡馆,一只穿着西装的狮子优雅地品着咖啡。它一手端着咖啡杯,轻轻啜饮,神情惬意。咖啡馆装饰雅致,柔和的色调与温暖灯光映照着狮子所在的区域。",
"mask_image_url": "http://wanx.alicdn.com/material/20250318/video_edit_1_mask.png",
"video_url": "http://wanx.alicdn.com/material/20250318/video_edit_2.mp4",
"mask_frame_id": 1
},
"parameters": {
"prompt_extend": False,
"mask_type": "tracking",
"expand_ratio": 0.05
}
}
response = requests.post(create_url, headers=headers, json=payload)
result = response.json()
if response.status_code == 200 and "output" in result:
task_id = result["output"]["task_id"]
print(f"任务ID: {task_id}")
# 轮询查询结果
query_url = f"{base_url}/tasks/{task_id}"
while True:
time.sleep(30)
query_response = requests.get(query_url, headers={"Authorization": f"Bearer {api_key}"})
query_result = query_response.json()
task_status = query_result["output"]["task_status"]
print(f"任务状态: {task_status}")
if task_status == "SUCCEEDED":
video_url = query_result["output"]["video_url"]
print(f"视频生成成功!URL: {video_url}")
break
elif task_status == "FAILED":
print(f"任务失败: {query_result['output'].get('message', '未知错误')}")
break
基于图像或视频生成延续性内容,延长至5秒。
import os
import requests
import time
api_key = os.getenv("DASHSCOPE_API_KEY")
base_url = "https://dashscope-intl.aliyuncs.com/api/v1"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
"X-DashScope-Async": "enable"
}
# 创建任务
create_url = f"{base_url}/services/aigc/video-generation/video-synthesis"
payload = {
"model": "wan2.1-vace-plus",
"input": {
"function": "video_extension",
"prompt": "一只戴着墨镜的狗在街道上滑滑板,3D卡通。",
"first_clip_url": "http://wanx.alicdn.com/material/20250318/video_extension_1.mp4"
},
"parameters": {
"prompt_extend": False
}
}
response = requests.post(create_url, headers=headers, json=payload)
result = response.json()
if response.status_code == 200 and "output" in result:
task_id = result["output"]["task_id"]
print(f"任务ID: {task_id}")
# 轮询查询结果
query_url = f"{base_url}/tasks/{task_id}"
while True:
time.sleep(30)
query_response = requests.get(query_url, headers={"Authorization": f"Bearer {api_key}"})
query_result = query_response.json()
task_status = query_result["output"]["task_status"]
print(f"任务状态: {task_status}")
if task_status == "SUCCEEDED":
video_url = query_result["output"]["video_url"]
print(f"视频生成成功!URL: {video_url}")
break
elif task_status == "FAILED":
print(f"任务失败: {query_result['output'].get('message', '未知错误')}")
break
对视频在上、下、左、右四个方向按比例扩展。
import os
import requests
import time
api_key = os.getenv("DASHSCOPE_API_KEY")
base_url = "https://dashscope-intl.aliyuncs.com/api/v1"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
"X-DashScope-Async": "enable"
}
# 创建任务
create_url = f"{base_url}/services/aigc/video-generation/video-synthesis"
payload = {
"model": "wan2.1-vace-plus",
"input": {
"function": "video_outpainting",
"prompt": "一位优雅的女士正在激情演奏小提琴,她身后是一支完整的交响乐团。",
"video_url": "http://wanx.alicdn.com/material/20250318/video_outpainting_1.mp4"
},
"parameters": {
"prompt_extend": False,
"top_scale": 1.5,
"bottom_scale": 1.5,
"left_scale": 1.5,
"right_scale": 1.5
}
}
response = requests.post(create_url, headers=headers, json=payload)
result = response.json()
if response.status_code == 200 and "output" in result:
task_id = result["output"]["task_id"]
print(f"任务ID: {task_id}")
# 轮询查询结果
query_url = f"{base_url}/tasks/{task_id}"
while True:
time.sleep(30)
query_response = requests.get(query_url, headers={"Authorization": f"Bearer {api_key}"})
query_result = query_response.json()
task_status = query_result["output"]["task_status"]
print(f"任务状态: {task_status}")
if task_status == "SUCCEEDED":
video_url = query_result["output"]["video_url"]
print(f"视频生成成功!URL: {video_url}")
break
elif task_status == "FAILED":
print(f"任务失败: {query_result['output'].get('message', '未知错误')}")
break
| 参数 | 类型 | 必选 | 说明 |
|---|---|---|---|
| model | string | 是 | 模型名称,固定为 wan2.1-vace-plus |
| input.function | string | 是 | 功能名称 - image_reference:多图参考 - video_repainting:视频重绘 - video_edit:局部编辑 - video_extension:视频延展 - video_outpainting:视频画面扩展 |
| input.prompt | string | 是 | 提示词,描述期望生成的视频内容 长度不超过800字符 |
| parameters.prompt_extend | bool | 否 | 是否开启prompt智能改写 - true:默认值,开启 - false:关闭(推荐) |
| parameters.seed | integer | 否 | 随机数种子,范围[0, 2147483647] |
| parameters.watermark | bool | 否 | 是否添加"AI生成"水印 - false:默认值,不添加 - true:添加 |
| 参数 | 类型 | 必选 | 说明 |
|---|---|---|---|
| input.ref_images_url | array[string] | 是 | 参考图像URL数组,支持1-3张图像 |
| parameters.obj_or_bg | array[string] | 否 | 标识每张图像的用途 - obj:主体参考 - bg:背景参考(最多1个) 长度必须与ref_images_url一致 |
| parameters.size | string | 否 | 视频分辨率 - 1280*720(默认,16:9) - 720*1280(9:16) - 960*960(1:1) - 832*1088(3:4) - 1088*832(4:3) |
| 参数 | 类型 | 必选 | 说明 |
|---|---|---|---|
| input.video_url | string | 是 | 输入视频URL,长度不超过5秒 |
| input.ref_images_url | array[string] | 否 | 参考图像URL数组,仅支持1张 |
| parameters.control_condition | string | 是 | 视频特征提取方式 - posebodyface:提取脸部表情和肢体动作 - posebody:提取肢体动作(不含脸部) - depth:提取构图和运动轮廓 - scribble:提取线稿结构 |
| parameters.strength | float | 否 | 控制强度,范围[0.0, 1.0],默认1.0 |
| 参数 | 类型 | 必选 | 说明 |
|---|---|---|---|
| input.video_url | string | 是 | 输入视频URL,长度不超过5秒 |
| input.mask_image_url | string | 否 | 掩码图像URL(白色区域为编辑区域) |
| input.mask_frame_id | integer | 否 | 掩码目标所在帧ID,默认为1(首帧) |
| input.mask_video_url | string | 否 | 掩码视频URL(与mask_image_url二选一) |
| input.ref_images_url | array[string] | 否 | 参考图像URL数组,仅支持1张 |
| parameters.mask_type | string | 否 | 编辑区域行为方式 - tracking:默认值,动态跟随 - fixed:固定不变 |
| parameters.expand_ratio | float | 否 | 掩码区域扩展比例,范围[0.0, 1.0],默认0.05 |
| parameters.expand_mode | string | 否 | 掩码区域形状 - hull:默认值,多边形 - bbox:矩形 - original:原始形状 |
| 参数 | 类型 | 必选 | 说明 |
|---|---|---|---|
| input.first_frame_url | string | 否 | 首帧图像URL |
| input.last_frame_url | string | 否 | 尾帧图像URL |
| input.first_clip_url | string | 否 | 首段视频URL,长度不超过3秒 |
| input.last_clip_url | string | 否 | 尾段视频URL,长度不超过3秒 |
| input.video_url | string | 否 | 参考视频URL,用于提取运动特征 |
| parameters.control_condition | string | 否 | 视频特征提取方式(使用video_url时必选) - posebodyface:提取脸部表情和肢体动作 - depth:提取构图和运动轮廓 |
| 参数 | 类型 | 必选 | 说明 |
|---|---|---|---|
| input.video_url | string | 是 | 输入视频URL,长度不超过5秒 |
| parameters.top_scale | float | 否 | 向上扩展比例,范围[1.0, 2.0],默认1.0 |
| parameters.bottom_scale | float | 否 | 向下扩展比例,范围[1.0, 2.0],默认1.0 |
| parameters.left_scale | float | 否 | 向左扩展比例,范围[1.0, 2.0],默认1.0 |
| parameters.right_scale | float | 否 | 向右扩展比例,范围[1.0, 2.0],默认1.0 |
{
"output": {
"task_status": "PENDING",
"task_id": "0385dc79-5ff8-4d82-bcb6-xxxxxx"
},
"request_id": "4909100c-7b5a-9f92-bfe5-xxxxxx"
}
{
"request_id": "851985d0-fbba-9d8d-a17a-xxxxxx",
"output": {
"task_id": "208e2fd1-fcb4-4adf-9fcc-xxxxxx",
"task_status": "SUCCEEDED",
"submit_time": "2025-05-15 16:14:44.723",
"scheduled_time": "2025-05-15 16:14:44.750",
"end_time": "2025-05-15 16:20:09.389",
"video_url": "https://dashscope-result-wlcb.oss-cn-wulanchabu.aliyuncs.com/xxx.mp4?xxxxxx",
"orig_prompt": "视频中,一位女孩自晨雾缭绕的古老森林深处款款走出...",
"actual_prompt": "一位身着浅色长裙的女孩从晨雾缭绕的古老森林深处缓缓走出..."
},
"usage": {
"video_duration": 5,
"video_ratio": "standard",
"video_count": 1
}
}
如果您的业务对安全性要求较高,需要配置外网访问白名单,请将以下OSS域名添加到白名单:
dashscope-result-bj.oss-cn-beijing.aliyuncs.com
dashscope-result-hz.oss-cn-hangzhou.aliyuncs.com
dashscope-result-sh.oss-cn-shanghai.aliyuncs.com
dashscope-result-wlcb.oss-cn-wulanchabu.aliyuncs.com
dashscope-result-zjk.oss-cn-zhangjiakou.aliyuncs.com
dashscope-result-sz.oss-cn-shenzhen.aliyuncs.com
dashscope-result-hy.oss-cn-heyuan.aliyuncs.com
dashscope-result-cd.oss-cn-chengdu.aliyuncs.com
dashscope-result-gz.oss-cn-guangzhou.aliyuncs.com
dashscope-result-wlcb-acdr-1.oss-cn-wulanchabu-acdr-1.aliyuncs.com