3D数字人交互SDK-Android版
简介
本文说明Android 端渲染SDK的使用和调用方式
SDK下载
1.0.9.3 版本 下载地址
SDK包体大小:33mb(不包含人像包大小)
支持机型信息:
- 安卓:支持CPU骁龙730G/骁龙855/联发科天玑900/天玑820 同等性能及以上芯片
- iOS : 支持iPhone8 系统版本13.3以及以上。
整体架构&功能简介
- 客户端或页面集成SDK加载形象包,本地驱动渲染数字人。
- 支持音频和文本驱动:
- 音频可以使用真人音频或自行接入的第三方的TTS音频。
- 文本驱动SDK内部会调用数字人开放平台TTS服务驱动数字人,
- 文本驱动可以开启智能动作开关,实现数字人根据播报语义智能触发动作。
-
3D数字人形象包可切换机位,动作驱动,切换配饰服装(如有多套配置服装)
请与百度运营人员联系,或者测试鉴权信息和人像包!
DEMO测试 & 资源准备
- 从运营人员处获取license鉴权文件,按照上文提供包名和鉴权文件的md5。demo的包名是com.baidu.aip.digitalhuman.avartar, 签名文件的md5是 6B92C246956520E715F4078D2A6E2961。 复制到assets目录下, 并填写文件名到demo中
- 从运营人员处获取人像资源包
- 从组件商店 购买《交互组件-端渲染交互组件-3D数字人》及《定制服务-语音合成》。绑定应用后,将应用的appId,appKey填入demo
- 选择一个音色公共音色库或者克隆音色
购买入口:组件商店 (依次购买: 1. 定制服务-语音合成 2. 交互组件-端渲染交互组件-3D数字人)
具体DEMO测试代码修改
使用较新的android studio导入即可运行, gradle 的版本为8.8,需要jre 17或以上版本运行
从运营人员处获取license鉴权文件和人像资源包
- 申请license文件(见下文的鉴权&申请),需要你的包名和签名文件的md5,获取后的license文件放入到assets目录下
- 修改 avatar3DConfig.setLicenseFilename("xuniren-avatar-debug-0004"); 里面的"xuniren-avatar-debug-0004"为xuniren-avatar-debug-0004.license为你的license文件名
注意license的有效期,在license失效前,必须强制更新带有新license的app
1 Avatar3DConfig avatar3DConfig = digitalHumanSettings.getAvatarConfig();
2 // asset 目录下的xuniren-avatar-debug-0004.license文件
3 avatar3DConfig.setLicenseFilename("xuniren-avatar-debug-0004");
- 从运营人员获取人像包。在assets目录下,解压人像资源包到case目录下,assets目录结构(含license)如下
从 组件商店 购买《交互组件-端渲染交互组件-3D数字人》及《交互组件-语音合成》,购买后在「应用管理」创建应用并绑定组件,来获取appId和appKey
appId和appKey的获取请参照https://cloud.baidu.com/doc/AI_DH/s/plyy6xhi0, 注意数字人文字驱动需要额外绑定「语音合成」组件。
- demo启动后,选择如下3种方式的1种
- 在代码里修改appId、appKey后运行demo
- demo运行后,可以在UI界面中填写 appId, appKey (token无需填写)
- demo运行后,可以在UI界面中填写token(token填写后, appId, appKey无效)
1 /**
2 * 网页上的应用鉴权信息
3 */
4 public static final String DEFAULT_APP_ID = "i-qjwqyvdm3e40y";
5
6 /**
7 * 网页上的应用鉴权信息
8 */
9 public static final String DEFAULT_APP_KEY = "n5j0cyq6jnnkh8r573f5";
10
11 /**
12 * tts音色
13 */
14 public static final int TTS_PERSON = 5116;
15
16 /**
17 * 设置的token, 如果为空,则用appId appKey计算, 建议服务端生成
18 */
19 private static final String DEFAULT_TOKEN = "";
demo初始化运行异常排查思路
- 进入第二个Activity后,有背景图,无人像,点按钮app退出
判断为license错误
- assets目录下确保有xuniren-avatar-debug-0004.license
- 修改 avatar3DConfig.setLicenseFilename("xuniren-avatar-debug-0004"); 里面的"xuniren-avatar-debug-0004"为xuniren-avatar-debug-0004.license为你的license文件名
- 有数字人,动作正常,但是点击RENDER按钮后,无反应
确认appId, appKey是否填对,网页上勾选”3D端渲染“+”语音合成“权限
如果”播放音频“有声音,那么缺”语音合成“权限
正式鉴权&申请
license需要额外申请, 提供给百度运营人员如下信息,用于生成license文件
- 包名
- 签名文件的md5值
license文件获取后,必须放在assets目录下
注意license的有效期,在license失效前,必须强制更新带有新license的app
1 Avatar3DConfig avatar3DConfig = digitalHumanSettings.getAvatarConfig();
2 // asset 目录下的xuniren-avatar-debug-0004.license文件
3 avatar3DConfig.setLicenseFilename("xuniren-avatar-debug-0004");
包名和签名md5获取
包名: 每个 Android 应用均有一个唯一的应用 ID。安卓以 Java 包的形式管理应用。
1 // demo的包名定义在app/build.gradle中
2
3 applicationId "com.baidu.ar.avatarsdksample"
具体说明见官方文档: https://developer.android.com/studio/build/application-id.html
签名md5
生成签名文件: https://developer.android.com/studio/publish/app-signing.html
使用demo中的签名文件和自己的包名,报错中有md5值,下方的报错中的md5值即是6B92C246956520E715F4078D2A6E2961
1DemoAvatarCallback onError: name=license,code=2301,subCode=13,
2 message=onVirtualHumanAuth failed :13 licenseKey:xuniren-avatar-debug-0004,
3 algorithmId:32;packageName:com.baidu.aip.digitalhuman.avartar,
4 md5:6B92C246956520E715F4078D2A6E2961;deviceId:,fingerVersion:5.0.0.9-isolated;
5 licenseSdkVersion:5.0.0.9-isolated,exceptionClassName=AvatarAuthException
形象定制(使用公共形象可以跳过)
1、形象包制作:分为“定制形象”和“公共库形象”两种。
- 定制形象
用户提供设计原画或已经建模好的3D人物模型。为保证人物模型可以被端渲染SDK驱动使用,百度侧进行人像模型适配,预计需要3-4周时间。人像适配过程中允许用户调整和修改,确保人像符合用户需求。
- 公共形象库
用户从公共形象库中选择心仪的形象,公共形象参考本文最后《附件.3D端渲染人像库》。为保证人物模型可以被端渲染SDK驱动使用,百度侧进行人像模型适配,预计需要3-4周时间。
形象定制及适配费用相关问题,可咨询:咨询单
官方助手
SDK内部模块和流程
内部模块
- AvatarEngine: 人像模块, 负责人像的显示,动作口型
- RenderEngine:渲染模块, 用于编排指令,播放音频及调用人像
模块流程:
1AvatarEngine->RenderEngine
初始化
需要输入组件平台的token,token生成方式,接口通用说明
鉴权 token 生成方法参考上述文档或者Demo中的TokenUtil.generateToken方法
为了避免密钥泄露,建议由开发者的后端服务保存 appId/appKey 生成 token,然后通过客户端和服务端间的可信链路传输 token
SDK 集成
SDK只依赖网络权限,用于连接tts和口型驱动服务
AndroidManifest.xml文件
1 <uses-permission android:name="android.permission.INTERNET" />
2 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
依赖库
本地库 app\avatar-libs下
- arplay-release-xxx.aar
- avatar.jar
开源库: 'com.google.code.gson:gson:2.11.0'
备注:目前高版本的gradle中集成本地aar文件的方式主要有两种
- 如demo,在外层的settings.gradle中添加flatDir dirs("app/avatar-libs")
- 新建module ,build.gradle改为configurations.maybeCreate("default") 及 artifacts.add("default", file('arplay-release-xx.aar'))
推荐UI集成方式
参考demo中的DigitalHumanDisplayFragment, 使用TextureView进行渲染
1 private void initDigitalHumanDisplayUI() {
2 digitalHumanDisplayFragment = new DigitalHumanDisplayFragment();
3 FragmentManager fragmentManager = getSupportFragmentManager();
4 FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
5 fragmentTransaction.add(R.id.fcv, digitalHumanDisplayFragment).commit();
6 }
SDK具体参数及回调
调用流程
- DigitalHumanSettings设置参数 ,包含上文的license文件的设置
- OpenEngineCallback 设置上面2个模块的回调
- DigitalHumanEngine 使用DigitalHumanSettings和EngineCallback 初始化, 初始调用init及onSurfaceTextureAvailable方法
- 等待onModelLoaded回调
- DigitalHumanEngine 控制数字人行为
初始化DigitalHumanEngine
DigitalHumanEngine.init方法
1 /**
2 * 初始化数字人
3 *
4 * @param context
5 * @param settings 数字人配置
6 * @param engineCallback 多个callback合一
7 * @throws ConfigInputException 配置错误
8 */
9 public void init(@NonNull Context context, @NonNull DigitalHumanSettings settings,
10 EngineCallback engineCallback) throws ConfigInputException
DigitalHumanSettings设置参数:
1private DigitalHumanSettings createDigitalHumanSettings(String token, String urlPrefix) {
2 DigitalHumanSettings digitalHumanSettings = getDigitalHumanSettings();
3 try {
4 digitalHumanSettings.setUrlPrefix(urlPrefix);
5 PlatConfig platConfig = digitalHumanSettings.getPlatConfig();
6 platConfig.setToken(token);
7 Avatar3DConfig avatar3DConfig = digitalHumanSettings.getAvatarConfig();
8 // asset 目录下的xuniren-avatar-debug-0004.license 鉴权文件
9 avatar3DConfig.setLicenseFilename("xuniren-avatar-debug-0004");
10 // 渲染等级,HIGH使用高精人像,MIDDLE和LOW使用普通, 部分人像无渲染等级区别
11 avatar3DConfig.setDisplayQualityLevel(DisplayQualityLevel.HIGH);
12 // 模型文件路径,demo中从assets目录复制到该目录
13 avatar3DConfig.setModelPath(caseCacheDir.getAbsolutePath());
14 // 设置最大并发TTS数量, 注意组件服务端有最大tts并发设置,所有进行tts发音的设备的实时并发数不能超过这个并发,一般设置1或者2
15 digitalHumanSettings.getRenderEngineConfig().setMaxTtsConcurrency(MAX_TTS_CONCURRENCY);
16 } catch (InputException e) {
17 Log.e(TAG, "Fail to init digitalHumanSettings ", e);
18 }
19 return digitalHumanSettings;
20 }
EngineCallback 初始化:
1 // SplashActivity.initDigitalHumanEngine
2
3 EngineCallback engineCallback = new OpenEngineCallback(new DemoAvatarCallback(handler), new DemoRenderEngineCallback(getApplicationContext()));
DigitalHumanEngine 使用DigitalHumanSettings和EngineCallback 初始化:
1 // SplashActivity.initDigitalHumanEngine
2 // 检查
3 DigitalHumanEngine digitalHumanEngine = DigitalHumanEngine.getInstance();
4 digitalHumanEngine.checkDigitalHumanSettings(digitalHumanSettings, engineCallback);
5
6 // 初始化
7 digitalHumanEngine.init(this, digitalHumanSettings, engineCallback);
8
9 //init 调用后需要调用下文的DigitalHumanEngine.onSurfaceTextureAvailable,完成初始化
初始化Texture和生命周期
输入的TextureView的宽高比必须按照9:16,否则渲染画布的宽度会按照高度同比计算
参考Demo中的DigitalHumanDisplayFragment,layout中布局固定了9:16的宽度
- DigitalHumanEngine.onSurfaceTextureAvailable方法, 用于监听SurfaceView初始化
- DigitalHumanEngine.onPause方法, 绑定activity的onPause事件
- DigitalHumanEngine.onResume方法,绑定activity的onResume事件
- DigitalHumanEngine.destroy方法, 销毁
1 /**
2 * TextureView初始化成功
3 * TextureView.SurfaceTextureListener 透传
4 *
5 * @param surface
6 * @param width
7 * @param height
8 * @param requestOrientation
9 */
10 public void onSurfaceTextureAvailable(@NonNull TextureView textureView, @NonNull SurfaceTexture surface, int width, int height, int requestOrientation)
11
12 /**
13 * android onPause事件透传
14 */
15 public void onPause()
16
17 /**
18 * android onResume事件透传
19 */
20 public void onResume()
21
22 /**
23 * 销毁SDK
24 */
25 public void destroy() {
示例
- 监听onSurfaceTextureAvailable ,调用digitalHumanEngine.onSurfaceTextureAvailable
1private class DisplaySurfaceTextureListener implements TextureView.SurfaceTextureListener {
2
3 @Override
4 public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) {
5 if (getActivity() == null) {
6 throw new DemoInvalidProcessException("activity is not attached");
7 }
8 lastTextureSurface = surface;
9 lastTextureSize = new Size(width, height);
10 digitalHumanEngine.onSurfaceTextureAvailable(textureView, surface, width, height, getActivity().getRequestedOrientation());
11 }
12
- textureView 注册事件,注册TextureView setOnTouchListener
1 private void initView(ViewGroup rootView) {
2 TextureView textureView = rootView.findViewById(R.id.texture_view);
3 textureView.setOpaque(false);
4 textureView.setSurfaceTextureListener(new DisplaySurfaceTextureListener());
5 textureView.setRotation(0);
6 }
- 生命周期相关调用
1 @Override
2 public void onDestroy() {
3 super.onDestroy();
4 digitalHumanEngine.destroy();
5 }
6
7
8 @Override
9 public void onPause() {
10 super.onPause();
11 digitalHumanEngine.onPause();
12 }
13
14
15
16 @Override
17 public void onResume() {
18 super.onResume();
19 digitalHumanEngine.onResume();
20 }
DigitalHumanEngine 数字人控制方法
参考demo中的AvatarControllerFragment
- DigitalHumanEngine.mute 方法,数字人静音
- DigitalHumanEngine.unMute方法 , 数字人取消静音
1 /**
2 * 静音
3 */
4 public void mute()
5
6 /**
7 * 取消静音
8 */
9 public void unMute()
10
DigitalHumanEngine 数字人播放方法
参考demo中的InteractiveControllerFragment
- DigitalHumanEngine.playAnim方法
注意,目前数字人的动作可以随时触发,随时打断当前动作。动作流程与播放无关。
- 可以在字幕收到时,自行触发动作
- 智能动作开启时,会自带动作,注意此时不要发动作,以免打断
1 /**
2 * 播放动画
3 * @param animName
4 * @param requestId
5 */
6 public void playAnim(String animName, String requestId) ;
- TtsConfig类, 用于下文的render里的tts设置和智能动作
1public class TtsConfig {
2
3 /**
4 * 发音人
5 */
6 @With
7 private String person = "5116";
8
9
10 /**
11 * 语速,取值范围:0-15
12 */
13 private int speed = 5;
14
15
16 /**
17 * 音调,取值范围:0-15
18 */
19 private int pitch = 5;
20
21
22 /**
23 * 组件平台,是否开启智能动作
24 */
25 @JsonIgnore
26 private boolean autoAnimoji = false;
27}
- DigitalHumanEngine.render方法,播报文本或者上传音频
- DigitalHumanEngine.interrupt方法,打断播报&动作
1 /**
2 * 播放文本,使用默认的TtsConfig
3 *
4 * @param text
5 * @param requestId
6 */
7 public void render(String text, String requestId);
8
9
10 /**
11 * 播放文本
12 *当使用LITE版克隆音色及公共音色库中支持多语言的音色时,支持自动识别输入语言来进行播报。例:当输入俄文时,使用俄语播报。
13 * @param text
14 * @param requestId
15 * @param ttsConfig 见TtsConfig类
16 */
17 public void render(String text, String requestId, TtsConfig ttsConfig);
18
19 /**
20 * 播放音频流
21 * @param audioInputStream
22 * @param requestId
23 */
24 public void render(IAudioStream audioInputStream, String requestId);
25
26 /**
27 * 打断当前播放&动作
28 */
29 public void interrupt();
30
IAudioStream 用于SDK回调获取InputStream, 注意SDK内部有重试机制,
1public interface IAudioStream extends AutoCloseable {
2
3 /**
4 * 如果请求过程中失败的话 这里可能会多次调用,每次需要一个从头开始的InputStream
5 * @return
6 */
7 InputStream getReadableInputStream();
8
9
10 /**
11 * 需要关闭当前的InputStream
12 * @throws Exception
13 */
14 @Override
15 void close() throws Exception;
16
17
18 /**
19 * 当前流读完
20 * @param isAllRead
21 */
22 void onReadFinish(boolean isAllRead);
23}
24
DigitalHumanSettings 总设置参数
EngineCallback 回调
EngineCallback 内实际是2个回调,均为IOnErrorCallback或IOnWarningCallback
- IOnErrorCallback.onError 人像初始化前的流程, 有此回调后SDK流程终止
- IOnWarningCallback.onWarning 不影响流程的警告, SDK初始化成功后,网络相关的问题以onWarning输出
通用报错回调:
1public interface IOnErrorCallback extends IOnWarningCallback {
2
3
4 /**
5 * 人像初始化前的流程, 有此回调后SDK流程终止
6 *
7 * @param name 保存名称或者id
8 * @param code SDK错误码
9 * @param subCode SDK子错误码,通常为依赖模块或者接口的错误码
10 * @param message 具体报错信息
11 * @param exceptionClassName 异常类名
12 */
13 void onError(String name, int code, int subCode, String message, String exceptionClassName);
14}
15
16public interface IOnWarningCallback {
17
18 /**
19 * 不影响流程的警告
20 * SDK初始化成功后,网络相关的问题以onWarning输出
21 *
22 * @param name 名称或者id
23 * @param code 错误码
24 * @param subCode 子错误码,通常为依赖模块或者接口的错误码
25 * @param message 具体报错信息
26 * @param exceptionClassName 异常类名
27 */
28 void onWarning(String name, int code, int subCode, String message, String exceptionClassName);
29}
30
处理背景图片
SDK渲染的TextureView为透明, 可以参考demo自行使用ImageView作为背景
AvatarEngine模块
AvatarEngine负责人像的显示,动作口型,获取AvatarConfig对象:
1digitalHumanSettings.getAvatarConfig()
方法 | 作用 | 示例/默认 | 备注 |
---|---|---|---|
displayQualityLevel | 渲染等级 | DisplayQualityLevel.HIGH | 其它选项 DisplayQualityLevel.MIDDLE DisplayQualityLevel.LOW |
licenseFilename | 鉴权文件名。必须保存在assets目录下 | xuniren-avatar-debug-0004 | 不需要.license后缀 |
IAvatarCallback 回调
1public interface IAvatarCallback extends IOnErrorCallback {
2
3 /**
4 * 模型加载开始
5 *
6 * @param figureName 人像名称
7 */
8 void onStart(String figureName);
9
10
11 /**
12 * 模型开始加载
13 */
14 void onModelLoaded();
15
16
17 /**
18 * 应用服务端的人像配置成功
19 *
20 * @param characterConfig 服务端的人像配置
21 */
22 void onFigureConfigToApply(AbstractCharacterConfig characterConfig);
23
24}
RenderEngine模块
RenderEngine负责播放,任务的编排,从而调用AvatarEngine,获取RenderEngineConfig对象:
1digitalHumanSettings.getRenderEngineConfig()
方法 | 作用 | 示例/默认 | 备注 |
---|---|---|---|
setRenderWebsocketUrl | 渲染服务地址 | ws://10.158.95.141/v1/arkit/render | |
arrangeWorkerConfig.renderTextQueueSize | 播放的语句数量的队列。调用一次render() 或者大模型返回一句话算一次 | 100 | |
arrangeWorkerConfig.arrangeQueryTaskConfig.maxTaskRetryTimes | query重试的次数 | 3 |
IRenderEngineCallback 回调
调用时,如render中填入自定义的requestId,可以与回调中的requestId对应,接口返回的requestId会以传入的requestId开头。
流程:
下载tts数据->tts相关回调
播放->播放相关回调
连接下载相关
1 /**
2 * /v1/arkit/render websocket打开
3 *
4 * @param requestId 同render和query请求的requestId
5 */
6 void onTtsWebsocketConnect(String requestId);
7
8
9 /**
10 * /v1/arkit/render websocket关闭
11 *
12 * @param requestId 同render和query请求的requestId
13 * @param code websocket关闭码
14 * @param reason websocket 关闭原因
15 * @param isNormal websocket是否正常关闭
16 */
17 void onTtsWebsocketClose(String requestId, int code, String reason, boolean isNormal);
播放相关
1 /**
2 * /v1/arkit/render 收到字幕
3 *
4 * @param requestId 同render和query请求的requestId
5 * @param subtitleBody 字幕内容
6 */
7 void onTtsSubtitle(String requestId, ArSubtitleBody subtitleBody);
8
9 /**
10 * 渲染开始
11 *
12 * @param requestId
13 * @param isLocalAnimTask 如果是本地动作,则为true
14 */
15 void onRenderStart(String requestId, boolean isLocalAnimTask);
16
17 /**
18 * 渲染结束
19 *
20 * @param requestId
21 * @param isLocalAnimTask
22 */
23 void onRenderComplete(String requestId, boolean isLocalAnimTask);
24
25 /**
26 * 动作发起后,会收到start回调,如果这个动作被打断,则不会收到end回调
27 *
28 * @param requestId
29 * @param animName
30 */
31 void onAnimStart(String requestId, String animName);
32
33 /**
34 * 动作发起后,会收到start回调,如果这个动作被打断,则不会收到end回调
35 *
36 * @param requestId
37 * @param animName
38 */
39 void onAnimEnd(String requestId, String animName);
缓存
如果遇见高频播放文本,可以缓存,一个是tts下载后的数据可以缓存,一个是播放后的数据可以缓存,推荐播放后的。
demo中有利用返回的SimpleRenderElement 流,进行缓存的示例,是否缓存及缓存的逻辑由调用方控制 注意字幕也在缓存中,因此要注意字幕切分的选项设置
demo中有使用onTtsAudioPlayed进行缓存的示例,相关代码见DemoRenderEngineCallback和TtsCacheManager
1 /**
2 * /v1/arkit/render websocket收到数据
3 *
4 * @param requestId 同render和query请求的requestId
5 * @param element 渲染元素
6 */
7 void onTtsDataDownloaded(String requestId, SimpleRenderElement element);
8
9 /**
10 * 音频或者动作被播放
11 *
12 * @param requestId 同render和query请求的requestId
13 * @param element 渲染元素
14 */
15 void onTtsAudioPlayed(String requestId, SimpleRenderElement element);
错误码
1
2public interface IExceptionCode {
3
4 /**
5 * 未知业务相关错误
6 */
7 int ERROR_EXCEPTION_NOT_BUSINESS = 2;
8
9 /**
10 * 业务RUNTIME报错
11 */
12 int ERROR_EXCEPTION_BUSINESS_RUNTIME = 3;
13
14 /**
15 * 内部报错
16 */
17 int ERROR_EXCEPTION_BUSINESS_INTERNAL = 9;
18
19 /**
20 * 内部报错
21 */
22 int ERROR_EXCEPTION_BUSINESS_UNKNOWN = 10;
23
24 /**
25 * DigitalHumanSetting.setUrlPrefix url schema 错误
26 */
27 int ERROR_INPUT_URL_PREFIX_SCHEMA = 411;
28
29 /**
30 * 发送render和query时,引擎人像未准备完成
31 */
32 int ERROR_ENGINE_AVATAR_NOT_PREPARED = 801;
33
34
35 /**
36 * 调用了改平台没有的功能,请勿调用
37 */
38 int ERROR_ENGINE_PLATFORM_NOT_ALLOWED = 802;
39
40 /**
41 * 内部解密错误
42 */
43 int ERROR_CODEC_DECRYPT_FAIL = 901;
44
45 /**
46 * platConfig.appId为空
47 */
48 int ERROR_SETTINGS_PLAT_APPID_NULL = 1011;
49
50 /**
51 * platConfig.appKey为空
52 */
53 int ERROR_SETTINGS_PLAT_APPKEY_NULL = 1012;
54
55 /**
56 * platConfig.generateUrl为空
57 */
58 int ERROR_SETTINGS_PLAT_GENERATEURL_NULL = 1013;
59
60 /**
61 * platConfig.appInfoUrl为空
62 */
63 int ERROR_SETTINGS_PLAT_APPINFOURL_NULL = 1014;
64
65 /**
66 * 填写的PlatConfig鉴权为空
67 */
68 int ERROR_SETTINGS_PLAT_TOKEN_NULL = 1015;
69
70 /**
71 * [组件平台] 模型文件路径
72 */
73 int ERROR_SETTINGS_AVATAR_MODELPATH_NOT_CORRECT = 1016;
74
75 /**
76 * 渲染用的webscocket链接为空, 可以调用digitalHumanSettings.setUrlPrefix
77 */
78 int ERROR_SETTING_RENDERENGINE_WEBSOCKET_URL_NULL = 1017;
79
80 /**
81 * callback为空
82 */
83 int ERROR_SETTING_CALLBACK_NULL = 1021;
84
85 /**
86 * platCallback为空
87 */
88 int ERROR_SETTING_PLAT_CALLBACK_NULL = 1022;
89
90 /**
91 * downloadCallback为空
92 */
93 int ERROR_SETTING_DOWNLOAD_CALLBACK_NULL = 1023;
94
95 /**
96 * avatarCallback为空
97 */
98 int ERROR_SETTING_AVATAR_CALLBACK_NULL = 1024;
99
100 /**
101 * renderEngineCallback为空
102 */
103 int ERROR_SETTING_RENDERENGINE_CALLBACK_NULL = 1025;
104
105 /**
106 * 模型文件目录不可写
107 */
108 int ERROR_SETTINGS_AVATAR_MODEL_PATH_NOT_WRITEABLE = 1031;
109
110 /**
111 * http请求IO异常
112 */
113 int ERROR_HTTP_IO_EXCEPTION = 2001;
114
115 /**
116 * http返回值不为200
117 */
118 int ERROR_HTTP_RESPONSE_CODE_NOT_200 = 2002;
119
120 /**
121 * http返回值为200,但是内容是空
122 */
123 int ERROR_HTTP_RESPONSE_EMPTY = 2003;
124
125 /**
126 * 发送http请求前,序列化json失败
127 */
128 int ERROR_HTTP_SERIALIZE_JSON = 2010;
129
130 /**
131 * 发送http请求后,反序列化json失败
132 */
133 int ERROR_HTTP_DESERIALIZE_JSON = 2011;
134
135 /**
136 * arinfo接口,服务端返回配置内容为空
137 */
138 int ERROR_PLAT_HTTP_APPINFO_EMPTY = 2101;
139
140 /**
141 * platConfig.getAppInfoUrl() 里设置url不合法
142 */
143 int ERROR_PLAT_HTTP_URL_INCORRECT = 2102;
144
145 /**
146 * 修改服务端人像,不能重新加载配饰
147 */
148 int ERROR_PLAT_FIGURE_NOT_SAME = 2103;
149
150 /**
151 * 内部错误,arinfo配置不能被序列号
152 */
153 int ERROR_PLAT_DEEPCOPY_ARINFO = 2104;
154
155 /**
156 * 内部错误,platengine状态未准备好
157 */
158 int ERROR_PLAT_AVATAR_NOT_PREPARED = 2105;
159
160 /**
161 * 服务端返回的arinfo接口,successful为false
162 */
163 int ERROR_PLAT_RESPONSE_NOT_SUCCESSFUL = 2111;
164
165 /**
166 * 服务端generate接口,返回的token为空
167 */
168 int ERROR_PLAT_GENERATE_TOKENENC_EMPTY = 2112;
169
170 /**
171 * 服务端generate接口,返回的token为空
172 */
173 int ERROR_PLAT_TOKEN_NULL = 2113;
174
175 /**
176 * 服务端generate接口,返回的加密token为空
177 */
178 int ERROR_PLAT_GENERATE_TOKEN_DECRYPY_ENC_EMPTY = 2114;
179
180 /**
181 * 下载目录不可写
182 */
183 int ERROR_DOWNLOAD_DIRECTORY_NOT_WRITABLE = 2201;
184
185 /**
186 * 内部错误
187 */
188 int ERROR_DOWNLOAD_URL_CALLBACK_EMPTY = 2203;
189
190 /**
191 * 下载文件的md5校验失败
192 */
193 int ERROR_DOWNLOAD_MD5_CHECK = 2207;
194
195
196 /**
197 * 配置的ar目录不存在,请检查文件目录
198 */
199 int ERROR_AVATAR_CASE_DIR_NOT_EXIST = 2302;
200
201 /**
202 * 配置的ar目录下,不存在../avatar/{人像id}/config.lua
203 */
204 int ERROR_AVATAR_FILE_CONFIG_LUA_NOT_EXIST = 2303;
205
206 /**
207 * 人像初始化鉴权失败
208 */
209 int ERROR_AVATAR_AUTH_EXCEPTION = 2311;
210
211 /**
212 * 人像驱动lua脚本返回不为0的值
213 */
214 int ERROR_AVATAR_LUA_MESSAGE_CALLBACK = 2312;
215
216 /**
217 * 人像引擎返回错误
218 */
219 int ERROR_AVATAR_DU_MIX_CALLBACK = 2313;
220
221 /**
222 * 人像引擎onEngineSetup异常
223 */
224 int ERROR_AVATAR_DU_MIX_CALLBACK_SETUP = 2314;
225
226 /**
227 * Avatar3DEngine 不是可以播放的状态
228 */
229 int ERROR_AVATAR_STATUS_NOT_NORMAL = 2315;
230
231 /**
232 * 人像资源解析错误
233 */
234 int ERROR_AVATAR_RESOURCE_PARSE_PART_JSON = 2321;
235
236 /**
237 * 人像资源不存在
238 */
239 int ERROR_AVATAR_RESOURCE_VALUE_NOT_EXIST = 2322;
240
241
242 /**
243 * model_android.json 文件不存在
244 */
245 int ERROR_AVATAR_RESOURCE_ANIM_CONFIG_NOT_EXIST = 2331;
246
247 /**
248 * model_android.json 文件存在但不可读
249 */
250 int ERROR_AVATAR_RESOURCE_ANIM_CONFIG_NOT_READABLE = 2332;
251
252 /**
253 * 人像的配饰的模型目录不存在
254 */
255 int ERROR_AVATAR_RESOURCE_PART_DIR_NOT_READABLE = 2333;
256
257 /**
258 * [组件平台]模型文件model目录不存在
259 */
260 int ERROR_SIMPLE_CHARACTER_CONFIG_MODEL_PATH_NOT_EXIST = 2341;
261
262
263 /**
264 * 模型文件model目录下计算人像错误
265 */
266 int ERROR_SIMPLE_CHARACTER_CONFIG_AUTO_FIND_FIGURE_NAME_FAILED = 2342;
267
268 /**
269 * 打开用户提供的音频流报错
270 */
271 int ERROR_ARRANGE_RENDER_AUDIO_STREAM_OPEN_FAILED = 2401;
272
273 /**
274 * websocket连接超时,默认5s
275 */
276 int ERROR_WEBSOCKET_CONNECT_TIMEOUT = 2411;
277
278 /**
279 * interrupt 后,原有线程消耗
280 */
281 int ERROR_ARRANGE_RENDER_WEBSOCKET_INTERRUPTED = 2412;
282
283 /**
284 * 渲染队列过长
285 */
286 int ERROR_ARRANGE_WORKER_QUEUE_FULL = 2501;
287
288 /**
289 * 渲染websocket重试过多次数
290 */
291 int WARNING_ARRANGE_WORKER_WEBSOCKET_RETRY_TOO_MANY_TIMES = 2502;
292
293 /**
294 * 渲染一帧延时大于40ms
295 */
296 int WARNING_FRAME_DELAY_GREATER_40 = 2511;
297
298 /**
299 * 一个render任务,渲染延时综合大于120ms
300 */
301 int WARNING_CUMULATE_FRAME_DELAY_TOO_LARGE = 2512;
302
303 /**
304 * 渲染接口,鉴权失败
305 */
306 int ERROR_RENDER_AUTHENTICATION_FAILED = 2601;
307
308
309 /**
310 * 渲染接口,尝试多次失败
311 */
312 int ERROR_RENDER_CONNECT_TOO_MANY_TIMES = 2602;
313
314 /**
315 * babel 的websocket链接端开,可能是网络原因导致
316 */
317 int ERROR_ARRANGE_BABEL_QUERY_WEBSOCKET_NOT_OPENED = 2701;
318
319 /**
320 * babel提问失败
321 */
322 int ERROR_ARRANGE_BABEL_QUERY_FAILED = 2702;
323
324}
325