云渲染-音频驱动-AndroidSDK

更新时间:
复制为 MD 格式

万相数字人开放平台推出的适用于Android数字人流媒体服务SDK。当您调用服务端OpenAPI CreateChatSession - 创建实时数字人会话接口获取RTC入会信息后,可以在Android搭建App,实现数字人拉流和实时对话。VideoChatAndroidSdk通过Android SDK(AliRTC)提供视频流的订阅,并通过RTC内置的消息通道进行信令传输

产品能力

  • 云端渲染-音频驱动数字人是通过阿里云RTC提供鉴权通道,SDK支持通过外部传入音频,完成数字人的口型推理、面部驱动、渲染等全流程

  • 云端渲染-音频驱动数字人不具备完整的语音交互,仅支持调用侧传入音频进行驱动,支持在数字人播报时进行打断

接入前须知

  1. SDK不包含操作服务端实例的接口(如创建实时数字人会话),如有需要请参考OpenAPI文档;

  2. Demo 需要依赖配合后端应用才能体验,请先确认建立好可以调用OpenAPI的后端应用。

  3. 使用限制:

    1. 系统版本:支持Android 8.0,API 26及以上版本。

    2. CPU架构:支持arm64-v8a。

    3. 其他限制:可参考RTC SDK下载/集成

  4. 若使用本文档提供的SDK,用于对公众提供人工智能生成合成服务,作为服务提供者需遵守《互联网信息服务深度合成管理规定》《人工智能生成合成内容标识办法》以及相关标准要求,履行人工智能生成合成内容标识的义务。

接入方法

下载示例工程

环境配置

  • Gradle版本 8.0

  • Android Gradle Plugin 8.1.3

  • Jdk 17

加载SDK和依赖

video_chat_sdk-release.aar在示例项目中

// aar直接依赖
implementation files('libs/video_chat_sdk-release.aar')
// OKHttp相关依赖
implementation("com.squareup.okhttp3:okhttp:4.10.0")
implementation("com.squareup.okio:okio:3.0.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.10.0")
// AliRTC相关依赖
implementation("com.aliyun.aio:AliVCSDK_ARTC:7.3.0")

权限相关

  • SDK和数字人交互需要用到录音权限,详细如下

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

混淆处理

  • SDK中有部分实现类需要使用Json序列化传输,不能做混淆处理,上层应用编译Release版本时,需要把以下混淆规则补充进去

    -keep class com.aliyun.allinone.** {
    *;
    }
    
    -keep class com.aliyun.rts.network.** {
    *;
    }
    
    -keep class com.aliyun.common.** {
    *;
    }
    
    -keep class com.huawei.multimedia.alivc.** {
    *;
    }
    
    -keep class com.alivc.rtc.** {
    *;
    }
    
    -keep class com.alivc.component.** {
    *;
    }
    
    -keep class org.webrtc.** {
    *;
    }
    
    -keep class com.tongyi.video_chat_sdk.conv.** {
    *;
    }
    
    -keep class com.tongyi.video_chat_sdk.TYVideoChat {
        public *;
    }
    
    -keep class com.tongyi.video_chat_sdk.data.** {
    *;
    }
    
    -keep class com.tongyi.video_chat_sdk.Constant {
    *;
    }
    -keep class com.tongyi.video_chat_sdk.Constant$* {
    *;
    }
    -keep enum com.tongyi.video_chat_sdk.Constant$* {
    *;
    }
    -keep class com.tongyi.video_chat_sdk.util.** {
    *;
    }
    
    # inference module
    -keep class com.tongyi.video_chat_sdk.native_impl.** {
    *;
    }
    
    # render module
    -keep class com.tongyi.video_chat_sdk.clientrender.** {
    *;
    }
    
    -keep class com.tongyi.video_chat_sdk.log.TYLogBean {
    *;
    }
    
    -keep class com.tongyi.video_chat_sdk.event_center.** {
    *;
    }
    
    # Keep generic signatures; needed for correct type resolution
    -keepattributes Signature
    
    # Keep class TypeToken (respectively its generic signature)
    -keep class com.google.gson.reflect.TypeToken { *; }
    
    # Keep any (anonymous) classes extending TypeToken
    -keep class * extends com.google.gson.reflect.TypeToken
    
    -dontwarn com.aliyun.aio.keep.API
    -dontwarn com.aliyun.aio.keep.CalledByNative
    -dontwarn com.aliyun.android.libqueen.aio.**
    
    -dontwarn org.bouncycastle.jsse.BCSSLSocket
    -dontwarn org.bouncycastle.jsse.BCSSLParameters
    -dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
    -dontwarn org.conscrypt.*
    -dontwarn org.openjsse.javax.net.ssl.SSLParameters
    -dontwarn org.openjsse.javax.net.ssl.SSLSocket
    -dontwarn org.openjsse.net.ssl.OpenJSSE
    -dontwarn java.lang.invoke.StringConcatFactory

Flutter接入方式

SDK暂未提供Flutter原生版本,可以将Flutter作为module集成在项目中,通过MethodChannel实现两端的相互调用,可参考Flutter接入移动解析HTTPDNS Android/iOS SDK实践方案,线上已有客户基于该方案完成SDK的接入和App的上线

接口列表

API

功能描述

init

初始化方法,主要用来配置参数

start

初始化成功后,启动对话流程

interrupt

打断数字人说话

pushAudioData

外部传入音频,驱动数字人,V0.1.3版本开始支持

exit

退出

扩展接口

SDK针对音频采集和播放提供了一些自定义配置

接口详情

初始化SDK

init

/**
 * 初始化方法,主要用来配置参数,用于云渲染
 * @param activity 窗口类对象
 * @param avatarInitData 用户从平台拿到的数字人和资产信息
 * @param dialogConfig 业务层对话配置,如Tap2Talk/PushTalk/Duplex等
 * @return 初始化结果
 */
fun init(activity: Activity, avatarInitData: TYAvatarInitData, dialogConfig: TYDialogConfig): Boolean

参数说明

参数名称

类型

是否必传

描述

activity

Activity

活动实例

avatarInitData

TYAvatarInitData

数字人初始化数据

dialogConfig

TYDialogConfig

数字人对话模式配置

其中TYAvatarInitData为数字人初始化数据,主要包括RTC入会信息和资产信息

重要

TYAvatarInitData数据可通过调用服务端OpenAPI CreateChatSession - 创建实时数字人会话接口获取,请务必在使用前验证服务端OpenAPI接口是否能正常调用

获取成功后,将Data字段对应的JsonObject传入SDK即可

"data": {
    "sessionId": "9827f4bd-5008-4d34-98fb-62598f3ad3b5",
    "rtcParams": {
      "appId": "xxx",
      "avatarUserId": "xxx",
      "channel": "channel_info",
      "clientUserId": "xxx",
      "gslb": "https://gw.rtn.aliyuncs.com",
      "nonce": "f8b0ef02c5da778f4488e2470c",
      "serverUserId": "xxx",
      "timestamp": 1560588594,
      "token": "xxx"
    }
  }

参数名称

类型

是否必传

描述

rtcParams

TYAvatarInitConfig

RTC入会信息

sessionId

String?

本轮对话的全局sessionId

TYAvatarInitConfigRTC入会信息

参数名称

类型

是否必传

描述

appId

String

RTC应用id

channel

String

RTC通道信息

gslb

String

RTC负载均衡地址

timestamp

long

RTC鉴权有效的时间戳

token

String

RTC鉴权相关的token

clientUserId

String

客户端入会的id

serverUserId

String

服务端入会的id

avatarUserId

String

数字人入会的id

nonce

String

鉴权标识

sessionId

String

数字人对话的全局sessionId

TYDialogConfig为对话属性配置信息

参数名称

类型

是否必传

描述

renderType

TYAvatarRenderType

渲染类型,云渲染-音频驱动模式为remote_avatar_only

mode

TYVoiceChatMode

对话模式,当前仅支持Tap2Talk

keepAlive

Boolean

是否开启心跳保活,默认开启

keepAlivePeriod

Int

心跳保活间隔,默认10s

outboundSampleRate

Int

TTS音频播放采样率,默认48000

TYAvatarRenderType为渲染类型信息,可参考

/**
 * 数字人渲染类型
 */
object TYAvatarRenderType {
    const val REMOTE_RENDER_AVATAR = "cloud" // 云渲染-全链路
    const val REMOTE_RENDER_AVATAR_ONLY = "remote_avatar_only" // 云渲染-音频驱动
    const val LOCAL_RENDER_AVATAR = "local" // 端渲染-全链路
    const val LOCAL_RENDER_AVATAR_ONLY = "avatar_only" // 端渲染-音频驱动
}

TYVoiceChatMode为对话模式,可参考

/**
 * 会话模式
 */
object TYVoiceChatMode {
    const val TAP2TALK = "tap2talk" // 默认方式,一方说完,另一方可以说话
    const val PUSH2TALK = "push2talk" // 用户主动开始和结束说话
    const val DUPLEX = "duplex" // 全双工模式,可语音打断
}

开启对话

start

/**
 * 启动对话流程
 *
 * @param chatCallback 主回调,SDK运行过程中的所有信息,都会从这里透出给上层
 */
fun start(chatCallback: IChatCallback)

参数名称

类型

是否必传

描述

chatCallback

IChatCallback

SDK主回调方法

IChatCallback为主回调实例,SDK运行过程中的所有信息,都会由该实例透出给上层

  • onStartResult: 对话启动结果,鉴权、客户端加入通道成功后,会回调该消息

    • /**
       * 对话启动结果,鉴权、客户端加入通道成功后,会回调该消息
       */
      fun onStartResult(isSuccess: Boolean, errorInfo: TYError?)
    • TYError的格式为

      参数名称

      类型

      是否必传

      描述

      key

      Int

      错误信息Key

      message

      String

      错误信息Message

  • onReadyToSpeech: 对话准备完成,三端(客户端/VoiceChat/Avatar)均加入通道后,会回调该消息,此时才能调用业务接口

    • /**
       * 对话准备完成,三端(客户端/VoiceChat/Avatar)均加入通道后,会回调该消息,此时才能调用业务接口
       */
      fun onReadyToSpeech()
  • onGotRenderView: RTC准备好的渲染组件,需要调用者把它显示到屏幕上

    • /**
       * RTC准备好的渲染组件,需要调用者把它显示到屏幕上
       */
      fun onGotRenderView(renderView: SurfaceView)
  • onInterruptResult: 主动打断的回调,包括手动打断和语音打断

    • /**
       * 主动打断的回调,包括手动打断和语音打断
       */
      fun onInterruptResult(isSuccess: Boolean, errorInfo: TYError?)
  • onStateChanged: 数字人状态切换

    • /**
       * 状态切换
       */
      fun onStateChanged(state: DialogState)
    • DialogState为数字人状态,详细信息如下

      public static enum DialogState {
              DIALOG_IDLE(0),// IDLE状态
              DIALOG_LISTENING(1),// 数字人在听
              DIALOG_RESPONDING(2),// 数字人在说
              DIALOG_THINKING(3);// 数字人在想
      }
  • onVolumeChanged: 音频强度回调

    • /**
       * 音量强度回调
       * @param audioType 音频类型参考 {@link Constant.TYVolumeSourceType}
       * @param audioLevel 音频强度,归一到【0,1】区间
       */
      fun onVolumeChanged(audioLevel: Float, audioType: Constant.TYVolumeSourceType)
    • Constant.TYVolumeSourceType为音频类型,详细信息如下

      /**
       * 语音类型,分为本地采集和远端TTS两种
       */
      enum class TYVolumeSourceType {
          MIC, // 本地采集
          PLAYER // 远端TTS
      }
  • onPerformanceInfoTrack:对话过程中的性能监测

    • /**
       * 对话过程中的性能监测
       * @param type 信息类型
       * @param performanceInfo 信息详情
       */
      fun onPerformanceInfoTrack(type: Constant.TYPerformanceInfoType, performanceInfo: String)
      • type为信息类型的枚举,当前仅支持耗时统计,详细信息如下

        /**
         * Performance信息类型
         */
        enum class TYPerformanceInfoType {
          TIMESTAMP_STATISTICS,// 耗时统计
        }
  • onErrorReceived: 对话过程中的异常回调

    /**
     * 对话过程中的异常信息
     * @param errorInfo 异常信息
     */
    fun onErrorReceived(errorInfo: TYError)

打断

interrupt

打断数字人说话,异步方法,实际结果会以回调的方式通知

/**
 * 打断数字人说话
 */
fun interrupt()

推送音频数据

pushAudioData

调用侧传入音频数据给SDK,驱动数字人

/**
 * 推送音频数据,该接口仅在单独数字人模式下生效
 * @see com.tongyi.video_chat_sdk.Constant.TYAvatarRenderType.LOCAL_RENDER_AVATAR_ONLY
 * @param audio 音频数据
 * @param end 是否结束,音频支持流式推送,最后一帧end需设置为true
 * @return 推送结果
 */
fun pushAudioData(audio: ByteArray, end: Boolean): Boolean

退出

exit

退出SDK,退出页面时必须调用该方法,否则会导致实例未释放,功能会出现异常

/**
 * 销毁实例
 */
fun exit()

扩展接口

用户在一些场景下,需要对音频采集和播放做一些自定义配置,此处开放一些配置参数,通过调用getRtcConfig()获取TYRtcConfig对象,当前支持的配置参数如下。注意:该接口需要在SDK start接口前调用生效

参数名称

类型

默认值

描述

playOutAudioVolume

Integer

100

TTS音频增益,值域为[0, 400],大于100标识增大音量,小于100标识降低音量

recordAudioVolumeBeforeVAD

Integer

100

VAD唤起前采集音量大小,值域为[0, 400],大于100标识增大音量,小于100标识降低音量。双工对话模式建议设置为40,其他对话模式建议设置为100

recordAudioVolumeAfterVAD

Integer

100

VAD唤起后采集音量大小,值域为[0, 400],大于100标识增大音量,小于100标识降低音量

enableVolumeDetection

Boolean

false

是否开启播放音量强度监测,开启后会把当前的播放音量归一化,回调给业务

audioProfile

AliRtcAudioProfile

AliRtcAudioProfile.AliRtcEngineBasicQualityMode

音频上行的参数模式,默认参数16K/单声道/24kbps

audioScenario

AliRtcAudioScenario

AliRtcAudioScenario.AliRtcSceneMusicMode

音频播放的场景模式,默认为AliRtcSceneMusicMode,标识高保真音乐音质

renderMode

AliRtcEngine.AliRtcRenderMode

AliRtcRenderMode.AliRtcRenderModeAuto

视频流渲染的填充模式,AliRtcRenderModeAuto(0):自动模式

AliRtcRenderModeStretch(1):拉伸平铺模式

AliRtcRenderModeFill(2):填充黑边模式

AliRtcRenderModeClip(3):裁剪模式

错误码

应用内部错误

错误码

错误说明

解决方案

1120

RTC参数过期

场景1)生成RTCjson信息存在有效期限制,拿到信息后超出5min未入会;

场景2)同样的RTC参数重复入会

刷新RTC入会参数

RTC错误

错误码

错误说明

解决方案

1000

RTC初始化参数错误

检查RTC入会信息

1001

RTC鉴权失败

检查RTC入会信息

1002

RTC加入频道错误

检查网络或者RTC入会信息

1003

RTC数据丢包

请联系产品运营同学进行错误排查

1004

RTC 数据通道崩溃

请联系产品运营同学进行错误排查

1005

RTC房间被销毁

RTC房间被服务端主动销毁

1006

用户被踢出RTC房间

服务端将用户主动踢出房间

1007

端渲染模式下TTS语音LAG

请联系产品运营同学进行错误排查

服务端错误

参考服务端错误码