# huaweicloud-metastudio-videodrive-java **Repository Path**: jsckos/huaweicloud-metastudio-videodrive-java ## Basic Information - **Project Name**: huaweicloud-metastudio-videodrive-java - **Description**: 输入视频,驱动数字人表情和肢体动作的Java示例代码 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master-dev - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-10-17 - **Last Updated**: 2023-10-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 版本说明 本示例基于华为云SDK V3.0版本开发 ## 功能介绍 **什么是华为云MetaStudio服务?** 华为云MetaStudio服务联合伙伴打造数字内容生产线,帮助千行百业实现虚拟世界与现实世界无缝融合。数字人生产线是数字内容生产线的主要组成部分,包含数字人生产、数字人视频制作和数字人直播等场景化的应用。 华为云MetaStudio服务在数字内容生产线中为伙伴提供PaaS原子API能力。 MetaStudio提供的PaaS API能力包括: * 照片建模能力,输入单张照片,输出3D数字人模型。 * 语音驱动能力,输入文本,MetaStudio内部TTS转成语音后,输出驱动数字人的表情基数据和肢体动作数据。 * 视频驱动能力,输入摄像头视频流,输出数字人的表情基数据和肢体动作数据。 **您将学到什么?** 华为云提供了 MetaStudio 服务端 SDK,您可以直接集成服务端 SDK 来调用 MetaStudio 的相关 API,从而实现对 MetaStudio 的快速操作。 该场景示例代码以数字人视频驱动为例,介绍如何使用MetaStudio Java SDK创建一个视频驱动任务。视频任务启动成功后,将返回RTC房间信息,通过集成RTC客户将摄像头视频传入房间后即可驱动数字人面部表情和肢体动作。 视频驱动可用于中之人驱动的数字人直播等场景。 ## 开发时序图 ![时序图](assets/视频驱动.png) 说明: * 完整的视频驱动需要开发者在App端集成RTC SDK,将视频流以CAPTURE的用户类型传入RTC房间;在渲染端接收表情/肢体/音频数据,渲染编码后的视频流传入RTC房间(需集成RTC SDK,以RENDER的用户类型加入RTC房间) * 本示例仅展示第三方应用后台与MetaStudio之间的交互流程,用于视觉驱动的任务管理。 ## 前置条件 - 1、获取华为云开发工具包(SDK),您也可以查看安装JAVA SDK。 - 2、您需要拥有华为云租户账号以及该账号对应的 Access Key(AK)和 Secret Access Key(SK)请在华为云控制台“我的凭证 > 访问密钥”页面上创建和查看您的AK/SK。具体请参见 [访问密钥](https://support.huaweicloud.com/usermanual-ca/zh-cn_topic_0046606340.html) 。 - 3、华为云 Java SDK 支持 **Java JDK 1.8** 及其以上版本。 - 4、由于当前MetaStudio服务还处于公测阶段,仅对伙伴开放权限,需要申请才能使用,请提供联系华为销售人员开通MetaStudio服务权限。 具体操作步骤请参考:[华为云MetaStudio开发指南](https://support.huaweicloud.com/api-metastudio/metastudio_02_0000.html) 。 ## 接口参数说明 关于视频驱动接口的详细说明可参见: MetaStudio API参考的[“视频驱动”](https://support.huaweicloud.com/api-metastudio/CreateVideoMotionCaptureJob.html) 章节。 ### SDK获取和安装 开发者可以通过Maven方式获取和安装SDK,包括“huaweicloud-sdk-core”和“huaweicloud-sdk-metastudio”。需要在Java项目的pom.xml文件中加入如下的依赖项。 ```xml com.huaweicloud.sdk huaweicloud-sdk-core 3.1.36 com.huaweicloud.sdk huaweicloud-sdk-metastudio 3.1.36 org.slf4j slf4j-nop 1.7.2 ``` ## 示例代码 ```java public class MetaStudioVideoDrive { private static final Logger logger = LoggerFactory.getLogger(MetaStudioVideoDrive.class); public static void main(String[] args) throws InterruptedException { System.out.println("Start HUAWEI CLOUD MetaStudio Video Drive Java Demo..."); ICredential auth = getCredential("YOUR AK", "YOUR SK","YOUR PROJECT ID"); // 初始数字人服务的客户端 MetaStudioClient client = getClient(MetaStudioRegion.CN_NORTH_4, auth); // 创建视频驱动任务 CreateVideoMotionCaptureJobResponse videoMotionCaptureJob = createVideoMotionCaptureJob(client); Thread.sleep(5000); // 获取视频驱动任务列表 listVideoMotionJob(client); // 查询视频驱动详情 showVideoMotionCaptureJob(client, videoMotionCaptureJob.getJobId()); // 控制视频驱动 executeVideoMotionCaptureCommandJob(client, videoMotionCaptureJob.getJobId()); Thread.sleep(5000); // 停止视频驱动 stopVideoMotionCaptureJob(client, videoMotionCaptureJob.getJobId()); } /** * 查询视频驱动任务列表 * * @param client MetaStudio client * @return 查询视频驱动任务列表响应 */ public static ListVideoMotionCaptureJobsResponse listVideoMotionJob(MetaStudioClient client) { System.out.println("listVideoMotionJob start"); try { ListVideoMotionCaptureJobsRequest listVideoMotionCaptureJobsRequest = new ListVideoMotionCaptureJobsRequest(); ListVideoMotionCaptureJobsResponse response = client.listVideoMotionCaptureJobs(listVideoMotionCaptureJobsRequest); return response; } catch (ConnectionException | RequestTimeoutException e) { System.out.println("there is some error, exception:" + e); } return null; } /** * 创建视频驱动任务 * * @param client MetaStudio client * @return 创建视频驱动任务响应 */ public static CreateVideoMotionCaptureJobResponse createVideoMotionCaptureJob(MetaStudioClient client) { // 设置接收视频驱动数据的地址 OutputInfo outputInfo = new OutputInfo(); UUID uuid = UUID.randomUUID(); int randomInt = uuid.hashCode(); randomInt = randomInt < 0 ? -randomInt : randomInt; outputInfo.setAudioAddr("121.36.196.49:30002"); // 音频输入地址 outputInfo.setBodyAddr("121.36.196.49:30002"); // 面部表情输入地址 outputInfo.setFaceAddr("121.36.196.49:30002"); // 面部表情输入地址 // 会话ID outputInfo.setSessionId(randomInt); VideoMotionCaptureJobReq videoMotionCaptureJobReq = new VideoMotionCaptureJobReq(); // 设置视频驱动模式 videoMotionCaptureJobReq.setMotionCaptureMode(VideoMotionCaptureJobReq.MotionCaptureModeEnum.FULL_BODY); videoMotionCaptureJobReq.setOutputInfo(outputInfo); try { CreateVideoMotionCaptureJobRequest createVideoMotionCaptureJobRequest = new CreateVideoMotionCaptureJobRequest(); createVideoMotionCaptureJobRequest.withBody(videoMotionCaptureJobReq); CreateVideoMotionCaptureJobResponse response = client.createVideoMotionCaptureJob(createVideoMotionCaptureJobRequest); return response; } 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 ShowVideoMotionCaptureJobResponse showVideoMotionCaptureJob(MetaStudioClient client, String jobId) { ShowVideoMotionCaptureJobResponse response = null; try { System.out.println("showVideoMotionCaptureJob start"); ShowVideoMotionCaptureJobRequest showVideoMotionCaptureJobRequest = new ShowVideoMotionCaptureJobRequest(); showVideoMotionCaptureJobRequest.withJobId(jobId); response = client.showVideoMotionCaptureJob(showVideoMotionCaptureJobRequest); System.out.println("ShowVideoMotionCaptureJobResponse:" + response.toString()); return response; } 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 ExecuteVideoMotionCaptureCommandResponse executeVideoMotionCaptureCommandJob(MetaStudioClient client, String jobId) { System.out.println("executeVideoMotionCaptureCommandJob start"); ExecuteVideoMotionCaptureCommandRequest executeVideoMotionCaptureCommandRequest = new ExecuteVideoMotionCaptureCommandRequest().withJobId(jobId); ControlDigitalHumanLiveReq controlDigitalHumanLiveReq = new ControlDigitalHumanLiveReq().withCommand(ControlDigitalHumanLiveReq.CommandEnum.BODY_POS_RESET); executeVideoMotionCaptureCommandRequest.setBody(controlDigitalHumanLiveReq); try { ExecuteVideoMotionCaptureCommandResponse response = client.executeVideoMotionCaptureCommand(executeVideoMotionCaptureCommandRequest); System.out.println("ExecuteVideoMotionCaptureCommandResponse" + response); return response; } 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 StopVideoMotionCaptureJobResponse stopVideoMotionCaptureJob(MetaStudioClient client, String jobId) { System.out.println("stopVideoMotionCaptureJob start"); StopVideoMotionCaptureJobRequest stopVideoMotionCaptureJobRequest = new StopVideoMotionCaptureJobRequest().withJobId(jobId); try { StopVideoMotionCaptureJobResponse response = client.stopVideoMotionCaptureJob(stopVideoMotionCaptureJobRequest); 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](https://console.huaweicloud.com/apiexplorer/#/openapi/MetaStudio/doc?api=CreateTtsa) [《华为云MetaStudio开发指南》](https://support.huaweicloud.com/api-metastudio/metastudio_02_0000.html) ## 修订记录 | 发布日期 | 文档版本 | 修订说明 | | :--------: | :------: | :----------: | | 2023-04-12 | 1.0 | 文档首次发布 |