即梦 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 文档如下: