即梦 OmniHuman 1.5
OmniHuman1.5(即梦同源数字人模型),该模型可根据用户上传的单张图片+音频,生成与图片对应的视频效果。支持输入任意画幅包含人物或其他主体(宠物、动漫等)的图片,结合音频,生成高质量的视频。
人物的情绪、动作与音频具有强关联性,支持通过提示词(prompt)对画面、动作、运镜进行调整。同时OmniHuman1.5对动漫、宠物等形象支持较好,允许指定讲话人/主体,可广泛应用于内容表达、唱歌和表演等场景。
相较于上一代模型,OmniHuman1.5 在运动自然度和结构稳定性提升明显,在人物/主体的运动表现力和画面质量上更优。可以广泛应用于制作剧情对话、多人对话/对唱、商品交互、漫剧等内容。对比其他视频通用模型,OmniHuman 数字人大模型在人物/主体的剧情演绎效果上极具优势。
具体模型介绍细节,可参考火山文档。
调用示例
千木提供与火山相同的即梦 OmniHuman 1.5 API,您可以使用火山 SDK 或是通过自研 API 接入即梦 OmniHuman 1.5。
以火山 Python SDK 为例,使用 pip install 'volcengine-python-sdk[ark]' 安装火山 SDK 后,运行如下示例脚本:
# coding:utf-8
import json
import threading
from time import sleep
from volcengine.ApiInfo import ApiInfo
from volcengine.Credentials import Credentials
from volcengine.base.Service import Service
from volcengine.ServiceInfo import ServiceInfo
from volcengine.visual.VisualService import VisualService
class SilvaMuxVisualService(VisualService):
def __new__(cls, *args, **kwargs):
return object.__new__(cls, *args, **kwargs)
def __init__(self):
self.service_info = SilvaMuxVisualService.get_service_info()
self.api_info = SilvaMuxVisualService.get_api_info()
super(VisualService, self).__init__(self.service_info, self.api_info)
def get_service_info():
service_info = ServiceInfo("www.silvamux.com", # 如需使用海外版,请替换为 www.silvamux.io
{}, Credentials('', '', 'cv', 'cn-north-1'), 30, 30, 'https')
return service_info
def get_api_info():
api_info = {
"CVGetResult": ApiInfo("POST", "/api/ark", {"Action": "CVGetResult", "Version": "2022-08-31"}, {}, {}),
"CVSubmitTask": ApiInfo("POST", "/api/ark", {"Action": "CVSubmitTask", "Version": "2022-08-31"}, {}, {}),
"CVProcess": ApiInfo("POST", "/api/ark", {"Action": "CVProcess", "Version": "2022-08-31"}, {}, {}),
}
return api_info
def get_result(req_key, task_id):
i = 0
while True:
i += 1
result_resp = visual_service.cv_get_result({
"req_key": req_key,
"task_id": task_id
})
result_status = result_resp['data']['status']
print(f" 第 {i} 次查询结果,状态: {result_status}")
if result_status == "in_queue" or result_status == "generating":
sleep(3)
continue
if result_status == "done":
if 'data' in result_resp and 'resp_data' in result_resp['data']:
return json.loads(result_resp['data']['resp_data'])
elif 'data' in result_resp and 'video_url' in result_resp['data']:
return result_resp['data']['video_url']
else:
print(f" 解析失败:{result_resp}")
raise Exception("result parse failed")
raise Exception(f"task {result_status}")
if __name__ == '__main__':
image_url = "https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_7297f5f099cee6b48f5417e47ac8291b.png"
audio_url = "https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/64c66c987973400491c0b487d832537c"
mask_urls = []
visual_service = SilvaMuxVisualService()
# 请使用千木后台生成的兼容“凭据”以调用火山兼容 API
visual_service.set_ak('AKexampleReplaceWithRealAK')
visual_service.set_sk('SKexampleReplaceWithRealSK')
print("第一步:主体识别 如果确认图片中有人类主体,可以跳过该步骤")
step1_resp = visual_service.cv_submit_task({
"req_key": "jimeng_realman_avatar_picture_create_role_omni_v15",
"image_url": image_url
})
step1_resp_task_id = step1_resp['data']['task_id']
print(f" 任务ID: {step1_resp_task_id}")
step1_result = get_result("jimeng_realman_avatar_picture_create_role_omni_v15", step1_resp_task_id)
if step1_result['status'] != 1:
raise Exception("没有检测到主体,任务失败,请更换图片尝试")
print("第二步:主体检测 如果在视频生成时不需要指定主体说话,可以跳过该步骤")
step2_resp = visual_service.cv_process({
"req_key": "jimeng_realman_avatar_object_detection",
"image_url": image_url
})
step2_data = json.loads(step2_resp['data']['resp_data'])
mask_urls = step2_data['object_detection_result']['mask']['url']
print(f" 遮罩列表: {mask_urls}")
print("第三步:视频生成")
step3_resp = visual_service.cv_submit_task({
"req_key": "jimeng_realman_avatar_picture_omni_v15",
"image_url": image_url,
"mask_url": mask_urls,
"audio_url": audio_url,
})
step3_resp_task_id = step3_resp['data']['task_id']
print(f" 任务ID: {step3_resp_task_id}")
step3_result = get_result("jimeng_realman_avatar_picture_omni_v15", step3_resp_task_id)
print(f" 结果: {step3_result}")
具体 API 文档如下: