You need to enable JavaScript to run this app.
文档中心
图像生成大模型

图像生成大模型

复制全文
下载 pdf
实时互动数字人SDK
实时互动数字人 Android SDK-接口文档
复制全文
下载 pdf
实时互动数字人 Android SDK-接口文档
0.前置准备​
​​
1. 集成指南​
1.1 环境要求​
使用 数字人 Android SDK 之前,请先确认你的应用满足以下要求:​
​
项目项​
要求​
必须项​
说明​
最低 Android 版本​
Android 6.0(API 23)​
是​
SDK 当前最低兼容版本为 API 23​
推荐编译环境​
compileSdk 36​
否​
建议宿主应用使用较新的 Android 编译环境,以确保依赖与权限行为一致​
推荐 Java 版本​
Java 17​
否​
​
如果你的工程使用 Java / Kotlin 编译选项,请尽量保持与 SDK 一致​
支持 CPU 架构​
armeabi-v7a、arm64-v8a​
是​
面向移动终端真机使用场景​
​
​​
1.2 组件依赖​
1.2.1 添加 Maven 仓库​
  • 首先在 Android Studio 左上角将工程视图切换为 Project 模式,在项目根目录的 settings.gradle 文件配置 Maven 仓库地址​
​
dependencyResolutionManagement {​
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)​
repositories {​
...​
maven { url 'https://artifact.bytedance.com/repository/Volcengine/' }​
}​
}​
​
  • 如果你的 Android Gradle Plugin 版本低于 v7.1.0,则应在项目根目录的 build.gradle 文件配置 Maven 仓库地址​
​
allprojects {​
repositories {​
...​
maven { url 'https://artifact.bytedance.com/repository/Volcengine/' }​
}​
}​
​
两种接入方式:​
1.2.2 远程接入(推荐,自动处理依赖)​
  • 在你 app 模块下的 build.gradle 增加 implementation,version 替换成最新版本:​
​
dependencies {​
implementation 'com.bytedance.avatar.tob:live-cn:${version}.cn'​
}​
​
1.2.3 本地接入(需要手动引入额外依赖)​
  1. 将 SDK AAR 文件放入宿主工程的 libs 目录,例如:​
​
app/​
libs/​
BDAvatarSDK.aar​
​
在应用模块中添加本地 AAR 仓库目录,并引入 AAR 文件。​
​
dependencies {​
implementation files('libs/BDAvatarSDK.aar')​
}​
​
如果你的 AAR 文件名不同,请把 BDAvatarSDK 替换为实际文件名。​
  1. 添加 OkHttp 依赖(替换成你的版本):​
​
dependencies {​
implementation 'com.squareup.okhttp3:okhttp:4.12.0'​
}​
​
  1. 添加 RTC 依赖:​
​
dependencies {​
implementation 'com.volcengine:VolcEngineRTC:3.60.104.300'​
}​
​
  1. 在项目根目录的 gradle.properties 文件中添加 android.enableJetifier=true,解决兼容性问题​
如有集成问题详细参见:Android 集成常见问题​
1.3 权限声明​
SDK 涉及网络通信与语音采集,因此宿主应用至少需要声明以下权限:​
​
<uses-permission android:name="android.permission.INTERNET" />​
<uses-permission android:name="android.permission.RECORD_AUDIO" />​
​
Android 12 及以上补充权限​
如果你的应用在 Android 12(API 31)及以上需要配合蓝牙耳机、蓝牙音频设备进行语音交互,需要同时声明:​
​
<uses-permission​
android:name="android.permission.BLUETOOTH_CONNECT"​
android:usesPermissionFlags="neverForLocation" />​
​
运行时权限​
RECORD_AUDIO 属于重要权限。即使已经在 AndroidManifest.xml 中声明,仍然需要在运行时向用户申请授权​
示例:​
​
private fun requestAudioPermission() {​
val permissions = mutableListOf(Manifest.permission.RECORD_AUDIO)​
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {​
permissions += Manifest.permission.BLUETOOTH_CONNECT​
}​
​
val denied = permissions.filter {​
ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED​
}​
​
if (denied.isEmpty()) {​
startAvatarAudioCapture()​
} else {​
ActivityCompat.requestPermissions(this, denied.toTypedArray(), 1001)​
}​
}​
​
1.4 混淆说明​
如果你以标准方式接入 AAR,SDK 自带的 consumer proguard 规则会自动参与合并,通常你不需要额外配置。如遇问题,可手动添加以下规则:​
​
-keepattributes Signature,InnerClasses,EnclosingMethod​
​
-keep class com.bytedance.avatar.sdk.BDAvatar { public *; }​
-keep class com.bytedance.avatar.sdk.BDAvatarConfig { public *; }​
-keep class com.bytedance.avatar.sdk.BDAvatarConfig$Builder { public *; }​
-keep class com.bytedance.avatar.sdk.BDAvatarSession { public *; }​
-keep class com.bytedance.avatar.sdk.BDAvatarSessionConfig { public *; }​
-keep class com.bytedance.avatar.sdk.BDAvatarSessionConfig$Builder { public *; }​
-keep class com.bytedance.avatar.sdk.BDAvatarException { public *; }​
​
-keep class com.bytedance.avatar.sdk.BDAvatarEnv { public *; }​
-keep class com.bytedance.avatar.sdk.BDAvatarLog { public *; }​
-keep class com.bytedance.avatar.sdk.BDAvatarError { public *; }​
-keep class com.bytedance.avatar.sdk.BDAvatarLogLevel { public *; }​
-keep class com.bytedance.avatar.sdk.BDAvatarRenderMode { public *; }​
-keep class com.bytedance.avatar.sdk.BDAvatarSessionState { public *; }​
​
-keep interface com.bytedance.avatar.sdk.BDAvatarSessionDelegate { *; }​
-keep interface com.bytedance.avatar.sdk.BDAvatarLogDelegate { *; }​
​
-keep class * implements com.bytedance.avatar.sdk.BDAvatarSessionDelegate {​
*;​
}​
​
-keep class * implements com.bytedance.avatar.sdk.BDAvatarLogDelegate {​
*;​
}​
​
如果你的应用开启了 R8 / Proguard,但回调收不到、枚举行为异常或初始化后接口表现不稳定,优先检查是否误删了以上 keep 规则。​
​​
2. 调用流程​
本节以一个典型的实时数字人会话场景为例,演示如何完成从初始化到释放资源的完整接入流程。​
2.1 创建 SDK 配置并初始化​
SDK 全局入口类为 BDAvatar。你需要先构建 BDAvatarConfig,再调用 BDAvatar.init(...) 完成初始化。​
BDAvatar ​
​
接口​
参数​
说明​
setAccessKey​
accessKey: String?​
设置访问凭证 Access Key,按鉴权方案提供​
setSecretKey​
secretKey: String?​
设置访问凭证 Secret Key,按鉴权方案提供​
setStsToken​
stsToken: String?​
对于采用临时accessKey/secretKey/stsToken的场景,stsToken不能为空​
setWssToken​
since v1.0.1​
wssToken: String?​
设置 WebSocket 鉴权 Token。鉴权优先级:accessKey/secretKey 均非空时本地计算签名,否则使用 wssToken​
setEnvironment​
environment: BDAvatarEnv​
环境类型(CN:国内环境),默认CN​
setLogDelegate​
logDelegate: BDAvatarLogDelegate?​
日志代理,可接入你自己的日志系统​
setEnableInternalLogs​
enable: Boolean​
是否开启内部日志记录,默认关闭​
putExtra​
key: String​
value: String​
额外参数(选填)​
updateTempAkSk​
since v1.0.1​
​
accessKey: String?​
secretKey: String?​
stsToken: String?​
BDAvatar 实例方法。运行时原子刷新临时 accessKey/secretKey/stsToken 三元组,下一次建连时生效​
updateWssToken​
since v1.0.1​
wssToken: String?​
​
BDAvatar 实例方法。运行时刷新 wssToken,下一次建连时生效​
​
认证方式​
SDK 支持三种认证方式:​
​
认证方式​
使用场景​
需要配置​
时效性​
刷新接口​
WSS Token​
​
无需 AK/SK 的场景(推荐)​
wssToken​
短期有效​
updateWssToken​
永久 AK/SK​
长期有效的 AppKey/SecretKey​
appKey + secretKey​
长期有效​
无需刷新​
临时 AK/SK + STS​
使用临时凭证的场景​
​
appKey + secretKey + stsToken​
短期有效​
updateTempAKSK(​
accessKey,​
secretKey,​
stsToken)​
​
推荐使用 WSS Token 认证方式,无需暴露 AK/SK,安全性更高。​
认证方式示例​
方式一:WSS Token 认证(推荐,短期有效)​
不需要 AK/SK,直接使用 WSS Token 进行认证。安全性更高,无需暴露密钥。WSS Token 有过期时间,需要在过期前刷新。WSS Token由后端生成,通过接口下发到客户端。文末我们提供了一个WSS Token生成的示例代码:wss_token_volc.zip,供参考。​
​
val config = BDAvatarConfig.Builder()​
.setWssToken("$your_wss_token")​
.setEnvironment(BDAvatarEnv.GLOBAL)​
.build()​
​
BDAvatar.init(application, config)​
​
// Refresh before wssToken expires​
BDAvatar.updateWssToken("$new_wss_token")​
​
方式二:永久 AK/SK 认证(长期有效)​
使用长期有效的 AppKey/SecretKey,无需刷新。​
长期有效的 AppKey/SecretKey 获取方式请参考 获取AccessKey、SecretKey。​
​
val config = BDAvatarConfig.Builder()​
.setAccessKey("$your_access_key")​
.setSecretKey("$your_secret_key")​
.setEnvironment(BDAvatarEnv.GLOBAL)​
.build()​
​
BDAvatar.init(application, config)​
​
方式三:临时 AK/SK + STS Token 认证(短期有效)​
使用临时凭证的场景,必须配置 stsToken。三者具有相同的过期时间,需要一起刷新。​
临时AK/SK/STS Token 获取方式请参考 获取临时密钥(STS)。​
​
val config = BDAvatarConfig.Builder()​
.setAccessKey("$temp_access_key")​
.setSecretKey("$temp_secret_key")​
.setStsToken("$your_sts_token")​
.setEnvironment(BDAvatarEnv.GLOBAL)​
.build()​
​
BDAvatar.init(application, config)​
​
// Refresh all credentials together before expiration​
BDAvatar.updateTempAkSk(​
accessKey = "$new_temp_access_key",​
secretKey = "$new_temp_secret_key",​
stsToken = "$new_temp_sts_token",​
)​
​
Token 刷新说明​
对于使用临时 AK/SK + STS Token 或 WSS Token 的场景,凭证具有时效性。为确保后续连接顺利,请在凭证过期前调用对应的更新接口:​
  • 更新临时 AK/SK + STS:updateTempAKSK(accessKey,secretKey,stsToken)​
  • 更新 WSS Token:updateWssToken(wssToken)​
更新后的凭证将在下次创建会话时生效,不会影响当前正在进行的会话。​
带LogDelegate的完整示例代码:​
​
class DemoApp : Application() {​
override fun onCreate() {​
super.onCreate()​
​
val config = BDAvatarConfig.Builder()​
.setWssToken("$your_wss_token")​
.setEnvironment(BDAvatarEnv.GLOBAL)​
.setEnableInternalLogs(true) // 开启SDK日志输出​
.setLogDelegate(object : BDAvatarLogDelegate {​
override fun onLog(log: BDAvatarLog) {​
// 可按需接入你自己的日志系统​
}​
})​
.build()​
​
BDAvatar.init(this, config)​
}​
}​
​
2.2 创建数字人会话​
BDAvatarSessionConfig.Builder 用于构建单次会话配置。常用字段如下:​
avatarImageUrl为数字人形象图片的https URL,推荐的图片比例为 16:9 或者 4:3。speaker 为数字人音色,支持的SC2.0音色,参考:音色列表。其中SC 2.0版本和O 2.0版本的音色皆支持。​
BDAvatarSessionConfig.Builder​
​
配置方法​
参数必填​
说明​
setAvatarImageUrl(value: String)​
是​
数字人形象图片 https URL​
setSpeaker(value: String)​
是​
数字人音色标识​
setUserPrompt(value: String?)​
否​
用户提示词​
setSpeechRate(value: Int)​
否​
输出语音的语速,范围 [-50, 100],默认为 0​
setLoudnessRate(value: Int)​
否​
输出语音的音量,范围 [-50, 100],默认为 0​
setEnableWebsearch(value: Boolean)​
否​
是否开启网页搜索,默认为 否​
setActionList(value: List<String>?)​
since v1.0.2​
否​
数字人循环动作列表​
putExtraParam(key, value)​
否​
扩展参数​
​
示例代码:​
​
val sessionConfig = BDAvatarSessionConfig.Builder()​
.setAvatarImageUrl("https://example.com/avatar.jpg")​
.setSpeaker("YOUR_SPEAKER_ID")​
.setUserPrompt("请使用自然、简洁的方式与用户交流")​
.setSpeechRate(0)​
.setLoudnessRate(0)​
.setEnableWebsearch(true)​
.setActionList(listOf("大笑","捂脸 - 大笑"))​
.build()​
​
val session = BDAvatar.avatarSessionWithConfig(sessionConfig)​
​
支持的动作列表​
actionList 支持的动作标识符如下:​
​
聆听(不说话) - 自然呼吸​
聆听(不说话) - 小动作-整理头发​
聆听(不说话) - 开心​
聆听(不说话) - 惊讶​
开场 - 招手​
开场 - 双手合十​
开场 - 整理仪态​
感谢礼物与打赏 - 双手并拢比心​
感谢礼物与打赏 - 起立致敬​
感谢礼物与打赏 - 双手捂嘴感动​
感谢礼物与打赏 - 单手竖起大拇指​
感谢礼物与打赏 - 双手竖起大拇指​
引导关注与点赞 - 手指上方引导​
引导关注与点赞 - 手指下方引导​
引导关注与点赞 - 比"1"​
情绪调节与氛围 - 比耶(V手势)​
情绪调节与氛围 - 单手托下巴​
情绪调节与氛围 - 捂嘴笑​
情绪调节与氛围 - 嘟嘟嘴​
情绪调节与氛围 - 凑近镜头​
情绪调节与氛围 - 摸摸头​
情绪调节与氛围 - 比出嘘​
情绪调节与氛围 - 隔空"飞吻"气流​
情绪调节与氛围 - 开心笑​
情绪调节与氛围 - 整理衣服​
情绪调节与氛围 - 双手欢呼​
情绪调节与氛围 - 双手托脸​
情绪调节与氛围 - OK 手势​
情绪调节与氛围 - 嘘​
其他 - 悲伤(低头摇晃)​
其他 - 扶额​
其他 - 无聊​
复位 - 复位​
​
2.3 设置回调与渲染画布​
会话对象创建后,建议先设置 BDAvatarSessionDelegate,再绑定视频渲染视图​
BDAvatarSessionDelegate​
​
接口​
参数​
说明​
onSessionStart​
session: BDAvatarSession​
会话成功建立,数字人已就绪,可以开始交互​
onSessionStop​
session: BDAvatarSession​
error: Throwable?​
会话结束​
error 为 null 表示正常挂断,非 null 表示异常断开(含错误原因)​
onAudioCaptureStart​
session: BDAvatarSession​
麦克风采集已开启(用户侧音频开始上行)​
onAudioCaptureStop​
session: BDAvatarSession​
麦克风采集已停止(静音或通话结束)​
onAudioCaptureFail​
session: BDAvatarSession​
error: Throwable​
音频采集发生错误,含失败原因(如权限被拒、设备占用等)​
onAvatarSpeakingChange​
session: BDAvatarSession​
speaking: Boolean​
reason: String​
数字人说话状态变化​
speaking=true 开始说话,false 停止​
reason 说明触发原因(如用户打断、正常结束等)​
有默认空实现,非必须覆写​
onRemoteVideoReady​
​
session: BDAvatarSession​
avatarId: String​
数字人视频流已就绪可渲染​
avatarId 标识对应的数字人​
有默认空实现,非必须覆写​
​
示例代码:​
​
class AvatarActivity : AppCompatActivity(), BDAvatarSessionDelegate {​
​
private lateinit var session: BDAvatarSession​
private lateinit var surfaceView: SurfaceView​
​
private fun createSession() {​
session = BDAvatar.avatarSessionWithConfig(sessionConfig)​
session.delegate = this​
​
// 这里使用你界面上的 surfaceView,注意结束会话或者断开后,再次创建会话需要更新,详细参考Demo​
val surfaceView = SurfaceView(this)​
session.setAvatarVideoCanvas(surfaceView, BDAvatarRenderMode.FIT)​
}​
​
override fun onSessionStart(session: BDAvatarSession) {​
// 会话建立成功​
}​
​
override fun onSessionStop(session: BDAvatarSession, error: Throwable?) {​
// 会话结束,error 为空表示正常结束​
}​
​
override fun onAudioCaptureStart(session: BDAvatarSession) {}​
​
override fun onAudioCaptureStop(session: BDAvatarSession) {}​
​
override fun onAudioCaptureFail(session: BDAvatarSession, error: Throwable) {}​
​
2.4 启动会话并开始语音交互​
BDAvatarSession​
单次数字人会话管理类。​
​
接口​
参数​
说明​
setDelegate​
delegate: BDAvatarSessionDelegate?​
设置会话回调代理,用于接收状态变化与事件通知​
startSession​
无​
启动数字人会话​
finishSession​
无​
结束数字人会话​
setAvatarVideoCanvas​
view: View​
mode: RenderMode​
绑定数字人视频画布与渲染模式​
startAudioCapture​
无​
开始本地音频采集​
stopAudioCapture​
无​
停止本地音频采集​
isAudioCapturing​
无​
查询当前是否正在进行音频采集​
release​
无​
释放会话相关资源​
​
推荐流程如下:​
  1. 调用 session.startSession() 建立会话​
  1. 在 onSessionStart(...) 回调收到成功通知后,申请录音权限,开启麦克风​
  1. 权限授予成功后,再调用 session.startAudioCapture() 开始本地语音采集​
示例:​
​
private fun startAvatarConversation() {​
session.startSession()​
}​
​
override fun onSessionStart(session: BDAvatarSession) {​
requestAudioPermission()​
}​
​
private fun startAvatarAudioCapture() {​
if (!session.isAudioCapturing()) {​
session.startAudioCapture()​
}​
}​
​
如果你需要暂停与恢复用户语音采集,可以使用:​
​
session.stopAudioCapture()​
session.startAudioCapture()​
​
startAudioCapture() 应在会话已成功启动后调用。过早调用容易触发状态错误,导致录音启动失败。​
2.5 结束会话并释放资源​
不再需要数字人会话时,请先结束会话:​
​
private fun closeAvatarConversation() {​
session.finishSession()​
}​
...​
override fun onSessionStop(session: BDAvatarSession, error: Throwable?) {​
// 会话结束,error 为空表示正常结束​
// 处理UI变更和业务逻辑​
}​
​
如果你在页面生命周期中持有会话对象,建议在页面销毁时兜底释放:​
​
override fun onDestroy() {​
runCatching { session.release() }​
super.onDestroy()​
}​
​
​​
3. 常见问题​
4.1 会话已经启动,但没有声音或无法采集麦克风​
优先检查以下项:​
  • 是否已经在运行时申请并授予 RECORD_AUDIO​
  • Android 12 及以上是否需要补充 BLUETOOTH_CONNECT​
  • 是否在 onSessionStart(...) 之后才调用 startAudioCapture()​
  • 是否误调用了 stopAudioCapture()​
4.2 引入 AAR 后编译通过,但运行时回调异常或接口行为异常​
优先检查以下项:​
  • 是否遗漏了 OkHttp 依赖​
  • 是否 RTC 依赖版本正确,且未误引入其他不需要的 RTC SDK​
  • 是否在自定义混淆配置中裁掉了 SDK 的公开接口与回调实现类​
  • 是否在会话结束后又复用了已经 release() 的对象​
4. 最小接入清单​
  1. 将 SDK AAR 放入宿主工程 libs 目录​
  1. 在 Gradle 中引入本地 AAR​
  1. 添加 OkHttp 依赖​
  1. 添加 VolcEngineRTC:3.60.104.300​
  1. 在 AndroidManifest.xml 中声明 INTERNET、RECORD_AUDIO,并按需补充 BLUETOOTH_CONNECT​
  1. 在应用启动阶段调用 BDAvatar.init(...)​
  1. 创建 BDAvatarSessionConfig,通过 BDAvatar.avatarSessionWithConfig(...) 创建会话​
  1. 设置 delegate,绑定画布,启动会话​
  1. 在权限通过后调用 startAudioCapture()​
  1. 结束时调用 finishSession() 和 release()​
如需查看更完整的页面接入方式、权限处理和调用时序,请参见随 SDK 一同提供的 Demo 源码工程。​
5.附录​
SDK资源下载​
​
Version​
Resource​
RTC Version ​
1.0.0.cn​
​
SDK​
​
BDAvatarSDK-v1.0.1-release.zip
​
​
Demo​
​
BDAvatarDemo-v1.0.1.apk
​
实时互动数字人 Android SDK Demo 说明​
​
SRC​
​
BDAvatarDemoSrc-v1.0.1.zip
​
​
3.60.104.300​
​
​
WSS Token获取示例​
​
​
wss_token_volc.zip
​
​
​
​
最近更新时间:2026.08.13 11:21:51
这个页面对您有帮助吗?
有用
有用
无用
无用