首页 虚拟数字人开放平台 开发指南 3D语音驱动数字人接入指南

3D语音驱动数字人接入指南

3D语音驱动数字人是虚拟数字人开放平台提供能够支持用户与3D数字人进行实时语音驱动的数字人产品能力。本篇文档将介绍如何接入3D语音驱动数字人。

使用场景

适用于一些不需要真人出镜的场景。

前置条件

下述介绍接入3D语音驱动数字人需要提前完成的步骤,每个步骤都需要完成才能顺利接入3D语音驱动数字人。

1. 申请阿里云账号

2. 申请购买权限,完成购买开通服务

3. 进入虚拟数字人开放平台创建并配置应用

具体创建和配置流程可以参考:创建并配置数字人应用。选择语音驱动数字人

技术接入

警告

请确保完成上述全部前置步骤,获取到阿里云账号的AccessKey ID和AccessKey Secret(点击获取),以及获取到对应数字人应用的tenantId和appId。

下面介绍接入3D语音驱动数字人的完整步骤以及涉及到API。

1. 了解虚拟数字人开放平台服务端API接入方式

虚拟数字人开放平台的服务端API采用OpenAPI形式对外输出,具体对接方案见:服务端 API 接入篇

2. SDK版本要求

重要

该功能需要升级虚拟数字人开放平台服务端SDK版本至1.0.5及以上。

3. 调用OpenAPI启动一路数字人实例

下面介绍通过Java调用OpenAPI启动一路数字人实例的代码示例,获取到返回的sessionId以及token。

public static void main(String[] args) throws Exception { 
 // 初始化sdk 
 Config config = new com.aliyun.teaopenapi.models.Config();
 config.setAccessKeyId("<accessKeyId>");
 config.setAccessKeySecret("<accessSecret>");
 // 在服务接入点可以查看其他的endpoint配置
 config.setEndpoint("avatar.cn-zhangjiakou.aliyuncs.com");
 Client client = new Client(config);
 
 // 调用api
 StartInstanceRequest startInstanceRequest = new StartInstanceRequest();
 // 租户ID从数字人开放平台的业务配置详情中获取
 startInstanceRequest.setTenantId(<tenantId>);
 // 业务APP从数字人开放平台的业务配置详情中获取
 startInstanceRequest.setApp(new StartInstanceRequest.StartInstanceRequestApp().setAppId("<appId>"));
 startInstanceRequest.setUser(new StartInstanceRequest.StartInstanceRequestUser().setUserId("<userId>").setUserName("<userName>")); 
 StartInstanceResponse startInstanceResponse = client.startInstance(startInstanceRequest);

 // 获取启动后SessionId和token,在发送语音流时需要使用
 String sessionId = startInstanceResponse.getBody().getData().getSessionId();
 String token = startInstanceResponse.getBody().getData().getToken();
 // 获取启动后的Channel信息,在通过RTC进行拉流时需要使用
 StartInstanceResponseBodyDataChannel channel = startInstanceResponse.getBody().getData().getChannel();
}
说明

接口调用返回的sessionId和token在后续步骤对接互动数字人客户端SDK时将会使用到,channel信息在对接RTC进行拉流时需要使用。

关于StartInstance API的详细信息可以参考:《StartInstance - 启动一个数字人》。同时OpenAPI提供了在线调试页面,可以直接面代码调试API:OpenAPI在线调试

4. 通过WebSocket对接语音驱动数字人

语音驱动数字人需要客户端通过WebSocket协议与服务端进行语音流的传输,下面将为您介绍如何通过WebSocket对接语音驱动数字人

4.1 与虚拟数字人开放平台建立WebSocket长连接

4.2 通过WebSocket发送语音驱动数字人语音请求

通过websocket发送启动对话消息,协议如下:

5{ 
	"messageId": "<messageId>", // 必传,消息id,需要保证唯一,可以直接生成16位随机数
	"receiverId": "<sessionId>",    // 必传,startInstance时获得的sessionId,
	"receiverType": "client",   // 必传,固定值
	"receiverAppId": "<appId>", // 必传,数字人应用的开发者信息中的appId
	"content": {
		"type": "cmd",
		"content": {
			 "code": "AUDIO_REQUEST",  // 必传,固定值
			 "params": {   // audio 为pcm,单通道,16k采样率音频数据的base64
				"audio": "UklGRs4KAABXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YaoKAAAHAAkACQAIAAsACgAIAAQA"
			}
		}
	}
}

5. 调用OpenAPI停止对应数字人实例

下面介绍通过Java调用OpenAPI启动一路数字人实例的代码示例,需要使用到第二步中获取的sessionId。

public static void main(String[] args) throws Exception { 
 // 初始化sdk 
 Config config = new com.aliyun.teaopenapi.models.Config();
 config.setAccessKeyId("<accessKeyId>");
 config.setAccessKeySecret("<accessSecret>");
 // 在服务接入点可以查看其他的endpoint配置
 config.setEndpoint("avatar.cn-zhangjiakou.aliyuncs.com");
 Client client = new Client(config);
 
 // 调用api
 StopInstanceRequest stopInstanceRequest = new StopInstanceRequest();
 // 租户ID从数字人开放平台的业务配置详情中获取
 stopInstanceRequest.setTenantId(<tenantId>);
 // 获取startInstance返回的SessionId
 stopInstanceRequest.setSessionId(<sessionId>);
 StopInstanceResponse stopInstanceResponse = client.stopInstance(stopInstanceRequest);
}

6. sessionId丢失如何停止数字人实例

针对运行中的数字人实例,如果sessionId丢失将无法调用StopInstance接口停止,此时可通过调用QueryRunningIntance接口获取到正在运行中的数字人实例列表,从而获取到对应的sessionId。

public static void main(String[] args) throws Exception { 
 // 初始化sdk 
 Config config = new com.aliyun.teaopenapi.models.Config();
 config.setAccessKeyId("<accessKeyId>");
 config.setAccessKeySecret("<accessSecret>");
 // 在服务接入点可以查看其他的endpoint配置
 config.setEndpoint("avatar.cn-zhangjiakou.aliyuncs.com");
 Client client = new Client(config);
 
 // 调用api
 QueryRunningInstanceRequest queryRunningInstanceRequest = new QueryRunningInstanceRequest();
 // 租户ID从数字人开放平台的业务配置详情中获取
 queryRunningInstanceRequest.setTenantId(<tenantId>);
 // 业务APP从数字人开放平台的业务配置详情中获取
 queryRunningInstanceRequest.setApp(new QueryRunningInstanceRequest.QueryRunningInstanceRequestApp().setAppId("<appId>"));
 // 获取运行中的数字人实例信息
 QueryRunningInstanceResponse stopInstanceResponse = client.queryRunningInstance(queryRunningInstanceRequest);
}
阿里云首页 虚拟数字人 相关技术圈