huaweicloud-metastudio-voicedrive-java:华为云MetaStudio服务语音驱动Java示例,文本转数字人表情与肢体数据

输入文本,MetaStudio通过TTS转成语音后驱动数字人表情和肢体动作的Java示例代码

Branch3Tags0

版本说明

本示例基于华为云SDK V3.0版本开发

功能介绍

什么是华为云MetaStudio服务?

华为云MetaStudio服务联合伙伴打造数字内容生产线,帮助千行百业实现虚拟世界与现实世界无缝融合。数字人生产线是数字内容生产线的主要组成部分,包含数字人生产、数字人视频制作和数字人直播等场景化的应用。 华为云MetaStudio服务在数字内容生产线中为伙伴提供PaaS原子API能力。 MetaStudio提供的PaaS API能力包括:

  • 照片建模能力,输入单张照片,输出3D数字人模型。
  • 语音驱动能力,输入文本,MetaStudio内部TTS转成语音后,输出驱动数字人的表情基数据和肢体动作数据。
  • 视频驱动能力,输入摄像头视频流,输出数字人的表情基数据和肢体动作数据。

您将学到什么?

华为云提供了 MetaStudio 服务端 SDK,您可以直接集成服务端 SDK 来调用 MetaStudio 的相关 API,从而实现对 MetaStudio 的快速操作。

该场景示例代码以数字人语音驱动为例,介绍如何使用MetaStudio Java SDK将输入的文本数据转换为驱动数字的表情基系数和肢体动作数据。

语音驱动可用于数字人的视频制作等场景。

开发时序图

时序图

前置条件

  • 1、获取华为云开发工具包(SDK),您也可以查看安装JAVA SDK。
  • 2、您需要拥有华为云租户账号以及该账号对应的 Access Key(AK)和 Secret Access Key(SK)请在华为云控制台“我的凭证 > 访问密钥”页面上创建和查看您的AK/SK。具体请参见 访问密钥
  • 3、华为云 Java SDK 支持 Java JDK 1.8 及其以上版本。
  • 4、由于当前MetaStudio服务还处于公测阶段,仅对伙伴开放权限,需要申请才能使用,请提供联系华为销售人员开通MetaStudio服务权限。

具体操作步骤请参考:华为云MetaStudio开发指南

接口参数说明

关于语音驱动接口的详细说明可参见:

MetaStudio API参考的“语音驱动” 章节。

SDK获取和安装

开发者可以通过Maven方式获取和安装SDK,包括“huaweicloud-sdk-core”和“huaweicloud-sdk-metastudio”。需要在Java项目的pom.xml文件中加入如下的依赖项。

<dependencies>
    <dependency>
        <groupId>com.huaweicloud.sdk</groupId>
        <artifactId>huaweicloud-sdk-core</artifactId>
        <version>3.1.36</version>
    </dependency>
    <dependency>
        <groupId>com.huaweicloud.sdk</groupId>
        <artifactId>huaweicloud-sdk-metastudio</artifactId>
        <version>3.1.36</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-nop</artifactId>
        <version>1.7.2</version>
    </dependency>
</dependencies>

示例代码

public class MetaStudioVoiceDrive {
    private static final Logger logger = LoggerFactory.getLogger(MetaStudioVoiceDrive.class);

    public static void main(String[] args) throws InterruptedException {
        System.out.println("Start HUAWEI CLOUD MetaStudio Voice Drive Java Demo...");

        ICredential auth = getCredential("YOUR AK", "YOUR SK","YOUR PROJECT ID");

        // 初始数字人服务的客户端
        MetaStudioClient client = getClient(MetaStudioRegion.CN_NORTH_4, auth);

        // 获取语音驱动任务列表
        ListTTSAJobs(client);

        // 创建语音驱动任务
        String jobId = createTTSAJob(client);

        // 创建任务后需要等待 3秒后 再查询
        Thread.sleep(3000);
        // 获取语音驱动任务详情
        ListTTSAData(client, jobId);
    }

    /**
     * 查询语音驱动任务列表
     *
     * @param client MetaStudio client
     * @return 查询语音驱动任务列表响应
     */
    public static ListTtsaJobsResponse ListTTSAJobs(MetaStudioClient client) {
        System.out.println("ListTTSAJobs start");
        try {
            ListTtsaJobsRequest request = new ListTtsaJobsRequest();
            ListTtsaJobsResponse response = client.listTtsaJobs(request);
            System.out.println("ListTtsaJobsResponse :" + response.toString());
            return response;
        } catch (ConnectionException | RequestTimeoutException e) {
            System.out.println("there is some error, exception:" + e);
        }
        return null;
    }

    /**
     * 创建语音驱动任务
     *
     * @param client MetaStudio client
     * @return 语音驱动任务ID
     */
    public static String createTTSAJob(MetaStudioClient client) {
        System.out.println("createTTSAJob start");
        // 动作资产查询条件
        ListAssetsRequest listMotionAssetsRequest = new ListAssetsRequest()
                .withAssetSource(ListAssetsRequest.AssetSourceEnum.ALL)
                .withAssetType(DigitalAssetInfo.AssetTypeEnum.ANIMATION.getValue())
                .withName("小芸_右手打招呼");

        // 音色资产查询条件
        ListAssetsRequest listVoiceAssetsRequest = new ListAssetsRequest()
                .withAssetSource(ListAssetsRequest.AssetSourceEnum.ALL)
                .withAssetType(DigitalAssetInfo.AssetTypeEnum.VOICE_MODEL.getValue())
                .withName("亲切女声");

        try {
            // 查询音色资产
            ListAssetsResponse voiceAssetsResponse = client.listAssets(listVoiceAssetsRequest);
            String voiceAssetId = voiceAssetsResponse.getAssets().get(0).getAssetId();
            System.out.println(voiceAssetId);
            // 查询动作资产
            ListAssetsResponse motionAssetsResponse = client.listAssets(listMotionAssetsRequest);
            String motionAssetId = motionAssetsResponse.getAssets().get(0).getAssetId();
            System.out.println(motionAssetId);
            //含动作标签的语音文本
            String text = String.format("<speak>大家好,我是云笙<insert-action id=\"%s\"/>,这个是MetaStudio语音驱动的测试用例。</speak>" , motionAssetId);

            CreateTTSAReq createTtsaReq = new CreateTTSAReq()
                    .withVoiceAssetId(voiceAssetId)   // 音色ID
                    .withEmotion("HAPPY")   // 情感标签
                    .withPitch(100)   // 音高
                    .withSpeed(100)   // 语速
                    .withVolume(140)  // 音量
                    .withText(text);   //带动作标签的文本

            CreateTtsaRequest request = new CreateTtsaRequest()
                    .withBody(createTtsaReq);
            CreateTtsaResponse response = client.createTtsa(request);
            System.out.println("createTTSAJob :" + response.toString());
            logger.info(response.toString());
            return response.getJobId();
        } catch (ConnectionException | RequestTimeoutException e) {
            System.out.println("there is some error, exception:" + e);
        }
        return null;
    }

    /**
     * 获取语音驱动数据
     *
     * @param client MetaStudio client
     * @param jobId 语音驱动任务ID
     * @return 查询语音驱动任务详情响应
     */
    public static ListTtsaDataResponse ListTTSAData(MetaStudioClient client, String jobId) {
        System.out.println("ListTTSAData start");
        try {
            ListTtsaDataRequest request = new ListTtsaDataRequest()
                    .withJobId(jobId);
            ListTtsaDataResponse response = client.listTtsaData(request);
            logger.info(response.toString());
            System.out.println("ListTTSAData :" + response);
            return response;
        } catch (ConnectionException | RequestTimeoutException e) {
            System.out.println("there is some error, exception:" + e);
        }
        return null;
    }

    /**
     * 创建鉴权凭证
     *
     * @param ak 租户帐号对应的 Access Key(AK)
     * @param sk 租户帐号对应的 Secret Access Key(SK)
     * @return 鉴权凭证
     */
    public static ICredential getCredential(String ak, String sk, String projectId) {
        return new BasicCredentials()
                .withAk(ak)
                .withSk(sk)
                .withProjectId(projectId);
    }

    /**
     * 创建MetaStudio client
     *
     * @param region region信息
     * @param auth 鉴权凭证
     * @return MetaStudio client
     */
    public static MetaStudioClient getClient(Region region, ICredential auth) {
        // 使用默认配置
        HttpConfig config = HttpConfig.getDefaultHttpConfig();
        config.withIgnoreSSLVerification(true);

        // 初始化metaStudio服务的客户端
        return MetaStudioClient.newBuilder()
                .withHttpConfig(config)
                .withCredential(auth)
                .withRegion(region) // 选择服务所在区域
                .build();
    }
}

参考

更多信息请参考:

API Explorer

《华为云MetaStudio开发指南》

修订记录

发布日期 文档版本 修订说明
2023-04-12 1.0 文档首次发布

Introduction

输入文本,MetaStudio通过TTS转成语音后驱动数字人表情和肢体动作的Java示例代码

Customize my domain