云上数字人SDK接入手册-Android
更新时间:2024-03-25
版本说明
支持Android7+
DigitalHumanCloudLib版本2.0.14
DigitalHumanLib版本1.2.23
libbaidurtc2.2.5
sdk+demo 2.1.10.30下载
SDK接入
添加libs文件夹下的所有aar
配置build.gradle, 编译参数
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
// Android基础库
...
// 加载3个aar文件,如 implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"])
// okhttp
implementation 'com.squareup.okhttp3:okhttp:3.14.9'
// gson
implementation 'com.google.code.gson:gson:2.10.1'
}
配置AndroidManifest.xml, 权限
<!-- Camera权限可选,需要打开摄像头时使用 --->
<!-- <uses-permission android:name="android.permission.CAMERA" /> -->
<!-- 录音 -------- -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 联网 -------- -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 部分手机需要加READ_PHONE_STATE这个权限 -->
<!-- <uses-permission android:name="android.permission.READ_PHONE_STATE"/> -->
混淆规则
-keepattributes Exceptions,Signature
# digitalHumanCLoudLib.arr 及 digitalhumanlib.arr
-keep,allowoptimization class com.baidu.digitalhuman.** { *;}
-keepnames public class com.baidu.digitalhuman.**
# libbaidurtc.aar
-keep class com.baidu.rtc.** { *;}
-keep class com.baidu.cloud.** { *;}
-keep class com.webrtc.** { *;}
-dontwarn com.baidu.rtc.**
-dontwarn com.webrtc.**
-keep class javax.annotation.** {*;}
使用SDK
类的引用说明
import com.baidu.digitalhuman.cloud.lib.DigitalHumanCloudHandler;
import com.baidu.digitalhuman.cloud.lib.DigitalHumanCloudView;
import com.baidu.digitalhuman.cloud.lib.config.DigitalHumanCloudSettings;
初始化数字人
示例
DigitalHumanCloudView digitalHumanCloudView = findViewById(R.id.digital_human_cloud_view);
DigitalHumanCloudSettings settings = DigitalHumanCloudSettings.builder()
.appId("i-xxxxxxxxxxxx")
.appKey("23hxxxxxxxxxxxxxxx")
// .roomName("DEMO-DEVICE_ID-USERID")
// 设备唯一id 及 userId, 用于后台显示对话, 如果多个设备用同一个roomName,后台会看见会话合并
// 不设置时,SDK取uuid存放在SharePreference中
.debug(false) // 正常情况不需要开启debug
.resolutionWidth(1080) // 渲染画面的分辨率 - 建议和服务端配置一致
.resolutionHeight(1920) // 渲染画面的分辨率 - 建议和服务端配置一致
.localVideoPreview(false) // 是否要开启摄像头,需要同时打开usingVideo
.showControlBar(isPressButton) // 和pressPickAudioEnabled一起开启拾音录音
.pressPickAudioEnabled(isPressButton) // 和showControlBar一起开启拾音录音,推荐开启,否则一直拾音
.showQueryTitle(true) // 展示语音识别
.showReplyTitle(true) // 展示回复文字
.showTextAssist(true) // 是否展示文本框调试
.usingAudio(true) // 是否传输声音,用于语音识别
.usingVideo(false) // 是否传输视频,用于真人接管对话
// 非私有化部署不要替换
.webSocketUrl("wss://xxxxxxxxxxxx")
// 非私有化部署不要替换
.widgetUrl("https://xxxxxxxxxxxx")
.build();
digitalHumanCloudView.init(settings, null, new DigitalHumanCloudHandler() {
private Handler mainHandler = new Handler(Looper.getMainLooper());
/**
* SDK遇见不可恢复的异常
* @param e
*/
@Override
public void onError(DhWsException e) {
String errMsg = "[" + e.getCode() + "]" + e.getMessage();
Log.e(TAG, "onError SHOW IN demo:" + errMsg, e);
if (e.getCode() >= 0) {
mainHandler.post(() -> {
Toast.makeText(MainActivity.this, errMsg, Toast.LENGTH_LONG).show();
// 主线程中运行
MainActivity.this.digitalHumanCloudView.destroy();
MainActivity.this.digitalHumanCloudView = null;
mainHandler.postDelayed(() -> {
MainActivity.this.finish();
}, 3000);
});
}
}
/**
* WebView 加载成功
*/
@Override
public void onInit() {
}
/**
* 30s 一次心跳包
*/
@Override
public void onHeartBeat() {
Log.d(TAG, "demo:heartbeat");
}
/**
* 服务端返回的消息
* @param message
*/
@Override
public void onMessage(String message) {
Log.d(TAG, "PRINT MESSAGE:" + message);
}
/**
*
* @param s
*/
@Override
public void onCommand(String s) {
}
/**
* 开启摄像头的yuv格式数据回调
* @param bytes
*/
@Override
public void onCameraRecord(byte[] bytes) {
}
/**
* webview点击链接回调
*
* @param linkUrl
*/
@Override
public void onLink(String linkUrl) {
}
/**
* webview点击退出
*/
@Override
public void onExit() {
finish();
}
/**
* 数字人是否在初始化中
* @param b true 数字人加载中,false 未连接上服务
*/
@Override
public void onLoading(boolean b) {
Log.i(TAG, "onDigitalHumanEventUpdate onLoading is " + b);
}
/**
* 服务端在排队的提问,几乎用不到
* @param s
*/
@Override
public void onQueuing(String s) {
}
/**
* 数字越大,网络状态越不好
* @param latency
*/
@Override
public void onNetworkStatus(long latency) {
Log.i(TAG, "Network latency is :" + latency);
}
/**
* 走到该回调说明rtc监测出网络问题,code码越大表明越不适合进行rtc拉流
* 2100 或 2101 表示网络抖动,可能会有轻微的卡顿;
* 2102 或 2103 表示网络较差,可能会有明显的卡顿;
* 大于等于2104 表示网络非常差,不建议拉流展示人像
* @param mediaStatus
*/
@Override
public void onMediaStatus(int mediaStatus) {
Log.i(TAG, "Media Status :" + mediaStatus);
}
});
相关api
云上数字人暴露方法
方法 | 备注 |
---|---|
static public String version() | 获取当前sdk版本号 |
public void init(DigitalHumanCloudSettings settings, @Nullable LinearLayout backgroundImage, DigitalHumanCloudHandler handler) | 云上数字人初始化方法,传入基础配置 |
public void destroy() | 登出云上数字人,并销毁 |
public void pause() | 暂停云上数字人 |
public void resume() | 恢复云上数字人 |
public void rtcPause() | 暂停数字人画面 |
public void rtcResume() | 启动数字人画面 |
public void textRender(String message) | 驱动数字人(message为drml) |
public void textRender(String requestId, String message) | 驱动数字人(message为drml) |
public void textQuery(String message) | 文本询问数字人 |
public void textQuery(String requestId, String message) | 文本询问数字人 |
public void textQuery(String message, Map params) | 文本询问数字人(携带参数) |
public void textQuery(String requestId, String message, Map params) | 文本询问数字人(携带参数) |
public void sendMessage(String json) | 发送消息给数字人服务 |
public void sendMessage(Action action, String body) | 发送消息给数字人服务 |
public void sendMessage(String requestId, Action action, String body) | 发送消息给数字人服务 |
public void sendCommand(String command, String content) | 发送指令给数字人展示 |
public void mute(boolean isMute) | isMute为true将不进行收音 |
public void subscribeStreaming(boolean isSubscribe) | isSubscribe为false将不再渲染画面 |
public void subscribeAudio(boolean isSubscribe) | isSubscribe为false数字人不再播报音频 |
public void switchLoudSpeaker(boolean speakLoud) | 切换听筒和扬声器 |
public void setAudioCollectionCallBack(AudioCollectionCallBack audioCallBack) | 获取采集到的原始音频并关闭默认的asr解析功能 |
public void initLocalPreview(FrameLayout view) | 设置本地预览容器(init后执行) |
public void faceRecognition() | 人脸识别,执行一次 |
public void cameraImageRecognition() | 手势识别 |
DigitalHumanCloudSettings云上数字人配置
参数名 | 类型 | 默认值 | 备注 |
---|---|---|---|
webSocketUrl | string | -- | websocket协议地址 |
appId | string | -- | 登录信息appId |
appKey | string | -- | 登录信息appKey |
token | string | -- | token信息token |
projectId | string | -- | 登录信息projectId |
showWidget | boolean | true | 是否展示widget |
widgetUrl | string | -- | widget地址 |
resolutionWidth | int | 720 | 数字人展示的宽度 |
resolutionHeight | int | 1280 | 数字人展示的高度 |
videoBitRate | int | 2000 | 数字人的码率, 单位kbps |
showControlBar | boolean | true | 是否展示控件 |
pressPickAudioEnabled | boolean | false | 按键拾音 |
showReplyTitle | boolean | true | 是否展示数字人回复话术 |
showQueryTitle | boolean | true | 是否展示asr结果 |
showTextAssist | boolean | true | 是否展示文本辅助输入框 |
usingAudio | boolean | true | 是否开启拾音功能 |
usingVideo | boolean | false | 是否开启摄像头 |
localVideoPreview | boolean | false | 是否开启本地摄像头预览 |
faceWake | boolean | false | 人脸唤醒 |
cameraWake | boolean | fasle | 手势唤醒 |
ttsSpeed | int | 5 | 数字人播报的语速语调 |
debug | boolean | false | 是否开启debug模式 |
extraInfo | string | -- | 额外信息 |
roomName | string | -- | 日志会话归类 |
rtcParams | RtcParams | -- | 固定rtc相关配置 |
enqueue | boolean | false | 是否排队 |
background | string | -- | 数字人背景图 |
clientMaxReconnectTimes | int | 5 | sdk网络不佳的时候的次数,超过次数后会回调onError,-1 表示不断重试 |
回调实现(DigitalHumanCloudHandler)
public interface DigitalHumanCloudHandler {
/**
* 云上数字人error
*/
void onError(DhWsException error);
/**
* 云上数字人初始化完成
*/
void onInit();
/**
* 30s触发一次
*/
@Deprecated
void onHeartBeat();
/**
* 接收云上数字人websocket消息
*/
void onMessage(String message);
/**
* 接收云上数字人指令
*/
void onCommand(String message);
/**
* 接收本地视频回调
*/
void onCameraRecord(byte[] image);
/**
* 业务跳出场景
*/
void onLink(String linkUrl);
/**
* 退出数字人指令
*/
void onExit();
/**
* loading状态
* @param loading 是否加载中
*/
void onLoading(boolean loading);
/**
* 排队中状态
* @param content 排队中数据
*/
void onQueuing(String content);
/**
* 网络状态,心跳,越大网络状态越不好,超过5000ms会触发重连
* @param latency
*/
void onNetworkStatus(long latency);
/**
* rtc网络状态回调,走到该回调说明rtc监测出网络问题,code码越大表明越不适合进行rtc拉流
* @param mediaStatus
*/
void onMediaStatus(int mediaStatus);
}
回调日志(DigitalHumanLogInterface)
public interface DigitalHumanLogInterface {
// 注意tr可能为null
void error(String tag, String message, Throwable tr);
void warn(String tag, String message);
void info(String tag, String message);
void debug(String tag, String message);
}
DigitalHumanLogInterface logCallback = new DigitalHumanLogInterface (){ ...}
Logger.setLogCallback(logCallback); // 默认输出INFO级别日志
回调状态判断
DigitalHumanCloudHandler的onDigitalHumanWsSuccess回调方法能够获取websocket的状态。当onDigitalHumanWsSuccess回调为false时说明ws没有连接成功不能正常收发消息,当onDigitalHumanWsSuccess回调为true时说明ws连接成功可以正常收发消息。 如果在发送消息之后,没有收到服务端对应的requestId回复且onDigitalHumanWsSuccess回调为false则认为发送消息失败;如果在发送消息之后,收到服务端对应requestId回复则认为发送消息成功。