3D数字人交互SDK-Android版
简介
本文说明Android 端渲染SDK的使用和调用方式
SDK下载
1.0.2 版本 下载地址
支持机型信息:
- 安卓:支持CPU骁龙730G/骁龙855/联发科天玑900/天玑820 同等性能及以上芯片
- iOS : 支持iPhone8 系统版本13.3以及以上。
整体架构&功能简介
- 客户端或页面集成SDK加载形象包,本地驱动渲染数字人。
- 支持音频和文本驱动:
- 音频可以使用真人音频或自行接入的第三方的TTS音频。
- 文本驱动SDK内部会调用数字人开放平台TTS服务驱动数字人,
- 文本驱动可以开启智能动作开关,实现数字人根据播报语义智能触发动作。
-
3D数字人形象包可切换机位,动作驱动,切换配饰服装(如有多套配置服装)
鉴权&申请
license需要额外申请, 提供给百度运营人员如下信息,用于生成license文件
- 包名
- 签名文件的md5值
license文件获取后,必须放在assets目录下,
注意license的有效期,在license失效前,必须强制更新带有新license的app
Avatar3DConfig avatar3DConfig = digitalHumanSettings.getAvatarConfig();
// asset 目录下的xuniren-avatar-debug-0003.license文件
avatar3DConfig.setLicenseFilename("xuniren-avatar-debug-0003");
包名和签名md5获取
包名: 每个 Android 应用均有一个唯一的应用 ID。安卓以 Java 包的形式管理应用。
demo的包名定义在app/build.gradle中
applicationId "com.baidu.ar.avatarsdksample"
具体说明见官方文档:
https://developer.android.com/studio/build/application-id.html
签名md5
生成签名文件: https://developer.android.com/studio/publish/app-signing.html
方法1:
命令行输入 keytool –list –v –keystore <签名文件路径>
方法2:
使用demo中的签名文件和自己的包名,报错中有md5值
DemoAvatarCallback onError: name=license,code=2301,subCode=13,message=onVirtualHumanAuth failed :13 licenseKey:XUNIREN-AVATAR-DEBUG-0003,algorithmId:32;packageName:com.baidu.aip.digitalhuman.avartar,md5:6B92C246956520E715F4078D2A6E2961;deviceId:,fingerVersion:5.0.0.9-isolated;licenseSdkVersion:5.0.0.9-isolated,exceptionClassName=AvatarAuthException
DEMO测试资源准备
- 从运营人员处获取license鉴权文件,按照上文提供包名和鉴权文件的md5。demo的包名是com.baidu.aip.digitalhuman.avartar, 签名文件的md5是 6B92C246956520E715F4078D2A6E2961
- 从运营人员处获取人像资源包
- 从组件商店 购买《交互组件-端渲染交互组件-3D数字人》及《定制服务-语音合成》。
- 选择一个音色公共音色库或者克隆音色
购买入口:组件商店 (依次购买: 1. 定制服务-语音合成 2. 交互组件-端渲染交互组件-3D数字人)
DEMO测试代码修改
使用较新的android studio导入即可运行, gradle 的版本为8.8,需要jre 17或以上版本运行
从运营人员处获取license鉴权文件和人像资源包
- 申请license文件(见下文的鉴权&申请),需要你的包名和签名文件的md5,获取后的license文件放入到assets目录下
- 从运营人员获取人像包。在assets目录下,解压人像资源包到case目录下,目录结构如下
从组件商店 购买《交互组件-**端渲染交互组件-3D数字人**》及《交互组件-语音合成》,购买后可以获取 AppId/AppKey
AppId和AppKey的获取请参照 接口通用说明, 注意数字人文字驱动需要额外绑定「语音合成」组件。
也可以直接填写token token填写后, appId, appkey无效
/**
* 网页上的应用鉴权信息
*/
public static final String DEFAULT_APP_ID = "i-qjwqyvdm3e40y";
/**
* 网页上的应用鉴权信息
*/
public static final String DEFAULT_APP_KEY = "n5j0cyq6jnnkh8r573f5";
/**
* tts音色
*/
public static final int TTS_PERSON = 5116;
/**
* 设置的token, 如果为空,则用appid appkey计算, 建议服务端生成
*/
private static final String DEFAULT_TOKEN = "";
形象定制(使用公共形象可以跳过)
1、形象包制作:分为“定制形象”和“公共库形象”两种。
- 定制形象
用户提供设计原画或已经建模好的3D人物模型。为保证人物模型可以被端渲染SDK驱动使用,百度侧进行人像模型适配,预计需要3-4周时间。人像适配过程中允许用户调整和修改,确保人像符合用户需求。
- 公共形象库
用户从公共形象库中选择心仪的形象,公共形象参考本文最后《附件.3D端渲染人像库》。为保证人物模型可以被端渲染SDK驱动使用,百度侧进行人像模型适配,预计需要3-4周时间。
形象定制及适配费用相关问题,可咨询:https://cloud.baidu.com/survey/assembly.html
SDK内部模块和流程
内部模块
- AvatarEngine: 人像模块, 负责人像的显示,动作口型
- RenderEngine:渲染模块, 用于编排指令,播放音频及调用人像
模块流程:
AvatarEngine->RenderEngine
初始化
需要输入组件平台的token,token生成方式,接口通用说明
鉴权 token 生成方法参考上述文档或者Demo中的TokenUtil.generateToken方法
为了避免密钥泄露,建议由开发者的后端服务保存 AppId/AppKey 生成 token,然后通过客户端和服务端间的可信链路传输 token
SDK 集成
SDK只依赖网络权限,用于连接tts和口型驱动服务
AndroidManifest.xml文件
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
依赖库
本地库 app\avatar-libs下
- arplay-release.aar
- avatar.jar
开源库: 'com.fasterxml.jackson.core:jackson-databind:2.17.2'
备注:目前高版本的gradle中集成本地aar文件的方式主要有两种
- 如demo,在外层的settings.gradle中添加flatDir dirs("app/avatar-libs")
- 新建module ,build.gradle改为configurations.maybeCreate("default") 及 artifacts.add("default", file('arplay-release.aar'))
推荐UI集成方式
参考demo中的DigitalHumanDisplayFragment, 使用TextureView进行渲染
private void initDigitalHumanDisplayUI() {
digitalHumanDisplayFragment = new DigitalHumanDisplayFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fcv, digitalHumanDisplayFragment).commit();
}
SDK具体参数及回调
调用流程
- DigitalHumanSettings设置参数 ,包含上文的license文件的设置
- OpenEngineCallback 设置上面2个模块的回调
- DigitalHumanEngine 使用DigitalHumanSettings和EngineCallback 初始化, 初始调用init及onSurfaceTextureAvailable方法
- 等待onModelLoaded回调
- DigitalHumanEngine 控制数字人行为
初始化DigitalHumanEngine
DigitalHumanEngine.init方法
/**
* 初始化数字人
*
* @param context
* @param settings 数字人配置
* @param engineCallback 多个callback合一
* @throws ConfigInputException 配置错误
*/
public void init(@NonNull Context context, @NonNull DigitalHumanSettings settings,
EngineCallback engineCallback) throws ConfigInputException
DigitalHumanSettings设置参数:
private DigitalHumanSettings createDigitalHumanSettings(String token, String urlPrefix) {
DigitalHumanSettings digitalHumanSettings = getDigitalHumanSettings();
try {
digitalHumanSettings.setUrlPrefix(urlPrefix);
PlatConfig platConfig = digitalHumanSettings.getPlatConfig();
platConfig.setToken(token);
Avatar3DConfig avatar3DConfig = digitalHumanSettings.getAvatarConfig();
// asset 目录下的xuniren-avatar-debug-0004.license 鉴权文件
avatar3DConfig.setLicenseFilename("xuniren-avatar-debug-0004");
// 渲染等级,HIGH使用高精人像,MIDDLE和LOW使用普通, 部分人像无渲染等级区别
avatar3DConfig.setDisplayQualityLevel(DisplayQualityLevel.HIGH);
// 模型文件路径,demo中从assets目录复制到该目录
avatar3DConfig.setModelPath(caseCacheDir.getAbsolutePath());
// 设置最大并发TTS数量, 注意组件服务端有最大tts并发设置,所有进行tts发音的设备的实时并发数不能超过这个并发,一般设置1或者2
digitalHumanSettings.getRenderEngineConfig().setMaxTtsConcurrency(MAX_TTS_CONCURRENCY);
} catch (InputException e) {
Log.e(TAG, "Fail to init digitalHumanSettings ", e);
}
return digitalHumanSettings;
}
EngineCallback 初始化:
// SplashActivity.initDigitalHumanEngine
EngineCallback engineCallback = new OpenEngineCallback(new DemoAvatarCallback(), new DemoRenderEngineCallback(getApplicationContext()));
DigitalHumanEngine 使用DigitalHumanSettings和EngineCallback 初始化:
// SplashActivity.initDigitalHumanEngine
// 检查
DigitalHumanEngine digitalHumanEngine = DigitalHumanEngine.getInstance();
digitalHumanEngine.checkDigitalHumanSettings(digitalHumanSettings, engineCallback);
// 初始化
digitalHumanEngine.init(this, digitalHumanSettings, engineCallback);
//init 调用后需要调用下文的DigitalHumanEngine.onSurfaceTextureAvailable,完成初始化
初始化Texture和生命周期
参考Demo中的DigitalHumanDisplayFragment
- D**igitalHumanEngine.onSurfaceTextureAvailable方法, 用于监听SurfaceView初始化**
- DigitalHumanEngine.onPause方法, 绑定activity的onPause事件
- DigitalHumanEngine.onResume方法,绑定activity的onResume事件
- DigitalHumanEngine.destroy方法, 销毁
/**
* TextureView初始化成功
* TextureView.SurfaceTextureListener 透传
*
* @param surface
* @param width
* @param height
* @param requestOrientation
*/
public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height, int requestOrientation)
/**
* android onPause事件透传
*/
public void onPause()
/**
* android onResume事件透传
*/
public void onResume()
/**
* 销毁SDK
*/
public void destroy() {
示例
- 监听onSurfaceTextureAvailable ,调用digitalHumanEngine.onSurfaceTextureAvailable
private class DisplaySurfaceTextureListener implements TextureView.SurfaceTextureListener {
@Override
public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) {
if (getActivity() == null) {
throw new DemoInvalidProcessException("activity is not attached");
}
lastTextureSurface = surface;
lastTextureSize = new Size(width, height);
digitalHumanEngine.onSurfaceTextureAvailable(surface, width, height, getActivity().getRequestedOrientation());
}
- textureView 注册事件,注册TextureView setOnTouchListener
private void initView(ViewGroup rootView) {
TextureView textureView = rootView.findViewById(R.id.texture_view);
textureView.setOpaque(false);
textureView.setSurfaceTextureListener(new DisplaySurfaceTextureListener());
textureView.setRotation(0);
}
- 生命周期相关调用
@Override
public void onDestroy() {
super.onDestroy();
digitalHumanEngine.destroy();
}
@Override
public void onPause() {
super.onPause();
digitalHumanEngine.onPause();
}
@Override
public void onResume() {
super.onResume();
digitalHumanEngine.onResume();
}
DigitalHumanEngine 数字人控制方法
参考demo中的AvatarControllerFragment
- DigitalHumanEngine.mute 方法,数字人静音
- DigitalHumanEngine.unMute方法 , 数字人取消静音
/**
* 静音
*/
public void mute()
/**
* 取消静音
*/
public void unMute()
DigitalHumanEngine 数字人播放方法
参考demo中的InteractiveControllerFragment
- DigitalHumanEngine.**playAnim**方法
注意,目前数字人的动作可以随时触发,随时打断当前动作。动作流程与播放无关。
- 可以在字幕收到时,自行触发动作
- 智能动作开启时,会自带动作,注意此时不要发动作,以免打断
/**
* 播放动画
* @param animName
* @param requestId
*/
public void playAnim(String animName, String requestId) ;
- TtsConfig类, 用于下文的render里的tts设置和智能动作
public class TtsConfig {
/**
* 发音人
*/
@With
private String person = "5116";
/**
* 语速,取值范围:0-15
*/
private int speed = 5;
/**
* 音调,取值范围:0-15
*/
private int pitch = 5;
/**
* 组件平台,是否开启智能动作
*/
@JsonIgnore
private boolean autoAnimoji = false;
}
- DigitalHumanEngine.render方法,播报文本或者上传音频
- DigitalHumanEngine.interrupt方法,打断播报&动作
/**
* 播放文本,使用默认的TtsConfig
*
* @param text
* @param requestId
*/
public void render(String text, String requestId);
/**
* 播放文本
*
* @param text
* @param requestId
* @param ttsConfig 见TtsConfig类
*/
public void render(String text, String requestId, TtsConfig ttsConfig);
/**
* 播放音频流
* @param audioInputStream
* @param requestId
*/
public void render(IAudioStream audioInputStream, String requestId);
/**
* 打断当前播放&动作
*/
public void interrupt();
IAudioStream 用于SDK回调获取InputStream, 注意SDK内部有重试机制,
public interface IAudioStream extends AutoCloseable {
/**
* 如果请求过程中失败的话 这里可能会多次调用,每次需要一个从头开始的InputStream
* @return
*/
InputStream getReadableInputStream();
/**
* 需要关闭当前的InputStream
* @throws Exception
*/
@Override
void close() throws Exception;
/**
* 当前流读完
* @param isAllRead
*/
void onReadFinish(boolean isAllRead);
}
DigitalHumanSettings 总设置参数
各模块参数可以通过
方法 | 作用 | 示例 | 备注 |
---|---|---|---|
setUrlPrefix | 设置服务端地址 | http://xiling.baidu.com | 实际等同设置内部的1个api地址。renderEngineConfig.setRenderWebsocketUrl:渲染引擎接口:{wsUrlPrefix}/v1/arkit/render |
EngineCallback 回调
EngineCallback 内实际是2个回调,均为IOnErrorCallback或IOnWarningCallback
- IOnErrorCallback.onError 人像初始化前的流程, 有此回调后SDK流程终止
- IOnWarningCallback.onWarning 不影响流程的警告, SDK初始化成功后,网络相关的问题以onWarning输出
通用报错回调:
public interface IOnErrorCallback extends IOnWarningCallback {
/**
* 人像初始化前的流程, 有此回调后SDK流程终止
*
* @param name 保存名称或者id
* @param code SDK错误码
* @param subCode SDK子错误码,通常为依赖模块或者接口的错误码
* @param message 具体报错信息
* @param exceptionClassName 异常类名
*/
void onError(String name, int code, int subCode, String message, String exceptionClassName);
}
public interface IOnWarningCallback {
/**
* 不影响流程的警告
* SDK初始化成功后,网络相关的问题以onWarning输出
*
* @param name 名称或者id
* @param code 错误码
* @param subCode 子错误码,通常为依赖模块或者接口的错误码
* @param message 具体报错信息
* @param exceptionClassName 异常类名
*/
void onWarning(String name, int code, int subCode, String message, String exceptionClassName);
}
处理背景图片
SDK渲染的TextureView为透明, 可以参考demo自行使用ImageView作为背景
AvatarEngine模块
AvatarEngine负责人像的显示,动作口型,获取AvatarConfig对象:
digitalHumanSettings.getAvatarConfig()
方法 | 作用 | 示例/默认 | 备注 |
---|---|---|---|
displayQualityLevel | 渲染等级 | DisplayQualityLevel.HIGH | 其它选项DisplayQualityLevel.MIDDLEDisplayQualityLevel.LOW |
licenseFilename | 鉴权文件名。必须保存在assets目录下 | xuniren-avatar-debug-0002 | 不需要.license后缀 |
IAvatarCallback 回调
public interface IAvatarCallback extends IOnErrorCallback {
/**
* 模型加载开始
*
* @param figureName 人像名称
*/
void onStart(String figureName);
/**
* 模型开始加载
*/
void onModelLoaded();
/**
* 应用服务端的人像配置成功
*
* @param characterConfig 服务端的人像配置
*/
void onFigureConfigToApply(CharacterConfig characterConfig);
}
RenderEngine模块
RenderEngine负责播放,任务的编排,从而调用AvatarEngine,获取RenderEngineConfig对象:
digitalHumanSettings.getRenderEngineConfig()
方法 | 作用 | 示例/默认 | 备注 |
---|---|---|---|
setRenderWebsocketUrl | 渲染服务地址 | ws://10.158.95.141/v1/arkit/render | |
arrangeWorkerConfig.renderTextQueueSize | 播放的语句数量的队列。调用一次render() 或者大模型返回一句话算一次 | 100 | |
arrangeWorkerConfig.arrangeQueryTaskConfig.maxTaskRetryTimes | query重试的次数 | 3 |
IRenderEngineCallback 回调
requestId可以对应,调用方发的指令的requestId,
如果是query提问,接口返回的requestId以query方法传入的requestId开头
IRenderEngineCallback 回调:
public interface IRenderEngineCallback extends IOnWarningCallback {
/**
* /v1/arkit/render websocket打开
*
* @param requestId 同render和query请求的requestId
*/
void onTtsWebsocketConnect(String requestId);
/**
* /v1/arkit/render websocket关闭
*
* @param requestId 同render和query请求的requestId
* @param code websocket关闭码
* @param reason websocket 关闭原因
* @param isNormal websocket是否正常关闭
*/
void onTtsWebsocketClose(String requestId, int code, String reason, boolean isNormal);
/**
* /v1/arkit/render websocket收到数据
* @param requestId 同render和query请求的requestId
* @param element 渲染元素
*/
void onTtsDataDownloaded(String requestId, RenderElement element);
/**
* 音频或者动作被播放
*
* @param requestId 同render和query请求的requestId
* @param element 渲染元素
*/
void onTtsAudioPlayed(String requestId, RenderElement element);
/**
* /v1/arkit/render 收到字幕
* @param requestId 同render和query请求的requestId
* @param subtitleBody 字幕内容
*/
void onTtsSubtitle(String requestId, ArSubtitleBody subtitleBody);
/**
* 动作发起后,会收到start回调,如果这个动作被打断,则不会收到end回调
*
* @param requestId
* @param animName
*/
void onAnimStart(String requestId, String animName);
/**
* 动作发起后,会收到start回调,如果这个动作被打断,则不会收到end回调
*
* @param requestId
* @param animName
*/
void onAnimEnd(String requestId, String animName);
}
错误码
/**
* 未知业务相关错误
*/
int ERROR_EXCEPTION_NOT_BUSINESS = 2;
/**
* 业务RUNTIME报错
*/
int ERROR_EXCEPTION_BUSINESS_RUNTIME = 3;
/**
* 内部报错
*/
int ERROR_EXCEPTION_BUSINESS_INTERNAL = 9;
/**
* 内部报错
*/
int ERROR_EXCEPTION_BUSINESS_UNKNOWN = 10;
/**
* DigitalHumanSetting.setUrlPrefix url schema 错误
*/
int ERROR_INPUT_URL_PREFIX_SCHEMA = 411;
/**
* 发送render和query时,引擎人像未准备完成
*/
int ERROR_ENGINE_AVATAR_NOT_PREPARED = 801;
/**
* 调用了改平台没有的功能,请勿调用
*/
int ERROR_ENGINE_PLATFORM_NOT_ALLOWED = 802;
/**
* 内部解密错误
*/
int ERROR_CODEC_DECRYPT_FAIL = 901;
/**
* platConfig.appId为空
*/
int ERROR_SETTINGS_PLAT_APPID_NULL = 1011;
/**
* platConfig.appKey为空
*/
int ERROR_SETTINGS_PLAT_APPKEY_NULL = 1012;
/**
* platConfig.generateUrl为空
*/
int ERROR_SETTINGS_PLAT_GENERATEURL_NULL = 1013;
/**
* platConfig.appInfoUrl为空
*/
int ERROR_SETTINGS_PLAT_APPINFOURL_NULL = 1014;
/**
* 填写的PlatConfig鉴权为空
*/
int ERROR_SETTINGS_PLAT_TOKEN_NULL = 1015;
/**
* [组件平台] 模型文件路径
*/
int ERROR_SETTINGS_AVATAR_MODELPATH_NOT_CORRECT = 1016;
/**
* 渲染用的webscocket链接为空, 可以调用digitalHumanSettings.setUrlPrefix
*/
int ERROR_SETTING_RENDERENGINE_WEBSOCKET_URL_NULL = 1017;
/**
* callback为空
*/
int ERROR_SETTING_CALLBACK_NULL = 1021;
/**
* platCallback为空
*/
int ERROR_SETTING_PLAT_CALLBACK_NULL = 1022;
/**
* downloadCallback为空
*/
int ERROR_SETTING_DOWNLOAD_CALLBACK_NULL = 1023;
/**
* avatarCallback为空
*/
int ERROR_SETTING_AVATAR_CALLBACK_NULL = 1024;
/**
* renderEngineCallback为空
*/
int ERROR_SETTING_RENDERENGINE_CALLBACK_NULL = 1025;
/**
* 模型文件目录不可写
*/
int ERROR_SETTINGS_AVATAR_MODEL_PATH_NOT_WRITEABLE = 1031;
/**
* http请求IO异常
*/
int ERROR_HTTP_IO_EXCEPTION = 2001;
/**
* http返回值不为200
*/
int ERROR_HTTP_RESPONSE_CODE_NOT_200 = 2002;
/**
* http返回值为200,但是内容是空
*/
int ERROR_HTTP_RESPONSE_EMPTY = 2003;
/**
* 发送http请求前,序列化json失败
*/
int ERROR_HTTP_SERIALIZE_JSON = 2010;
/**
* 发送http请求后,反序列化json失败
*/
int ERROR_HTTP_DESERIALIZE_JSON = 2011;
/**
* arinfo接口,服务端返回配置内容为空
*/
int ERROR_PLAT_HTTP_APPINFO_EMPTY = 2101;
/**
* platConfig.getAppInfoUrl() 里设置url不合法
*/
int ERROR_PLAT_HTTP_URL_INCORRECT = 2102;
/**
* 修改服务端人像,不能重新加载配饰
*/
int ERROR_PLAT_FIGURE_NOT_SAME = 2103;
/**
* 内部错误,arinfo配置不能被序列号
*/
int ERROR_PLAT_DEEPCOPY_ARINFO = 2104;
/**
* 内部错误,platengine状态未准备好
*/
int ERROR_PLAT_AVATAR_NOT_PREPARED = 2105;
/**
* 服务端返回的arinfo接口,successful为false
*/
int ERROR_PLAT_RESPONSE_NOT_SUCCESSFUL = 2111;
/**
* 服务端generate接口,返回的token为空
*/
int ERROR_PLAT_GENERATE_TOKENENC_EMPTY = 2112;
/**
* 服务端generate接口,返回的token为空
*/
int ERROR_PLAT_TOKEN_NULL = 2113;
/**
* 服务端generate接口,返回的加密token为空
*/
int ERROR_PLAT_GENERATE_TOKEN_DECRYPY_ENC_EMPTY = 2114;
/**
* 下载目录不可写
*/
int ERROR_DOWNLOAD_DIRECTORY_NOT_WRITABLE = 2201;
/**
* 内部错误
*/
int ERROR_DOWNLOAD_URL_CALLBACK_EMPTY = 2203;
/**
* 下载文件的md5校验失败
*/
int ERROR_DOWNLOAD_MD5_CHECK = 2207;
/**
* 配置的ar目录不存在,请检查文件目录
*/
int ERROR_AVATAR_CASE_DIR_NOT_EXIST = 2302;
/**
* 配置的ar目录下,不存在../avatar/{人像id}/config.lua
*/
int ERROR_AVATAR_FILE_CONFIG_LUA_NOT_EXIST = 2303;
/**
* 人像初始化鉴权失败
*/
int ERROR_AVATAR_AUTH_EXCEPTION = 2311;
/**
* 人像驱动lua脚本返回不为0的值
*/
int ERROR_AVATAR_LUA_MESSAGE_CALLBACK = 2312;
/**
* 人像引擎返回错误
*/
int ERROR_AVATAR_DU_MIX_CALLBACK = 2313;
/**
* 人像引擎onEngineSetup异常
*/
int ERROR_AVATAR_DU_MIX_CALLBACK_SETUP = 2314;
/**
* Avatar3DEngine 不是可以播放的状态
*/
int ERROR_AVATAR_STATUS_NOT_NORMAL = 2315;
/**
* 人像资源解析错误
*/
int ERROR_AVATAR_RESOURCE_PARSE_PART_JSON = 2321;
/**
* 人像资源不存在
*/
int ERROR_AVATAR_RESOURCE_VALUE_NOT_EXIST = 2322;
/**
* model_android.json 文件不存在
*/
int ERROR_AVATAR_RESOURCE_ANIM_CONFIG_NOT_EXIST = 2331;
/**
* model_android.json 文件存在但不可读
*/
int ERROR_AVATAR_RESOURCE_ANIM_CONFIG_NOT_READABLE = 2332;
/**
* 人像的配饰的模型目录不存在
*/
int ERROR_AVATAR_RESOURCE_PART_DIR_NOT_READABLE = 2333;
/**
* [组件平台]模型文件model目录不存在
*/
int ERROR_SIMPLE_CHARACTER_CONFIG_MODEL_PATH_NOT_EXIST = 2341;
/**
* 模型文件model目录下计算人像错误
*/
int ERROR_SIMPLE_CHARACTER_CONFIG_AUTO_FIND_FIGURE_NAME_FAILED = 2342;
/**
* 打开用户提供的音频流报错
*/
int ERROR_ARRANGE_RENDER_AUDIO_STREAM_OPEN_FAILED = 2401;
/**
* websocket连接超时,默认5s
*/
int ERROR_WEBSOCKET_CONNECT_TIMEOUT = 2411;
/**
* interrupt 后,原有线程消耗
*/
int ERROR_ARRANGE_RENDER_WEBSOCKET_INTERRUPTED = 2412;
/**
* 渲染队列过长
*/
int ERROR_ARRANGE_WORKER_QUEUE_FULL = 2501;
/**
* 渲染websocket重试过多次数
*/
int WARNING_ARRANGE_WORKER_WEBSOCKET_RETRY_TOO_MANY_TIMES = 2502;
/**
* 渲染一帧延时大于40ms
*/
int WARNING_FRAME_DELAY_GREATER_40 = 2511;
/**
* 一个render任务,渲染延时综合大于120ms
*/
int WARNING_CUMULATE_FRAME_DELAY_TOO_LARGE = 2512;
/**
* 渲染接口,鉴权失败
*/
int ERROR_RENDER_AUTHENTICATION_FAILED = 2601;
/**
* 渲染接口,尝试多次失败
*/
int ERROR_RENDER_CONNECT_TOO_MANY_TIMES = 2602;
/**
* babel 的websocket链接端开,可能是网络原因导致
*/
int ERROR_ARRANGE_BABEL_QUERY_WEBSOCKET_NOT_OPENED = 2701;
/**
* babel提问失败
*/
int ERROR_ARRANGE_BABEL_QUERY_FAILED = 2702;
附件. 3D端渲染形象库
待更新