Vira
# Vira 公开API目录
# API概览
Vira产品提供以下相关API接口。
API | 描述 |
---|---|
GetPresignedUrl | 获取临时上传URL |
FinishUpload | 完成图片上传 |
CreateTask | 创建任务 |
QueryTask | 查询任务状态 |
CreateSceneTask | 创建场景任务 |
# 变更记录
更新日期 | 更新说明 | 描述 |
---|---|---|
2025.01.20 | 新增场景 | 新增场景: hair_swap(AI 换发), interaction(双人互动), lunar_newyear(春节特效), youth_rewind(童年回忆), dynasty_dress(古风换装), love_pose(全家福比心), wish_sender(财神特效) |
2025.01.19 | 支持2.0版本模型 | CreateTask接口参数变更: 1. ModelVersion 模型版本 新增模型版本:2.0, 仅支持img2video、headtailimg2video两种任务类型 |
2025.01.03 | 新增场景 | 新增场景: live_photo(实况照片), emotionlab(情绪特效), live_memory(复活老照片) |
2024.12.13 | 新增场景任务接口 | 新增场景任务创建接口,支持场景: Hug(拥抱), Kiss(亲吻), Christmas(圣诞特效), MorphLab(变形特效) |
2024.12.13 | 新增QueryTask接口任务状态,版本控制 | QueryTask接口新增可选参数Version State字段新增状态(Version为1.5.1版本生效): queueing 队列中 scheduling 任务调度中 processing 创建中 |
2024.11.28 | 支持1.5版本模型 | CreateTask接口新增参数: 1. ModelVersion 模型版本 2. Resolution 分辨率 3.MovementAmplitude 运动幅度 4. AspectRatio 宽高比 |
2024.11.28 | 支持参考生视频、多主体生成视频 | CreateTask接口Type参数新增: 1. character2video 参考生视频 2. headtailimg2video 首尾帧 |
2024.11.28 | 更新QueryTask接口数据返回格式 | QueryTask接口返回格式变更: 新增: 1. Prompts 提示词列表 2. Creations 生成物列表 去除: 1.VideoUrl 视频链接 2.CoverUrl 封面视频 3.ImageUrl 图像链接 4. Text 提示词 |
# 实例相关
# 1.GetPresignedUrl
Action: GetPresignedUrl
描述: 获取临时上传链接, 有效期1小时
请求地址: api.capitalonline.net/platform/vira
请求方法: GET
请求参数:
无
请求示例:
python:
def get_presigned_url():
action = "GetPresignedUrl"
method = "GET"
param = {}
url = get_signature(action, ak, sk, method, VIRA_URL, param)
resp = requests.get(url)
result = json.loads(resp.content)
return result
2
3
4
5
6
7
8
9
返回参数说明:
名称 | 类型 | 示例值 | 描述 | |
---|---|---|---|---|
PutUrl | string | https://uploads.vira.zone/tmp/viraxxxxxxxx | 临时上传URL | |
ResourceId | string | 8c5b193a-610e-42ec-b3d7-d750xxxxxxxx | 资源ID |
返回示例:
{
"Code": "Success",
"Msg": "success",
"Data": {
"PutUrl": "https://uploads.vira.zone/tmp/vira/2474806830488541/24/1114/052204-sR72Xhrhll3rUPcJ?Expires=1731565324&Signature=Zag7IAkDXNYSD4BcMB7Tk5UpnZmtS6RjRcXJKGbwIvLTpOH5Aw5KHUe~2iC0h2NLCfh5O3eMbARQQe~GgpgMfI~ApQBVJIMAzyDfMnE8AWC-s8-330M9T9Ld3sPNlOPWGr1W6HLKWAI52nT7yrc0Q4wawwAk2l3NtNEMbUBlGffqgX1yZgBCbEpeqMlR~BgSVXDGH-N4imU95myVhLo8Teez8XpGrWwTbKdtPfi8CWzZ0S3Dhi9uSnGflPK1kY2pkd47JvZ45-zg~hmdUPB9sLIqBzUCDklwnBWVvW9wfOZyaC8fhVPfACV0dnPy9Hg0~foFuQB5AwTJFyOP9cJ-mA__&Key-Pair-Id=K3DNVHKWMZJUYO",
"ResourceId": "2518629169423677"
},
"RequestId": "9f34a3ae-5314-47c3-be4a-98f59d34f379"
}
2
3
4
5
6
7
8
9
# 2. 上传图片
Action: 无
描述: 根据临时上传地址,上传图片;关键参数:临时上传地址,文件目录
请求地址: GetPresignedUrl接口返回的PutUrl
请求方法: PUT
请求参数:
请求示例:
def up_load(self, up_load_url, file_path):
headers = {'Content-Type': 'image/jpeg'}
with open(file_path, 'rb') as file:
resp = requests.put(up_load_url, data=file, headers=headers)
etag = resp.headers.get('ETag')[1:-1]
print(resp.headers)
return etag
curl:
curl - v - H
"Content-Type: image/png" - XPUT - -data - binary
'@/Users/csxwx/upload.png'
{put_url_example}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
返回参数说明: 无
返回示例:
return headers: e89d5e7471697f93312b37ed363c7c1a
return headers:
{
'Content-Length': '0',
'Connection': 'keep-alive',
'Date': 'Thu, 14 Nov 2024 05:27:06 GMT',
'x-amz-expiration': 'expiry-date="Fri, 22 Nov 2024 00:00:00 GMT", rule-id="delete-for-7-days"',
'x-amz-server-side-encryption': 'AES256',
'ETag': '"e89d5e7471697f93312b37ed363c7c1a"',
'Server': 'AmazonS3',
'X-Cache': 'Miss from cloudfront',
'Via': '1.1 af20b510de9d2ffdf592bdca91fc8b42.cloudfront.net (CloudFront)',
'X-Amz-Cf-Pop': 'SZX51-E1',
'X-Amz-Cf-Id': '_DszqP264fDyrKzkU8thgzaQMQ48bQV4rvQ4R55kcamxz73IHvIqHg==',
'Vary': 'Origin'
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 3.FinishUpload
Action: FinishUpload
描述: 确认完成上传
请求地址: api.capitalonline.net/platform/vira
请求方法: POST
请求参数:
参数名 | 必选 | 类型 | 说明 | |
---|---|---|---|---|
ResourceId | 是 | string | 资源ID | |
Etag | 是 | string | 文件Etag |
请求示例:
def finish(etag, resource_id):
action = "FinishUpload"
method = "POST"
param = {}
body = {
"ResourceId": resource_id,
"Etag": etag
}
print(body)
url = get_signature(action, ak, sk, method, VIRA_URL, param)
resp = requests.post(url, json=body)
result = json.loads(resp.content)
print(result)
return result
2
3
4
5
6
7
8
9
10
11
12
13
14
返回参数说明:
参数名 | 必选 | 类型 | 说明 | |
---|---|---|---|---|
Url | string | 图像在线链接 |
返回示例:
{
"Code": "Success",
"Msg": "success",
"Data": {
"Url": "ssupload:?id=2518629169423678"
},
"RequestId": "40dfb74f-8497-4937-a663-f9b428638803"
}
2
3
4
5
6
7
8
# 4.CreateTask
Action: CreateTask
描述: 创建任务
请求地址: api.capitalonline.net/platform/vira
请求方法: POST
请求参数:
字段 | 子字段 | 子字段 | 类型 | 是否必填 | 描述 |
---|---|---|---|---|---|
Type | string | 是 | 任务类型,可选值:text2video(文生), img2video(图生), upscale(智能超清), character2video(参考生), headtailimg2video(首尾帧) | ||
Model | string | 是 | 模型类型,text2video, img2video 文/图任务可选值:vidu-high-performance(高质量);upscale智能超清任务可选值:stable | ||
ModelVersion | string | 是 | 模型版本,text2video, img2video, character2video 文/参考生任务可选值:["1.0", "1.5"]; 图生视频任务可选值:["1.0", "1.5", "2.0"] upscale智能超清任务无需填写 headtailimg2video 首尾帧仅支持["1.5", "2.0"] | ||
Style | string | 是 | 风格,只有text2video任务需要填写,可选值:general(写实), anime(动画) | ||
Input | struct | 是 | 任务输入,一个结构体,包含如下字段 | ||
Enhance | bool | 否 | 是否使用提示词增强功能,默认值为true,启用提示词增强功能 | ||
CreationId | string | 否 | 生成物id(原生成视频id),提交upscale(智能超清)任务时必填,提交其他任务不用填 | ||
Prompts | array | 否 | 提示词,包含type和content | ||
Type | string | type:提示词类型,可选值:text, image | |||
Content | string | content:提示词内容,长度不能大于1000个字符 当type为text时,Content填写提示词 当type为image时,Content填写Finish接口返回的uri | |||
OutputParams | struct | 是 | 任务输出设置,当提交text2video,img2video任务时为必填 | ||
Duration | int | 是 | 视频时长,目前支持4, 8 | ||
Resolution | string | 是 | 分辨率,"1.5"版本模型,Duration为4s时仅支持可选值 512, 720p, 1080p,默认为512, Duration为8s时仅支持 720p "1.0"版本模型, 仅支持512 | ||
MovementAmplitude | string | 否 | 运动幅度,仅"1.5"版本模型选填,可选值 auto, small, medium,large,默认为auto | ||
AspectRatio | string | 否 | 宽高比,仅"1.5"版本模型选填,可选值 16:9, 9:16, 1:1,默认为16:9 |
请求示例:
body:
{
"Type": "img2video",
"Model": "vidu-high-performance",
"Style": "general",
"Moderation": true,
"Input": {
"Enhance": true,
"Prompts": [
{
"Type": "text",
"Content": "在经典的西部风格中,一个表情忧郁的男人凝视着镜头,微微颤抖的嘴唇吐出一口烟雾。他的香烟发出的温暖光芒照亮了他的脸,投下的阴影强调了他的忧郁情绪。他戴着宽边帽,穿着粗犷的衣服,配有弹带。他的靴子放在栏杆上,姿态放松,但眼神中透露出更深的悲伤"
},
{
"Type": "image",
"Content": "ssupload:?id=2518629169423679"
}
]
},
"OutputParams": {
"Duration": 4
}
}
python:
def create_task(uri):
"""
文+图 生视频,type为text为文生视频,type为image为图生视频;同时存在则为图片加文字描述生视频
Prompts:[
{
"Type": "text", # 文生视频
"Content": "在经典的西部风格中,一个表情忧郁的男人凝视着镜头,微微颤抖的嘴唇吐出一口烟雾。他的香烟发出的温暖光芒照亮了他的脸,投下的阴影强调了他的忧郁情绪。他戴着宽边帽,穿着粗犷的衣服,配有弹带。他的靴子放在栏杆上,姿态放松,但眼神中透露出更深的悲伤"
},
{
"Type": "image", # 图生视频
"Content": uri
}
]
"""
action = "CreateTask"
method = "POST"
param = {}
body = {
"Type": "img2video",
"Model": "vidu-high-performance",
"Style": "general",
"Moderation": True,
"Input": {
"Enhance": True,
"Prompts": [
{
"Type": "text",
"Content": "在美丽的沙滩上跳舞"
},
{
"Type": "image",
"Content": uri
}
]
},
"OutputParams": {
"Duration": 4
}
}
print(body)
url = get_signature(action, ak, sk, method, VIRA_URL, param)
resp = requests.post(url, json=body)
result = json.loads(resp.content)
print(result)
return result
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
返回参数说明:
名称 | 类型 | 示例值 | 描述 | |
---|---|---|---|---|
TaskId | string | 41dd9226-558d-40d3-b300-64151725c514 | 任务ID | |
RequestId | string | 41dd9226-558d-40d3-b300-64151725c514 | 请求request_id |
返回示例:
{
"Code": "Success",
"Msg": "任务发送成功!",
"Data": {
"TaskId": "c76bc1ce-662a-4950-9af9-db40541b40d9"
},
"RequestId": "2d50c507-76ee-42a8-b50a-025b54694619"
}
2
3
4
5
6
7
8
# 5.QueryTask
Action: QueryTask
描述: 查询任务
请求地址: api.capitalonline.net/platform/vira
请求方法: POST
请求参数:
参数名 | 必选 | 类型 | 说明 | |
---|---|---|---|---|
TaskId | 是 | string | 任务id | |
ApiVersion | 否 | string | 接口版本, 可选值 1.5.0 1.5.1(默认) |
请求示例:
def query_task(self, task_id):
action = "QueryTask"
method = "POST"
param = {}
body = {
"TaskId": task_id
}
print(body)
url = get_signature(action, ak, sk, method, VIRA_URL, param)
resp = requests.post(url, json=body)
result = json.loads(resp.content)
return result
2
3
4
5
6
7
8
9
10
11
12
返回参数说明:
名称 | 子字段 | 子字段 | 类型 | 示例值 | 描述 | |
---|---|---|---|---|---|---|
State | string | 任务状态, 包含: created 任务已提交 queueing 队列中 scheduling 任务调度中 processing 创建中 success 成功 failed 失败 | 任务状态 | |||
Duration | int | 4 | 视频时长 | |||
TaskId | string | "1b21995c-a929-453b-8f49-272f239c79f9" | 任务ID | |||
RequestId | string | "1b21995c-a929-453b-8f49-272f239c79f9" | 生成视频请求ID | |||
ModelVersion | string | "1.5" | 模型版本 | |||
Prompts | array | 提示词,包含type和content | ||||
Type | string | "text" | 提示词类型 | |||
Content | string | "挥一挥手" | 提示词内容 | |||
Creations | array | 生成物列表 | ||||
CreationId | string | "2495021556111111" | 生成物ID | |||
CoverUrl | string | "http://xxxxx_cover.jpeg.?AWSAccessKeyId=xxxx&Signature=xxx&Expires=1730992632" | 封面图URL | |||
VideoUrl | string | "http://xxxxx_cover.mp4.?AWSAccessKeyId=xxxx&Signature=xxx&Expires=1730992632" | 视频URL | |||
TaskType | string | "character2video" | 任务类型 | |||
Resolution | string | "512" | 清晰度 | |||
RequestId | string | "e7f7e137-7e42-4999-b626-4b2ca45642ef" | 请求ID |
返回示例:
{
"Code": "Success",
"Msg": "查询成功!",
"Data": {
"State": "success",
"Duration": 8,
"TaskId": "b690f2fb-87ac-4d71-bce9-0ea8b0f041d0",
"RequestId": "b690f2fb-87ac-4d71-bce9-0ea8b0f041d0",
"TaskType": "character2video",
"CreateTime": "2024-11-27 17:13:10",
"Prompts": [
{
"Type": "text",
"Content": "在经典的西部风格中,一个表情忧郁的男人凝视着镜头"
},
{
"Type": "image",
"Content": "ssupload:?id=2537258814324286"
}
],
"Creations": [
{
"CreationId": "2495037781129732",
"CoverUrl": "http://oss-cnbj01.cdsgss.com/xxx",
"VideoUrl": "http://oss-cnbj01.cdsgss.com/xxx"
}
]
},
"ModelVersion": "1.5",
"RequestId": "de569a9a-ac9f-11ef-858c-283a4d3d6658"
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 6.CreateSceneTask
Action: CreateSceneTask
描述: 创建场景任务
请求地址: api.capitalonline.net/platform/vira
请求方法: POST
请求参数:
字段 | 子字段 | 子字段 | 类型 | 是否必填 | 描述 |
---|---|---|---|---|---|
Scene | string | 是 | 场景, 用来指定特定场景, 可选值: hug, kiss, christmas, morphlab, live_photo, emotionlab, live_memory,emotionlab, live_memory, hair_swap, interaction, lunar_newyear, youth_rewind, dynasty_dress, love_pose, wish_sender | ||
Input | struct | 是 | 任务输入,一个结构体,包含如下字段 | ||
Prompts | array | 是 | 提示词,包含type和content | ||
Type | string | 是 | type:提示词类型,可选值:text, image | ||
Content | string | 是 | content:提示词内容,长度不能大于1000个字符 当type为text时,Content填写提示词 当type为image时,Content填写Finish接口返回的uri,仅支持一张图片 |
提示词输入指南:
- 必须输入提示词,且提示词格式尽量参考我们规定的格式,如果大幅缩短提示词会出现效果不佳的情况;
- 一般情况下,您无需改动提示词,我们提供的默认提示词对人像、物体,建筑等多种类型的图片都生效;
- 如果您有个性化的需求,也可以在不改变结构和大部分内容的情况下,对输入的提示词进行调整尝试。
场景提示词:
Scene | 场景 | 效果说明 | 提示词 |
---|---|---|---|
hug | 拥抱 | 拥抱 | 拥抱 |
kiss | 亲吻 | 亲吻 | 亲吻 |
christmas | 圣诞特效 | 变身为圣诞老人 | 视频内容\\n画面中的人物从下前方轻轻举起鲜红的布,动作干净利落地将其从头覆盖到全身,然后随着人物将红布迅速向下扯下,人物变成了充满节日气息的圣诞老人。\\n# 要求\\n1.Style设定为:Realistic, HD\\n2.根据用户上传图片确定人物数量,不要出现[一群人]、[们]等代词而是精准地指出人物数量\\n3.如果用户上传图片有多个人物,则他们需要一起举起红布,所有人都变身为圣诞老人。不要出现图片中没有的人物 |
christmas | 圣诞特效 | 圣诞老人来送礼 | 视频内容\\n镜头中人物看向右边,然后一个圣诞老人满面笑容地从右边走入画面,手中捧着一个精美的礼物盒。他轻轻将礼物递给画面中的人物,动作自然且充满温暖。镜头聚焦在接到礼物的人物,人物神情中充满惊喜与感激。画面捕捉到人物的微表情和互动细节。\\n# 要求\\n1.Style设定为:Realistic, HD\\n2.根据用户上传图片确定人物数量,不要出现[一群人]、[们]等代词而是精准地指出人物数量\\n3.如果用户上传图片有多个人物,则他们需要一起举起红布,所有人都变身为圣诞老人。不要出现图片中没有的人物 |
christmas | 圣诞特效 | 圣诞节举杯庆祝 | 视频内容\\n画面人物手里拿起香槟酒杯,庆祝圣诞快乐,随着镜头拉远,画面出现圣诞树等圣诞节日物品\\n# 要求\\n1.Take a step-by-step approach in your response\\n2.以我的视频描述为第一要素,背景的描述统一、合理,不要描述两次.\\n3.根据用户上传图片确定人物数量,不要出现[一群人]、[们]等代词而是精准地指出人物数量\\n4.Motion Level 设定为:Middle\\n5.如果用户上传图片有多个人物,每个人都需要拿起香槟酒杯。不要出现图片中没有的人物 |
christmas | 圣诞特效 | 圣诞老人来拥抱 | 视频内容\\n镜头中人物看向画面外,接着一个圣诞老人满面笑容地从画面外走入画面,然后和人物拥抱,动作自然且充满温暖,镜头聚焦在一个温暖的拥抱,画面捕捉到人物的的微表情和互动细节\\n# 要求\\n1.根据人物的位置和状态合理的设计动作,而不是突兀的直接拥抱,要先描写人物转变到一个合适拥抱的姿势\\n2.Take a step-by-step approach in your response\\n3.根据用户上传图片确定人物数量,不要出现[一群人]、[们]等代词而是精准地指出人物数量\\n4.如果图片中有多个人物,则需要一起和圣诞老人拥抱。不要出现图片中没有的人物\\n5.强调只有1个圣诞老人 |
morphlab | 变形特效 | 膨胀 | 视频内容\\n画面中主体开始膨胀变形,变得越来越大,越来越圆,就像一个气球,慢慢飘了起来\\n# 要求\\n1.根据用户上传图片确定主体数量,每个主体都要膨胀\\n2.Motion Level 设定为:Middle\\n3.以我的视频内容为第一要素,背景的描述统一、合理,不要描述两次. |
morphlab | 变形特效 | 捏捏 | 视频内容\\n画面开始,主体静止不动。随后,一双大手出现,将主体像橡皮泥般抓住并挤压。\\n随着主体逐渐缩小,被夹在手指间柔软变形\\n# 要求\\n1.根据用户上传图片确定主体数量,每个主体都要被捏扁\\n2.Motion Level 设定为:Middle\\n3.以我的视频内容为第一要素,背景的描述统一、合理,不要描述两次. |
morphlab | 变形特效 | 爆炸 | 视频内容\\n画面开始主体突然爆炸,细碎的颗粒爆炸开来\\n# 要求\\n1.根据用户上传图片确定主体数量,每个主体都要爆炸\\n2.Motion Level 设定为:Middle\\n3.以我的视频内容为第一要素,背景的描述统一、合理,不要描述两次. |
morphlab | 变形特效 | 融化 | 视频内容\\n画面中主体慢慢地开始融化,最终形成一个表面光滑的水坑\\n# 要求\\n1.根据用户上传图片确定主体数量,每个主体都要融化\\n2.Motion Level 设定为:Middle\\n3.以我的视频内容为第一要素,背景的描述统一、合理,不要描述两次. |
live_photo | 实况照片 | 甜美微笑 | 主体面对镜头,露出了甜美动人的微笑 |
live_photo | 实况照片 | 风动 | 主体头发丝被风朝着某一个方向微微吹动 |
live_photo | 实况照片 | 镜头动 | 镜头缓缓拉近,风轻轻吹着主体 |
live_photo | 实况照片 | 走路 | 视频内容\\n画面主体,正对镜头走模特步\\n# 要求\\n1.根据img图片人物状态,设计合适的镜头运动,镜头应该慢慢转变为中景或者牛仔镜头【拉远或者推进】能够显露出人物的大半个身体\\n2.根据img图片人物状态,设计合理的动作转变,最终人物应当面对镜头走模特步\\n3.严格根据图片确定人物外观,不要出现图片没有的人物 |
emotionlab | 情绪特效 | 恐惧 | 视频内容\\n画面主体的表情开始慢慢变化,变得恐惧害怕,眼神里满是无助和惊慌,害怕的大声尖叫\\n# 要求\\n1.根据用户上传图片确定主体数量、人物性别、shot_size,每个主体都是同样的表情变化\\n2.Motion Level 设定为:Middle\\n3.以我的视频内容为第一要素,背景和图片保持一致,不要变化,不要描述两次\\n4.镜头固定不要移动 |
emotionlab | 情绪特效 | 惊讶 | 视频内容\\n图中的人物逐渐露出特别惊讶的表情,眼睛睁大,嘴巴微微张开,透出难以置信的神情。\\n# 要求\\n1.根据用户上传图片确定主体数量、人物性别、shot_size,每个主体都是同样的表情变化\\n2.Motion Level 设定为:Middle\\n3.以我的视频内容为第一要素,背景的描述统一、合理,不要描述两次\\n4.镜头固定不要移动,人物主要是表情变化,人物表情变化要自然 |
emotionlab | 情绪特效 | 微笑 | 视频内容\\n画面主体的表情开始慢慢变化,表情逐渐放松,嘴角轻轻上扬,眼神变得柔和,微笑逐渐展现出温和与宁静的氛围。\\n# 要求\\n1.根据用户上传图片确定主体数量、人物性别、shot_size,每个主体都是同样的表情变化\\n2.Motion Level 设定为:Middle\\n3.以我的视频内容为第一要素,背景的描述统一、合理,不要描述两次\\n4.镜头固定不要移动\\n5.根据人物初始状态选择比较微小的微笑,还是比较开朗的微笑.不要过于夸张的微笑 |
emotionlab | 情绪特效 | 狂笑 | 视频内容\\n画面主体的表情开始慢慢变化,随着心情的放松,眉头慢慢舒展,嘴角开始上扬。然后他的笑容逐渐扩大,眼睛也变得更加明亮,仿佛看到了什么有趣的事物。最终,他大笑起来,嘴巴张得大大的,露出洁白的牙齿,动作夸张\\n# 要求\\n1.根据用户上传图片确定主体数量、人物性别、shot_size,每个主体都是同样的表情变化\\n2.Motion Level 设定为:Middle\\n3.以我的视频内容为第一要素,背景的描述统一、合理,不要描述两次\\n4.镜头固定不要移动,人物表情变化要自然 |
live_memory | 复活老照 | 老照片动起来 | 视频内容\\n视频中的人物们,简单互动,微笑看着屏幕\\n# 要求\\n1.严格根据图片判断有多少个人物,精准简要的描述人物外观\\n2.Motion Level :Small |
hair_swap | AI 换发 | 羊毛卷发型 | 视频内容\\n角色正对镜头不动,眨眨眼睛,头发缓慢转变为“{Curly Wool Hair}”发型\\n# 要求 角色静静地面对镜头,目光平和,眨眨眼睛,头发的变换成为画面的焦点,呈现出一场优雅的发型演化表演。 |
hair_swap | AI 换发 | 脏橘色的羊毛卷发型 | 视频内容\\n角色正对镜头不动,眨眨眼睛,头发缓慢转变为“{Dirty Orange}”的“{Curly Wool Hair}”发型\\n# 要求 角色静静地面对镜头,目光平和,眨眨眼睛,头发的变换成为画面的焦点,呈现出一场优雅的发型演化表演。 |
interaction | 双人互动 | 比心 | 图片中的两个人[简要精准的外观描述]面对镜头,各自伸出一只手,合在一起在胸前比了一个爱心 |
interaction | 双人互动 | 送玫瑰花 | 视频内容\\n镜头左边的人物[简要精准的外观描述、性别描述]拿起一只玫瑰花转身送给图片右边的人物[简要精准的外观描述],右边的人物同样转身,面对面接受玫瑰花\\n# 要求1.Shot Size:镜头缓慢自然的变为Medium Shot;2.Camera Movement:根据图片初始镜头确定镜头是Zoom Out 还是Zoom In才能变为Medium Shot,如果初始镜头为近景则需要Zoom Out,如果初始就是Medium Shot则为None |
lunar_newyear | 春节特效 | 2025新年烟花 | 视频内容\\n视频展示人物手持仙女棒 面对镜头,人物身后绽放新年烟花 烟花上写2025 采用远景视角 动作自然且充满温暖,画面捕捉到人物的的微表情和互动细节 \\n# 要求1.根据人物的位置和状态合理的设计动作.2.Take a step-by-step approach in your response.3.根据用户上传图片确定人物数量,不要出现[一群人]、[们]等代词而是精准地指出人物数量.4.如果图片中有多个人物,则需要一起手持仙女棒。不要出现图片中没有的人物.5.如果图片展示了背景图,则设定为背景并详细描述.6.保证人物始终在画面中心. |
lunar_newyear | 春节特效 | 双人举杯 | 视频内容\\n视频展示新年餐桌上人物拿着香槟高脚杯,干杯庆祝,场面十分红火热闹,动作自然且充满温暖,画面捕捉到人物的的微表情和互动细节.\\n# 要求1.根据人物的位置和状态合理的设计动作.2.Take a step-by-step approach in your response.3.根据用户上传图片确定人物数量,不要出现[一群人],不要出现图片中没有的人物.4.如果图片中有多个人物,则需要一起举杯庆祝。每个只拿一只杯子.5.如果图片展示了背景图,则设定为背景并详细描述.6.保证人物始终在画面中心 颜色温馨自然喜庆,不要黑白色. |
lunar_newyear | 春节特效 | 红包雨 | 视频内容\\n视频展示人物推开屋门 门内在下金光闪闪的红包雨 洒在人物身上 人物很开心。人物动作自然且充满温暖,画面捕捉到人物的的微表情和互动细节 \\n# 要求1.根据人物的位置和状态合理的设计动作.2.Take a step-by-step approach in your response.3.根据用户上传图片确定人物数量,不要出现[一群人]、[们]等代词而是精准地指出人物数量.4.不要出现图片中没有的人物.5.保证人物始终在画面中心.6.推开房门后才洒落红包雨,推开房门前不要蹦出东西.7.洒落的是红色的红包雨不是金币 .8.要有一把真实的门,要有打开房门的动作,红包从门外掉落. |
youth_rewind | 童年回忆 | 童年回忆 | Video content\\n The subject(s) is/are facing the camera, appearing as their 3-year-old self, wearing a red cotton-padded jacket, holding burning sparklers in both hands, and joyfully dancing in the snowy courtyard. The sparklers flicker brightly, casting a warm glow on their happy, smiling faces. The subject(s) performs lively, natural movements, such as waving the sparklers while skipping around, always remaining in the center of the frame. The scene is set in a snowy village courtyard during a festive winter evening, as shown in the provided background. Snow covers the ground and rooftops, while red lanterns hang overhead, glowing warmly in the golden sunlight of dusk. The wooden doors of nearby houses are adorned with festive decorations. The overall ambiance is filled with a nostalgic and joyful Chinese New Year atmosphere. The warm orange tones from the sunlight and the red lanterns harmonize with the vibrant movements of the subject(s), enhancing the festive mood. The steady camera ensures the subject(s) stays at the center of the frame throughout the joyous performance. \\n #Requirements\ 1. The subject(s) in the picture may be pets or one or more people. Generate according to the actual situation in the reference image. 2. The subject(s) should smile and immerse themselves in the festive atmosphere of Chinese New Year. 3. The subject(s) must always remain at the center of the frame, even while joyfully dancing. 4.The subject(s), including any pets, must wear red New Year cotton-padded jackets. |
dynasty_dress | 古风换装 | 童年回忆 | 视频内容\\n一个角色穿着服装和鞋子面对镜头摆pose,眨眨眼睛,甜美微笑\\n# 要求 - 对角色的面部细节详细描述,对服装配饰的各种细节要尽量精准详细的描述.- 如果图片展示了[服装、手提包、配饰、帽子、鞋子],需要出现在对人物的服装描述中.- 如果图片展示了背景图,则设定为背景并详细描述。- 只有1个角色!不要出现任何复数代词.- Shot Size 为:Wide Shot- 角色不要有任何手部动作、腰部动作,强调自然的微笑. |
love_pose | 全家福比心 | 全家福比心 | 视频内容\\n画中的角色面对镜头,抬起双手在胸前,做出比心的动作.\\n# 要求-根据图片判断人物数量,如果有多个人,每个人物都要做出比心的动作。 |
wish_sender | 财神特效 | 和财神比心 | 视频内容\\n 视频展示了红衣服财神角色站在人物角色旁边,他们一起面对镜头,每个人伸出双手各自在自己胸前比心,动作自然且充满温暖。\\n# 要求 1. 如果图片中有多个人物,则每个人各自在自己胸前比心。不要出现图片中没有的人物。2. 强调只有1个财神。3.如果图片展示了背景图,则设定为背景并详细描述。4. 保证人物和财神始终在画面中心。 |
wish_sender | 财神特效 | 财神发金币 | 视频内容\\n 视频展示一个财神角色与人物的互动。财神在人物旁边站立着举起双手向上洒金币,然后金币如雨点般从空中散落下来,主体人物伸出双手开心的抓住2个金币拿在手里,脸上露出惊喜的笑容。红色喜庆背景,充满了中国春节元素,金币细节。\\n# 要求 1.根据图片精准描述人物外观。2.根据图片精准描述财神外观和金币外观。3.如果图片展示了背景图,则设定为背景并详细描述。4.人物和财神时候总保持在画面中心。5.motion_level:small. |
请求示例:
body:
{
"Scene": 'hug',
"Input": {
"Prompts": [
{
"Type": "text",
"Content": "拥抱"
},
{
"Type": "image",
"Content": "ssupload:?id=2518629169423679"
}
]
}
}
python:
def create_scene_task(uri):
"""
拥抱场景
Prompts:[
{
"Type": "text",
"Content": "拥抱"
},
{
"Type": "image",
"Content": uri
}
]
"""
action = "CreateSceneTask"
method = "POST"
param = {}
body = {
"Scene": "hug",
"Input": {
"Prompts": [
{
"Type": "text",
"Content": "拥抱"
},
{
"Type": "image",
"Content": uri
}
]
}
}
print(body)
url = get_signature(action, ak, sk, method, VIRA_URL, param)
resp = requests.post(url, json=body)
result = json.loads(resp.content)
print(result)
return result
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
返回参数说明:
名称 | 类型 | 示例值 | 描述 | |
---|---|---|---|---|
TaskId | string | 41dd9226-558d-40d3-b300-64151725c514 | 任务ID | |
RequestId | string | 41dd9226-558d-40d3-b300-64151725c514 | 请求request_id |
返回示例:
{
"Code": "Success",
"Msg": "任务发送成功!",
"Data": {
"TaskId": "c76bc1ce-662a-4950-9af9-db40541b40d9"
},
"RequestId": "2d50c507-76ee-42a8-b50a-025b54694619"
}
2
3
4
5
6
7
8
# COG模型实例相关
# 1. CreateCogVedioTask
Action: CreateCogVedioTask
描述: 创建视频生成任务
请求地址: api.capitalonline.net/platform/vira
请求方法: POST
请求参数:
字段 | 子字段 | 类型 | 是否必填 | 描述 |
---|---|---|---|---|
Prompt | string | 否 | 提示词 | |
Quality | string | 否 | 输出模式,默认为 "quality"。 "quality":质量优先,生成质量高。 "speed":速度优先,生成时间更快,质量相对降低。 | |
WithAudio | bool | 否 | 是否生成 AI 音效。默认值: False(不生成音效)。 | |
ImageUrl | string | 否 | 提供基于其生成内容的图像。如果传入此参数,系统将以该图像为基础进行操,仅支持可以公网访问的图片URL。图片要求如下:图片支持.png、jpeg、.jpg 格式、图片大小:不超过5M。image_url和prompt二选一或者同时传入。 | |
Size | string | 否 | 默认值: 若不指定,默认生成视频的短边为 1080,长边根据原图片比例缩放。最高支持 4K 分辨率。分辨率选项:720x480、1024x1024、1280x960、960x1280、1920x1080、1080x1920、2048x1080、3840x2160 注意: 当前仅支持图生视频(不适用于文生视频)。 | |
Duration | int | 否 | 视频时长(秒)。可选值为 5 或 10。默认值: 5。 注意: 当前仅支持图生视频(不适用于文生视频) | |
Fps | int | 否 | 视频帧率(FPS),可选值为 30 或 60。默认值: 30。 注意: 当前仅支持图生视频(不适用于文生视频) |
返回参数说明:
名称 | 类型 | 示例值 | 描述 | |
---|---|---|---|---|
TaskId | string | 41dd9226-558d-40d3-b300-64151725c514 | 任务ID | |
RequestId | string | 41dd9226-558d-40d3-b300-64151725c514 | 请求request_id |
请求示例:
def create_cog_task(self, url):
action = "CreateCogVedioTask"
print(url)
method = "POST"
param = {}
body = {
'Duration': 5,
'Prompt': '两个人在旋转跳跃',
'ImageUrl': url}
print(body)
url = get_signature(action, self.ak, self.sk, method, self.url, param)
resp = requests.post(url, json=body)
result = json.loads(resp.content)
print(resp.status_code)
print(result)
return result
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
返回示例:
{
"Code": "Success",
"Msg": "任务发送成功!",
"Data": {
"TaskId": "c76bc1ce-662a-4950-9af9-db40541b40d9"
},
"RequestId": "2d50c507-76ee-42a8-b50a-025b54694619"
}
2
3
4
5
6
7
8
# 2. QueryCogTask
Action: QueryCogTask
描述: 查询任务结果
请求地址: api.capitalonline.net/platform/vira
请求方法: POST
请求参数:
参数名 | 必选 | 类型 | 说明 | |
---|---|---|---|---|
TaskId | 是 | string | 任务id |
返回参数说明:
名称 | 子字段 | 子字段 | 类型 | 示例值 | 描述 | |
---|---|---|---|---|---|---|
State | string | 处理状态,processing(处理中),success(成功),fail(失败) | 任务状态 | |||
Duration | int | 5 | 视频时长 | |||
TaskId | string | "1b21995c-a929-453b-8f49-272f239c79f9" | 任务ID | |||
RequestId | string | "1b21995c-a929-453b-8f49-272f239c79f9" | 任务请求ID | |||
Prompts | array | 提示词,包含type和content | ||||
Type | string | "text" | 提示词类型 | |||
Content | string | "挥一挥手" | 提示词内容 | |||
Creations | array | 生成物列表 | ||||
CreationId | string | "xxxx" | 生成物ID | |||
CoverUrl | string | "http://xxxxx_cover.jpeg.?AWSAccessKeyId=xxxx&Signature=xxx&Expires=1730992632" | 封面图URL | |||
VideoUrl | string | "http://xxxxx_cover.mp4.?AWSAccessKeyId=xxxx&Signature=xxx&Expires=1730992632" | 视频URL | |||
ModelVersion | string | "cog" | 模型版本 | |||
TaskType | string | "img2video" | 任务类型 |
请求示例:
def query_task(self, task_id):
action = "QueryTask"
method = "POST"
param = {}
body = {
"TaskId": task_id
}
print(body)
url = get_signature(action, ak, sk, method, VIRA_URL, param)
resp = requests.post(url, json=body)
result = json.loads(resp.content)
return result
2
3
4
5
6
7
8
9
10
11
12
返回示例:
{
"Code": "Success",
"Msg": "查询成功!",
"Data": {
"State": "success",
"Duration": 5,
"TaskId": "b690f2fb-87ac-4d71-bce9-0ea8b0f041d0",
"RequestId": "b690f2fb-87ac-4d71-bce9-0ea8b0f041d0",
"TaskType": "img2video",
"CreateTime": "2024-11-27 17:13:10",
"Prompts": [
{
"Type": "text",
"Content": "两个人在旋转跳跃"
},
{
"Type": "image",
"Content": "https://oss-cnbj01.cdsgss.com/cds-vira/xxx.jpeg"
}
],
"Creations": [
{
"CreationId": "2495037781129732",
"CoverUrl": "http://oss-cnbj01.cdsgss.com/xxx",
"VideoUrl": "http://oss-cnbj01.cdsgss.com/xxx"
}
],
"ModelVersion": "cog"
},
"ModelVersion": "1.5",
"RequestId": "de569a9a-ac9f-11ef-858c-283a4d3d6658"
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# python调用示例: (需替换自己的ak,sk)
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import hashlib
import uuid
import hmac
import time
import urllib
import sys, os
import base64
from hashlib import sha1
import requests
import json
import datetime
ak = "xxx"
sk = "xxx"
url = "http://api.capitalonline.net/platform/vira"
def percentEncode(str):
"""将特殊转义字符替换"""
res = urllib.parse.quote(str.encode('utf-8').decode(sys.stdin.encoding).encode('utf8'), '')
res = res.replace('+', '%20')
res = res.replace('*', '%2A')
res = res.replace('%7E', '~')
return res
def get_signature(action, ak, access_key_secret, method, url, param={}):
"""
@params: action: 接口动作
@params: ak: ak值
@params: access_key_secret: ak秘钥
@params: method: 接口调用方法(POST/GET)
@params: param: 接口调用Query中参数(非POST方法Body中参数)
@params: url: 接口调用路径
@return: 请求的url可直接调用
"""
timestamp = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
D = {
'Action': action,
'AccessKeyId': ak,
'SignatureMethod': 'HMAC-SHA1',
'SignatureNonce': str(uuid.uuid1()),
'SignatureVersion': "1.0",
"Timestamp": timestamp,
'Version': '2019-08-08',
}
if param:
D.update(param)
sortedD = sorted(D.items(), key=lambda x: x[0])
canstring = ''
for k, v in sortedD:
canstring += '&' + percentEncode(k) + '=' + percentEncode(v)
stringToSign = method + '&%2F&' + percentEncode(canstring[1:])
key_bytes = bytes(access_key_secret, 'utf-8') # Commonly 'latin-1' or 'utf-8'
data_bytes = bytes(stringToSign, 'utf-8') # Assumes `data` is also a string.
h = hmac.new(key_bytes, data_bytes, sha1)
Signature = base64.encodebytes(h.digest()).strip()
D['Signature'] = Signature
url = url + '/?' + urllib.parse.urlencode(D)
print(url)
return url
class ViraOpenapi:
def __init__(self, ak, sk):
self.ak = ak
self.sk = sk
self.url = url
def get_presigned_url(self):
action = "GetPresignedUrl"
method = "GET"
param = {}
url = get_signature(action, self.ak, self.sk, method, self.url, param)
resp = requests.get(url)
result = json.loads(resp.content)
return result
def up_load(self, up_load_url, file_path):
headers = {'Content-Type': 'image/jpeg'}
with open(file_path, 'rb') as file:
resp = requests.put(up_load_url, data=file, headers=headers)
etag = resp.headers.get('ETag')[1:-1]
print(resp.headers)
return etag
def finish(self, etag, resource_id):
action = "FinishUpload"
method = "POST"
param = {}
body = {
"ResourceId": resource_id,
"Etag": etag
}
print(body)
url = get_signature(action, self.ak, self.sk, method, self.url, param)
resp = requests.post(url, json=body)
result = json.loads(resp.content)
print(resp.status_code)
print(result)
return result
def create_task(self, uri):
"""
首尾帧,需要传入两张图片
body = {
"Type": "headtailimg2video",
"Model": "vidu-high-performance",
"ModelVersion": "1.5",
"Moderation": True,
"Input": {
"Enhance": True,
"Prompts": [
{
"Type": "text",
"Content": "在美丽的沙滩上跳高"
},
{
"Type": "image",
"Content": uri_1 # 首帧
},
{
"Type": "image",
"Content": uri_2 # 尾帧
}
]
},
"OutputParams": {
"Duration": 8,
"Resolution": "720p"
}
}
参考生视频、多主体视频, 需要将裁剪后的图片公网链接填入prompts
body = {
"Type": "character2video",
"Model": "vidu-high-performance",
"ModelVersion": "1.5",
"Moderation": True,
"Input": {
"Enhance": True,
"Prompts": [
{
"Type": "text",
"Content": "吃蛋糕"
},
{
"Type": "image",
"Content": uri_1 # 图像 1
},
{
"Type": "image",
"Content": uri_2 # 图像 2
}
]
},
"OutputParams": {
"Duration": 8,
"Resolution": "720p"
}
}
:param uri:
:return:
"""
action = "CreateTask"
method = "POST"
param = {}
body = {
"Type": "headtailimg2video",
"Model": "vidu-high-performance",
"ModelVersion": "1.5",
"Style": "general",
"Moderation": True,
"Input": {
"Enhance": True,
"Prompts": [
{
"Type": "text",
"Content": "在美丽的沙滩上跳高"
},
{
"Type": "image",
"Content": uri
},
{
"Type": "image",
"Content": uri
}
]
},
"OutputParams": {
"Duration": 4,
"Resolution": "720p"
}
}
print(body)
url = get_signature(action, self.ak, self.sk, method, self.url, param)
resp = requests.post(url, json=body)
result = json.loads(resp.content)
print(resp.status_code)
print(result)
return result
def query_task(self, task_id):
action = "QueryTask"
method = "POST"
param = {}
body = {
"TaskId": task_id
}
print(body)
url = get_signature(action, self.ak, self.sk, method, self.url, param)
resp = requests.post(url, json=body)
result = json.loads(resp.content)
print(resp.text)
return result
def create_scene_task(self, uri):
action = "CreateSceneTask"
method = "POST"
param = {}
body = {"Scene": "hug",
"Input": {"Prompts": [{"Type": "text",
"Content": '拥抱'},
{"Type": "image",
"Content": uri}
]}}
url = get_signature(action, self.ak, self.sk, method, self.url, param)
resp = requests.post(url, json=body)
result = json.loads(resp.content)
print(resp.text)
return result
if __name__ == '__main__':
file_path = r'C:\Users\Administrator\Desktop\image.jpg'
vira = ViraOpenapi(ak, sk)
# 获取上传地址
get_presigned_data = vira.get_presigned_url()
print(get_presigned_data)
up_load_url = get_presigned_data.get('Data', {}).get('PutUrl', '')
resource_id = get_presigned_data.get('Data', {}).get('ResourceId', '')
print(up_load_url, resource_id)
# 上传文件
etag = vira.up_load(up_load_url, file_path)
# 确认上传完成
uri_data = vira.finish(etag, resource_id)
uri = uri_data.get('Data', {}).get('Url', '')
# 创建文生视频
vira_task = vira.create_task(uri)
task_id = vira_task.get('Data', {}).get('TaskId', '')
# 查询视频任务任务
print(datetime.datetime.now())
query_task = vira.query_task(task_id)
time.sleep(1)
print(datetime.datetime.now())
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265