手语数字人交互SDK-Android版
简介
本文档说明Android端手语数字人SDK使用以及调用方式
一、集成
1、 准备工作
1.1、包名和签名md5获取
包名: 每个 Android 应用均有一个唯一的应用 ID。安卓以 Java 包的形式管理应用。
1defaultConfig {
2 applicationId "com.baidu.ar.avatar.sample"
3 }
具体说明见官方文档: https://developer.android.com/build/configure-app-module?hl=zh-cn
签名md5
生成签名文件: https://developer.android.com/studio/publish/app-signing.html
方法1:
1命令行输入 keytool –list –v –keystore <签名文件路径>
2、SDK 集成
引入SDK aar包: module_core-jnidev-release.aar.aar
2.1、app目录新建libs目录,放入aar包,在build.gradle中增加配置如下
1implementation 'com.google.code.gson:gson:2.10.1'
2implementation files('libs/module_core-jnidev-release.aar.aar')
2.2、Android studio 配置
2.2.1、设置-> Build, Execution, Deployment-> Build Tools -> Gradle -> Gradle JDK, 设置java 11
2.3、系统权限配置以及申请
2.3.1、权限配置
1 <uses-permission android:name="android.permission.INTERNET" />
2 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
3 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
4 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
5 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
6 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
7 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
8 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
9 <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
2.3.2、权限申请
参考demo BaseActivity示例,所列举的权限为最低权限要求,如果缺少某一个,会导致sdk出现异常。
二、SDK 调用以及API 说明
1、环境设置
1void setEnv(Context context, ChirologyCodes.EnvType envType);
参数 | 含义 | 备注 |
---|---|---|
context | 上下文 | |
envType | Release: 正式环境 Develop: 测试环境 |
调用示例
1ChirologyAvatar.getInstance().setEnv(MainActivity.this, ChirologyCodes.EnvType.Develop);
2、日志开关
1void setLogType(LogType type)
参数 | 含义 | 备注 |
---|---|---|
type | NONE: 关闭; ERROR:错误信息; WARN: 警告信息; DEBUG:debug信息; INFO: info信息; VERBOSE: 全量信息 |
调用示例
1LogTool.setLogType(ChirologyCodes.LogType.NONE);
3、SDK 授权相关
3.1、设备授权
appKey,seceretKey为一台设备独有,一个设备要使用手语数字人必须要有一对appKey,seceretKey
1boolean initLicenseBatch(final Context context, final String appKey,
2 final String seceretKey, final VirtualAuth.AuthCallBack authCallback)
参数 | 含义 | 备注 |
---|---|---|
context | 上下文 | |
appKey | 设备ak | 非空,由百度提供,为一台设备的独有。请向百度申请 |
seceretKey | 设备sk | 非空,由百度提供,为一台设备的独有。请向百度申请 |
authCallback | code:0:成功,其他:失败 subCode:后端返回状态码 msg: 提示消息 |
调用示例
1String ak = deviceAppKeyEdit.getText().toString().trim();
2String sk = deviceSeceretKeyEdit.getText().toString().trim();
3ChirologyAvatar.getInstance().initLicenseBatch(MainActivity.this, ak, sk, new VirtualAuth.AuthCallBack() {
4 @Override
5 public void onMessage(int code, int subCode, String msg) {
6
7 }
8});
3.2、设备授权码激活/续期
当使用新的appKey,seceretKey时必须进行激活,激活方式为使用时长码激活,激活码会随着appKey,seceretKey 提供,使用项目授权方式不需要激活。
1boolean renewExpirationDate(final Context context, final String activateCode,
2 final VirtualAuth.AuthRenewCallBack renewCallBack)
参数 | 含义 | 备注 |
---|---|---|
context | 上下文 | |
activateCode | 激活码 | 百度提供ak.sk 时携带的激活码 |
authCallback | code:0:成功,其他:失败 subCode:后端返回状态码 msg: 提示消息 |
调用示例
1String trim = activateCodeEdit.getText().toString().trim();
2ChirologyAvatar.getInstance().renewExpirationDate(MainActivity.this, trim, new VirtualAuth.AuthRenewCallBack() {
3 @Override
4 public void onAuthRenewStatus(int code, int subCode, long expirationTime, String msg) {
5
6 }
7 });
8
3.3、项目授权
1boolean initProjectAuth(final Context context, final String projectAk, final String projectSk,
2 final VirtualAuth.AuthCallBack authCallback)
参数 | 含义 | 备注 |
---|---|---|
context | 上下文 | |
projectAk | 项目ak | 非空,由百度提供,为一个项目独有。请向百度申请 |
projectSk | 项目sk | 非空,由百度提供,为一个项目独有。请向百度申请 |
authCallback | code:0:成功,其他:失败 subCode:后端返回状态码 msg: 提示消息 |
调用示例
1String projectAk = projectAkEdit.getText().toString().trim();
2String projectsk = projectskEdit.getText().toString().trim();
3ChirologyAvatar.getInstance().initProjectAuth(MainActivity.this, projectAk, projectsk, new VirtualAuth.AuthCallBack() {
4 @Override
5 public void onMessage(int code, int subCode, String msg) {
6
7 }
8});
3.4、查看设备状态
1boolean getOauthState(final Context context, final VirtualAuth.AuthStateCallBack authStateCallback)
参数 | 含义 | 备注 |
---|---|---|
context | 上下文 | |
authStateCallback | code:0:成功,其他:失败 subCode: 后端返回状态码 activeTime:生效时间,异常时返回0 expirationTime:到期时间,异常时返回0 msg: 提示消息 |
调用示例
1ChirologyAvatar.getInstance().getOauthState(MainActivity.this, new VirtualAuth.AuthStateCallBack() {
2 @Override
3 public void onAuthStatus(int code, int subCode, long activeTime, long expirationTime, String msg) {
4
5 }
6});
3.5、换绑设备
当一个授权码还存在有效期,但是设备坏了的情况下,可以使用这个接口进行授权设备的换绑,使用项目授权方式时不可进行换绑。
换绑接口有次数限制且占用总设备数量,非特殊情况不宜调用,最大换绑次数3次
1boolean changeDeviceBind(final Context context, final VirtualAuth.ChangeDevCallBack callBack)
参数 | 含义 | 备注 |
---|---|---|
context | 上下文 | |
callBack | code:0:成功,其他:失败 subCode:后端返回状态码 msg: 提示消息 |
调用示例
1ChirologyAvatar.getInstance().changeDeviceBind(MainActivity.this, new VirtualAuth.ChangeDevCallBack() {
2 @Override
3 public void onAuthStatus(int code, int subCode, String msg) {
4
5 }
6});
4、手语资源
4.1、资源复制
将下载后的chirologyData.zip手动推送到设备的根目录下(/sdcard)后调用复制资源接口即可
1void copySignLanguageRes(Context context, CopyResourcesCallback copyResourcesCallback);
参数 | 含义 | 备注 |
---|---|---|
context | 上下文 | |
copyResourcesCallback | 复制回调 |
CopyResourcesCallback 参数
参数 | 含义 | 备注 |
---|---|---|
onCopySuccess() | 复制成功 | |
onCopyFailed(int code, int subCode, String error) | 复制失败 | 失败原因参考 |
调用示例
1ChirologyAvatar.getInstance().copySignLanguageRes(getApplicationContext(), new IChirologyAvatar.CopyResourcesCallback() {
2 @Override
3 public void onCopySuccess() {
4
5 }
6
7 @Override
8 public void onCopyFailed(int code, int subCode, String msg) {
9
10 }
11 });
4.2、资源下载以及复制
1void downloadCopySignLanguageRes(Context context, String url, CopyResourcesCallback copyResourcesCallback)
参数 | 含义 | 备注 |
---|---|---|
context | 上下文 | |
url | 资源地址 | |
copyResourcesCallback | 复制回调 |
CopyResourcesCallback 参数
参数 | 含义 | 备注 |
---|---|---|
onCopySuccess() | 复制成功 | |
onCopyFailed(int code, int subCode, String error) | 复制失败 | 失败原因参考 |
调用示例
1String url = "资源地址";
2 ChirologyAvatar.getInstance().downloadCopySignLanguageRes(
3 getApplicationContext(), url, new IChirologyAvatar.CopyResourcesCallback() {
4 @Override
5 public void onCopySuccess() {
6
7 }
8
9 @Override
10 public void onCopyFailed(int code, int subCode, String msg) {
11
12 }
13 });
5、初始化数字人
1void initAvatar(Context context, ArEngineParams arEngineParams, InitCallBack initCallBack);
参数 | 含义 | 备注 |
---|---|---|
context | 上下文 | |
arEngineParams | 配置参数 | |
initCallBack | 初始化回调 |
ArEngineParams 参数
参数 | 含义 | 备注 |
---|---|---|
appId | 项目的appId | |
appKey | 项目的appKey | |
token | token | |
expiredTime | token的有效期 | |
url | 手语翻译地址 | |
avatarName | 人像名称 |
InitCallBack 参数
参数 | 含义 | 备注 |
---|---|---|
initSuccess() | 初始化成功 | |
initFailed(int code, int subCode, String msg) | 初始化失败 | 失败原因参考 |
调用示例
1chirologyAvatar.initAvatar(getApplicationContext(), arEngineParams, new IChirologyAvatar.InitCallBack() {
2
3 @Override
4 public void initSuccess() {
5
6 }
7
8 @Override
9 public void initFailed(int code, int subCode, String msg) {
10
11 }
12 });
5.1、显示数字人
配置在textureView
1void setupController(int requestedOrientation, SurfaceTexture surface, int width, int height)
参数 | 含义 | 备注 |
---|---|---|
requestedOrientation | 方位角 | |
surface | 显示的surface | |
width | view 宽 | |
height | view 高 |
调用示例
1public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
2 if (chirologyAvatar != null) {
3 chirologyAvatar.setupController(getRequestedOrientation(), surfaceTexture, width, height);
4 }
5 }
5.2、计算比例
1void adjustRenderAspectRatio(float ratio)
参数 | 含义 | 备注 |
---|---|---|
ratio | 比例值 |
调用示例
1// 计算宽高比
2 float ratio = numerator / denominator;
3// 调整渲染的宽高比
4if (chirologyAvatar != null) {
5 chirologyAvatar.adjustRenderAspectRatio(ratio);
6}
5.3、更新size
1void updateOutSize(int width, int height)
参数 | 含义 | 备注 |
---|---|---|
width | 更新的宽 | |
height | 更新的高 |
调用示例
1public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height) {
2 if (chirologyAvatar != null) {
3 chirologyAvatar.updateOutSize(width, height);
4 }
5 }
6、进入页面
该接口与生命周期强绑定
1void resume()
调用示例
1protected void onResume() {
2 super.onResume();
3 if (chirologyAvatar != null) {
4 chirologyAvatar.resume();
5 }
6 }
7、退到后台
该接口与生命周期强绑定
1void pause();
调用示例
1protected void onPause() {
2 super.onPause();
3 if (chirologyAvatar != null) {
4 chirologyAvatar.pause();
5 }
6 }
8、DRML 驱动数字人
1void sendDrmlRender(String drml, float speed, AnimRenderCallBack animRenderCallBack);
参数 | 含义 | 备注 |
---|---|---|
drml | drml 内容 | |
speed | 播放倍速 | 默认1.2倍 |
animRenderCallBack | 播放回调 |
AnimRenderCallBack 参数
参数 | 含义 | 备注 |
---|---|---|
onRenderStart() | 开始播报 | |
onRenderInterrupt() | 播报打断 | |
onRenderFinish() | 结束播报 | |
onRenderError(int code, int subCode, String msg) | 播报错误 | 错误参考 |
调用示例
1chirologyAvatar.sendDrmlRender(editTxt.getText().toString().trim(), sped,
2 AvatarActivity.this);
9、文本驱动数字人
1void sendTextRender(String text, float speed, AnimRenderCallBack animRenderCallBack);
参数 | 含义 | 备注 |
---|---|---|
text | 文本内容 | |
speed | 播放倍速 | 默认1.2倍 |
animRenderCallBack | 播放回调 |
AnimRenderCallBack 参数
参数 | 含义 | 备注 |
---|---|---|
onRenderStart() | 开始播报 | |
onRenderInterrupt() | 播报打断 | |
onRenderFinish() | 结束播报 | |
onRenderError(int code, int subCode, String msg) | 播报错误 | 错误参考 |
调用示例
1chirologyAvatar.sendTextRender(editTxt.getText().toString().trim(), sped,
2 AvatarActivity.this);
10、打断
1void interrupt();
调用示例
1chirologyAvatar.interrupt();
11、释放
1void release();
调用示例
1chirologyAvatar.release();
12、其他
12.1、授权相关错误说明
code | subCode | 含义 |
---|---|---|
通用 | 0 | 成功 |
-1006 | 授权失败 | |
-1007 | 引擎状态异常 | |
查看授权状态 | -1001 | 获取状态失败,SDK状态异常 |
-1002 | 获取状态失败,服务端返回为空 | |
-1003 | 获取状态失败,服务端状态不成功 | |
-1004 | 获取状态失败,没有返回license | |
-1005 | 获取状态失败,一般是网络异常 | |
激活/续期 | -1008 | 续期失败,发生异常 |
-1009 | 续期失败,SDK状态异常 | |
-1010 | 续期失败,后台返回为空 | |
-1011 | 续期失败,后台状态不成功 | |
设备换绑 | -1012 | 设备切换失败,SDK状态异常 |
-1013 | 设备切换失败,服务端返回为空 | |
-1014 | 设备切换失败,服务端状态不成功 | |
-1015 | 设备切换失败,一般是网络异常 | |
项目授权 | -1016 | 获取项目授权信息失败,授权信息解析为空 |
-1017 | 获取项目授权信息失败,服务端状态不成功 | |
-1018 | 获取项目授权信息失败,没有返回license | |
-1023 | ProjectAK为空 | |
-1024 | ProjectSK为空 | |
-1025 | ProjectAK长度错误 | |
-1026 | ProjectSK长度错误 | |
设备授权 | -1019 | AppKey为空 |
-1020 | SecretKey为空 | |
-1021 | AppKey长度错误 | |
-1022 | SecretKey长度错误 |
12.2、SDK 能力相关错误说明
code | subCode | 含义 |
---|---|---|
1000 | 1000 | 上下文为空 |
1001 | 复制中 | |
1002 | 资源不存在 | |
1003 | 复制文件异常 | |
1004 | 解压文件异常 | |
1001 | 2000 | license 校验失败 |
2001 | 参数异常 | |
2002 | 初始化引擎错误 | |
1002 | 3000 | 重复加载 |
3001 | 动作文件路径为空 | |
3002 | 读取动作数据异常 | |
3003 | 引擎加载异常 | |
1003 | 4000 | 动作数据为加载异常 |
4001 | JSON 数据处理异常 | |
4002 | drml 内容为空 | |
4003 | drml 参数异常 | |
4004 | 解析drml 异常 | |
1004 | 4000 | 动作数据为加载异常 |
4001 | JSON 数据处理异常 | |
4004 | 解析drml 异常 | |
4005 | txt 内容为空 | |
4006 | txt 参数异常 | |
4007 | txt 翻译异常 | |
4008 | txt 解密异常 |