具身驱动SDK(Android版本)接入说明
一.准备工作
1.概述
本文是魔珐星云具身驱动SDK Android版本的接入文档,用于指导SDK的使用方法,默认读者已经熟悉 IDE(Eclipse 或者 Android Studio)的基本使用方法,以及具有一定的 Android 编程知识基础。
快速体验demo
1.Android压缩包附带的apk文件中是虚拟人demo的安装包,可以直接安装到Android手机上。并快速体验在您的手机上的表现。
获取方式:
GitHub:https://github.com/publicize0828/XmovLiteAvatarAndroidDemo
Gitee:https://gitee.com/xmovmaster/XmovLiteAvatarAndroidDemo
2.Android压缩包附带的demo文件夹中是虚拟人的示例工程,使用Android studio打开示例工程,完成以下步骤配置,然后直接运行起来测试:
a.替换demo_configs.json中的appid和appSecret
b.demo_configs.json中的config按需配置
c.MockAudioInputsData.json是支持自行输入音频数据的示例格式
开发环境搭建
1.将开发包拷贝到工程
将SDK中libs目录下的aar包拷贝到自己工程的libs目录下,如没有该目录需新建。
在app文件夹下的build.gradle的dependencies中配置对应版本的aar依赖详细代码如下:
implementation files('libs/xmovdigitalhuman-xxx.aar')
2.添加外部第三方依赖 详细代码如下:
implementation "javax.vecmath:vecmath:1.5.2"
implementation "com.google.code.gson:gson:2.13.1"
implementation "com.squareup.okhttp3:okhttp:5.1.0"
implementation "org.msgpack:msgpack-core:0.9.3"
implementation "io.socket:socket.io-client:2.1.0"
3.配置AndroidManifest.xml文件
在manifest标签内添加必要的权限支持
<uses-permission android:name="android.permission.INTERNET"/>
4.混淆规则
-keep public class com.xmov.metahuman.sdk.data.{;}
-keep public class com.xmov.metahuman.sdk.impl.data.{;}
-keep public class com.xmov.metahuman.sdk.impl.transport.http.{;}
-keep public interface com.xmov.metahuman.sdk.IXmovAvatar {;}
-keep class com.xmov.metahuman.sdk.IXmovAvatar$Companion { ;}
-keep public interface com.xmov.metahuman.sdk.IAvatarListener {
public protected ;
}
-keep public interface com.xmov.metahuman.sdk.PreCacheListener {
public protected *;
}
通过上面的几个步骤,工程就配置完成了,接下来就可以在工程中使用虚拟人SDK进行开发了。
二.SDK使用说明
1.初始化
使用SDK功能前,必须先进行初始化操作。
方法原型
fun init(
context: Context,
layout: ViewGroup,
initConfig: InitConfig,
listener: IAvatarListener?
)
参数描述
参数 | 类型 | 说明 |
|---|---|---|
context | Context | 一般传Activity对象 |
layout | ViewGroup | 加载虚拟人所在的父布局 |
initConfig | InitConfig | 初始化配置类 |
listener | IAvatarListener | 回调监听 |
InitConfig 类介绍
参数 | 类型 | 说明 |
|---|---|---|
appId | String | 星云具身中应用对应的appId |
appSecret | String | 星云具身中应用对应的appSecret |
gatewayServer | String | 进入房间的地址:"https://nebula-agent.xingyun3d.com/user/v1/ttsa/session" |
config | String | json string 设置一些配置项 |
初始化示例代码:
IXmovAvatar.get().init(this, mBinding.avatarLayout, initConfig.appId, initConfig.appSecret,initConfig.gatewayServer,object : IAvatarListener {
override fun onInitEvent(code: Int, message: String?) {
LogUtil.d("onInitEvent code:$code,message:$message")
}
override fun onWidgetEvent(widgetData: IRawEventFrameData?) {
LogUtil.d("onWidgetEvent widgetData:$widgetData")
}
override fun onNetworkInfo(sdkNetworkInfo: SDKNetworkInfo?) {
LogUtil.d("onNetworkInfo $sdkNetworkInfo")
}
override fun onMessage(sdkMessage: SDKMessage?) {
LogUtil.d("onMessage $sdkMessage")
}
override fun onStateChange(state: String?) {
LogUtil.d("onStateChange $state")
}
override fun onStatusChange(status: SDKStatus?) {
LogUtil.d("onStatusChange $status")
}
override fun onStateRenderChange(state: String?, duration: Long) {
LogUtil.d("onStateRenderChange state:$state,duration:$duration")
}
override fun onVoiceStateChange(status: String?) {
LogUtil.d("onVoiceStateChange state:$status")
runOnUiThread {
if ("voice_end" == status) {
} else if ("voice_start" == status) {
}
}
}
override fun onDebugInfo(debugInfo: JSONObject) {
// LogUtil.d("onDebugInfo debugInfo:$debugInfo")
}
override fun onReconnectEvent(code: Int, message: String?) {
toast("重连:code=$code message=$message")
}
override fun onOfflineEvent() {
toast("进入离线状态")
}
})
1.初始化回调
onInitEvent(code: Int, message: String?)
方法返回参数分为外层code和result,含义如下:
字段 | 类型 | 含义 |
|---|---|---|
code | Int | Code 0:成功;其他:失败 |
message | String | 返回信息 |
2.事件回调(字幕回调)
onWidgetEvent(widgetData: IRawEventFrameData?)
IRawEventFrameData实体类
字段 | 类型 | 含义 |
startFrame | Int | 开始帧 |
event | JSONArray | type: "subtitle_on" 字幕类型,text 字幕文案 |
3.声音播报回调
onVoiceStateChange(status: String?)
字段 | 类型 | 含义 |
status | String | "voice_start" 播报开始"voice_end" 播报结束 |
4.重连在线模式回调
onReconnectEvent(code: Int, message: String?)
字段 | 类型 | 含义 |
code | Int | code为0:成功;其他:失败 |
message | String | 返回信息 |
2.config配置
在进行初始化时,initConfig中的config是一个json 字符串,可以定制化做一些配置
字段名 | 数据类型 | 说明 | 示例值 |
input_audio | boolean | 是否开启自己的音频输入true为开启,false为关闭(sdk内部的音频输入) | FALSE |
output_audio | boolean | 是否开启SDK内音频输出true为使用sdk内部音频输出false不适用sdk内部音频输出 | TRUE |
resolution | JSONObject | 分辨率配置对象,用于定义画面的宽高参数(跟随角色分辨率保持一致) | {"height": 1920, "width": 1080} |
resolution.height | number | 画面高度,单位为像素(px) | 1920 |
resolution.width | number | 画面宽度,单位为像素(px) | 1080 |
init_events | JSONArray | 初始化事件列表,用于在启动时执行一系列预设操作(如画布锚点设置)。 | 见下方事件对象示例 |
init_events[0].type | string | 初始化事件的类型。SetCharacterCanvasAnchor表示 “设置角色画布锚点”。 | SetCharacterCanvasAnchor |
init_events[0].x_location | number | 锚点的 X 轴位置偏移量(默认水平居中) | 0 |
init_events[0].y_location | number | 锚点的 Y 轴位置偏移量(单位px) | 0 |
init_events[0].width | number | 锚点区域的宽度缩放比例 | 1 |
init_events[0].height | number | 锚点区域的高度缩放比例 | 1 |
配置示例
{
"input_audio": false,
"output_audio": true,
"resolution": {
"width": 1080,
"height": 1920
},
"init_events": [
{
"type": "SetCharacterCanvasAnchor",
"x_location": 0,
"y_location": 0,
"width": 1,
"height": 1
}
]
}
3.Speak
方法原型
fun speak(ssml: String?, isStart: Boolean, isEnd: Boolean)
参数说明
参数 | 参数类型 | 说明 |
ssml(必填) | String | 传入说话内容的文本信息 |
isStart(必填) | boolean | 是否开始节点 |
isEnd(必填) | boolean | 是否输入结束 |
支持全文本和流式文本输入
(1)全文本输入时代码示例:
IXmovAvatar.get().speak("welcomeMessage", true, true)
(2) 流式文本输入时代码示例
//开头
IXmovAvatar.get().speak("msg 1", true, false)
IXmovAvatar.get().speak("msg 2", false, false)
...
//结尾
IXmovAvatar.get().speak("msg 2", false, true)
4.断线重连
本sdk支持,当网络波动或者无网情况下,自动进入离线状态,当有网络时会自动重连。
也支持客户手动切换到离线状态,然后再重连(注意 重连只能是离线状态下进行重连,其他状态进行重连会报错)
方法原型
fun switchModel(isOffline: Boolean)
参数说明
参数 | 参数类型 | 说明 |
isOffline(必填) | Boolean | true:切换到离线模式false:进行重连到在线模式 |
示例代码
IXmovAvatar.get().switchModel(true)
5.销毁
销毁sdk实例,断开连接 进行资源释放。虚拟人退出时调用
方法原型
fun destroy()
示例代码
IXmovAvatar.get().destroy()
三.虚拟人状态
虚拟人常用的一下动作状态切换
1.倾听
代码示例
IXmovAvatar.get().listen()
2.思考
代码示例
IXmovAvatar.get().think()
3.打断
代码示例
IXmovAvatar.get().interrupt()
四.返回码
该返回码为虚拟人SDK自身的返回码,具体错误在碰到之后查阅
返回码 | 返回码描述 |
0 | 成功 |
1000 | 没有房间 |
1001 | SDK初始化失败,因为已经初始化,未反初始化 |
2000 | 在未成功初始化时执行其他状态操作 |
3000 | sdk 未在离线状态下进行重连 |