手语数字人交互SDK-Android版
简介
本文档说明Android端手语数字人SDK使用以及调用方式
一、集成
1、 准备工作
鉴权&申请
license需要额外申请, 提供给百度运营人员如下信息,用于生成license文件
- 包名
- 签名文件的md5值
license文件获取后,必须放在assets目录下,
注意license的有效期,在license失效前,必须强制更新带有新license的app
1.1、包名和签名md5获取
包名: 每个 Android 应用均有一个唯一的应用 ID。安卓以 Java 包的形式管理应用。
defaultConfig {
applicationId "com.baidu.ar.avatar.sample"
}
具体说明见官方文档: https://developer.android.com/build/configure-app-module?hl=zh-cn
签名md5
生成签名文件: https://developer.android.com/studio/publish/app-signing.html
方法1:
命令行输入 keytool –list –v –keystore <签名文件路径>
2、SDK 集成
引入SDK aar包: module_core-release.aar
2.1、app目录新建libs目录,放入aar包,在build.gradle中增加配置如下
implementation 'com.google.code.gson:gson:2.10.1'
implementation files('libs/module_core-release.aar')
2.2、创建assets 目录将申请的.license 文件放到工程中
2.3、Android studio 配置
2.3.1、设置-> Build, Execution, Deployment-> Build Tools -> Gradle -> Gradle JDK, 设置java 11
2.4、系统权限配置以及申请
2.4.1、权限配置
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
2.4.2、权限申请
参考demo BaseActivity示例,所列举的权限为最低权限要求,如果缺少某一个,会导致sdk出现异常。
二、SDK 调用以及API 说明
1、复制资源
将下载后的chirologyData.zip手动推送到设备的根目录下(/sdcard)后调用复制资源接口即可
void copySignLanguageRes(Context context, CopyResourcesCallback copyResourcesCallback);
参数 | 含义 | 备注 |
---|---|---|
context | 上下文 | |
copyResourcesCallback | 复制回调 |
CopyResourcesCallback 参数
参数 | 含义 | 备注 |
---|---|---|
onCopySuccess() | 复制成功 | |
onCopyFailed(int code, int subCode, String error) | 复制失败 | 失败原因参考 |
调用示例
ChirologyAvatar.getInstance().copySignLanguageRes(getApplicationContext(), new IChirologyAvatar.CopyResourcesCallback() {
@Override
public void onCopySuccess() {
}
@Override
public void onCopyFailed(int code, int subCode, String msg) {
}
});
2、SDK 授权
授权文件申请
1、提供 包名和签名文件MD5 信息
2、将生成后的文件放到工程assets 目录下
void initLicense(Context context, String licenseKey, InitLicenseCallBack initLicenseCallBack);
参数 | 含义 | 备注 |
---|---|---|
context | 上下文 | |
licenseKey | 授权key | |
initLicenseCallBack | 授权回调 |
InitLicenseCallBack 参数
参数 | 含义 | 备注 |
---|---|---|
onSuccess() | 授权成功 | |
void onFail(int code, int subCode, String msg) | 授权失败 | 失败原因参考 |
调用示例
ChirologyAvatar.getInstance().initLicense(MainActivity.this, "xuniren-avatar-debug-0007", new IChirologyAvatar.InitLicenseCallBack() {
@Override
public void onSuccess() {
}
@Override
public void onFail(int code, int subCode, String msg) {
}
});
3、加载手语动作资源
void loadingAnimData(Context context, LoadingAnimDataCallBack loadingAnimDataCallBack);
参数 | 含义 | 备注 |
---|---|---|
context | 上下文 | |
loadingAnimDataCallBack | 加载回调 |
LoadingAnimDataCallBack 参数
参数 | 含义 | 备注 |
---|---|---|
onSuccess() | 加载成功 | |
onFailed(int code, int subCode, String error) | 加载失败 | 失败原因参考 |
调用示例
if (chirologyAvatar != null) {
chirologyAvatar.loadingAnimData(getApplicationContext(),
new IChirologyAvatar.LoadingAnimDataCallBack() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(int code, int subCode, String error) {
}
});
}
4、初始化数字人
void 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) | 初始化失败 | 失败原因参考 |
调用示例
chirologyAvatar.initAvatar(getApplicationContext(), arEngineParams, new IChirologyAvatar.InitCallBack() {
@Override
public void initSuccess() {
}
@Override
public void initFailed(int code, int subCode, String msg) {
}
});
4.1、显示数字人
配置在textureView
void setupController(int requestedOrientation, SurfaceTexture surface, int width, int height)
参数 | 含义 | 备注 |
---|---|---|
requestedOrientation | 方位角 | |
surface | 显示的surface | |
width | view 宽 | |
height | view 高 |
调用示例
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
if (chirologyAvatar != null) {
chirologyAvatar.setupController(getRequestedOrientation(), surfaceTexture, width, height);
}
}
4.2、计算比例
void adjustRenderAspectRatio(float ratio)
参数 | 含义 | 备注 |
---|---|---|
ratio | 比例值 |
调用示例
// 计算宽高比
float ratio = numerator / denominator;
// 调整渲染的宽高比
if (chirologyAvatar != null) {
chirologyAvatar.adjustRenderAspectRatio(ratio);
}
4.3、更新size
void updateOutSize(int width, int height)
参数 | 含义 | 备注 |
---|---|---|
width | 更新的宽 | |
height | 更新的高 |
调用示例
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height) {
if (chirologyAvatar != null) {
chirologyAvatar.updateOutSize(width, height);
}
}
5、进入页面
该接口与生命周期强绑定
void resume()
调用示例
protected void onResume() {
super.onResume();
if (chirologyAvatar != null) {
chirologyAvatar.resume();
}
}
6、退到后台
该接口与生命周期强绑定
void pause();
调用示例
protected void onPause() {
super.onPause();
if (chirologyAvatar != null) {
chirologyAvatar.pause();
}
}
7、DRML 驱动数字人
void sendDrmlRender(String drml, float speed, AnimRenderCallBack animRenderCallBack);
参数 | 含义 | 备注 |
---|---|---|
drml | drml 内容 | |
speed | 播放倍速 | 默认1.2倍 |
animRenderCallBack | 播放回调 |
AnimRenderCallBack 参数
参数 | 含义 | 备注 |
---|---|---|
onRenderStart() | 开始播报 | |
onRenderInterrupt() | 播报打断 | |
onRenderFinish() | 结束播报 | |
onRenderError(int code, int subCode, String msg) | 播报错误 | 错误参考 |
调用示例
chirologyAvatar.sendDrmlRender(editTxt.getText().toString().trim(), sped,
AvatarActivity.this);
8、文本驱动数字人
void sendTextRender(String text, float speed, AnimRenderCallBack animRenderCallBack);
参数 | 含义 | 备注 |
---|---|---|
text | 文本内容 | |
speed | 播放倍速 | 默认1.2倍 |
animRenderCallBack | 播放回调 |
AnimRenderCallBack 参数
参数 | 含义 | 备注 |
---|---|---|
onRenderStart() | 开始播报 | |
onRenderInterrupt() | 播报打断 | |
onRenderFinish() | 结束播报 | |
onRenderError(int code, int subCode, String msg) | 播报错误 | 错误参考 |
调用示例
chirologyAvatar.sendTextRender(editTxt.getText().toString().trim(), sped,
AvatarActivity.this);
9、打断
void interrupt();
调用示例
chirologyAvatar.interrupt();
10、释放
void release();
调用示例
chirologyAvatar.release();
11、其他
11.1、错误信息说明
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 解密异常 |