数字人对话AndroidSDK

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

接入前须知

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

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

  3. 使用限制:

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

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

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

  4. 云端渲染数字人的语音交互模式主要有两种模式:tap2talk模式、duplex双工模式

    • tap2talk模式下,SDK内部的语音服务会实时识别用户的语音输入。但是用户想打断数字人,需要通过额外事件来触发,比如点击屏幕,或者点击某按钮。

    • duplex双工模式下,SDK内部的语音服务会实时识别用户的语音输入。数字人在说话状态下,仍可以接受用户的语音打断信号。

      • duplex双工模式,容易受到外部环境音的影响导致触发频繁打断,请在相对安静的环境下使用双工模式。

  5. 若使用本文档提供的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.videochatsdk.clientrender.** {
    *;
    }
    
    -keep class com.tongyi.video_chat_sdk.log.TYLogBean {
    *;
    }
    
    -keep class com.tongyi.video_chat_sdk.event_center.** {
    *;
    }
    
    -dontwarn com.aliyun.aio.keep.API
    -dontwarn com.aliyun.aio.keep.CalledByNative
    
    -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

接口列表

API

功能描述

init

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

start

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

interrupt

打断数字人说话

muteLocalMic

是否关闭本地麦克风采集

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"
    },
    "avatarAssets": {
      "url": "xxx",
      "md5": "xxx",
      "secret": "xxx"
      "type": "xxx",
      "minRequiredVersion": "0.0.1"
    }
  }

参数名称

类型

是否必传

描述

rtcParams

TYAvatarInitConfig

RTC入会信息

avatarAssets

TYAvatarAssetConfig

资产信息,云渲染暂不需要

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

TYAvatarAssetConfig为数字人资产信息,为扩展结构,暂未开放

TYDialogConfig为对话属性配置信息

参数名称

类型

是否必传

描述

renderType

TYAvatarRenderType

渲染类型,当前仅支持云端渲染

mode

TYVoiceChatMode

对话模式,当前仅支持Tap2Talk

keepAlive

Boolean

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

keepAlivePeriod

Int

心跳保活间隔,默认10s

outboundSampleRate

Int

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

开启对话

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
      }
  • onMessageReceived: 对话过程中的文本详情回调

    • /**
       * 对话的文本详情回调
       * @param chatMessage
       */
      fun onMessageReceived(chatMessage: TYVoiceChatMessage)
    • TYVoiceChatMessage为文本详情封装类,详细信息如下

      参数名称

      类型

      是否必传

      描述

      chatMessageType

      ChatMessageType

      消息类型

      chatMessageText

      String

      消息文本

      isFinish

      Boolean

      是否结束,用户说/AI说每次会返回当前已识别到的全部内容,说完后,该标志位为true

      llmRequestId

      String

      对话过程中的LLM请求ID,可以此定位LLM的问题

      • ChatMessageType为消息类型的枚举,详细信息如下

        /**
         * 消息类型,分为用户说/AI说两种
         */
        enum class ChatMessageType {
            SPEAKING, // 用户问
            RESPONDING // AI回答
        }
  • 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()

暂停收音/恢复收音

muteLocalMic

是否关闭本地麦克风采集

/**
 * 是否关闭本地麦克风采集
 */
fun muteLocalMic(mute: Boolean): Boolean

文本问答

requestToRespond

请求服务端回答指定内容,或者播报指定内容

/**
 * 请求服务端回答指定问题or做TTS播放出来
 * @param type: transcript 表示直接把文本转语音,prompt 表示把文本送大模型回答
 * @param text:对应的文本
 */
fun requestToRespond(type: String, text: String)

type可参考TYRequestToRespondType,具体定义为

/**
 * RequestToRespond支持的字段类型
 */
object TYRequestToRespondType {
    const val PROMPT = "prompt" // 指定提问内容
    const val TRANSCRIPT = "transcript" // 指定播报内容
}

退出

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

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

服务端错误

参考服务端错误码