数字人对话IOS SDK

更新时间:
复制为 MD 格式

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

产品能力

  • 云渲染数字人

    • 云端渲染数字人是通过阿里云RTC提供视频流订阅,SDKiOS App上拉取视频流呈现数字人的解决方案。

    • 云端渲染数字人具备完整的语音交互、脸部和肢体驱动能力,提供数字人多种对话模式和打断能力。

  • 端渲染(端到端)数字人

    • 端渲染数字人是通过阿里云RTC提供音频对话数据,SDKiOS App上通过拉取音频,并通过语音完成数字人的口型推理、面部驱动、渲染等全流程。

    • 端渲染数据人同样具备完整的语音交互、脸部和肢体驱动能力,同样提供数字人多种对话模式和打断能力。

    • 重要

      当前端渲染数字人未全量开放,如需使用端渲染交互的方式接入,请联系运营同学。

  • 单独数字人

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

    • 单独数字人不具备完整的语音交互,仅支持调用侧传入音频进行驱动

    • 重要

      当前单独数字人未全量开放,如需使用单独数字人的方式接入,请联系运营同学。

接入前须知

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

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

  3. 使用限制:

    1. 系统版本:支持iOS 14及以上版本

    2. 其他限制,可参考SDK下载/集成

    3. 重要

      端渲染数字人和单独数字人会在手机本地完成推理与渲染,对终端性能要求较高。建议最低机器型号iPhone 12,否则可能出现推理卡顿、帧率降低等体验问题。

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

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

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

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

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

接入方法

下载示例工程及SDK Framework

环境配置

  • Xcode 14及以上

加载SDK和依赖

xcode中导入如下的framework,可从示例工程中获取

// 数字人SDK
digital_human_ios_sdk.framework

// RTC SDK
AliVCSDK_ARTC.framework
alivcffmpeg.framework
queen.framework

// 视频解码相关SDK
ffmpegkit.framework
libavcodec.framework
libavdevice.framework
libavfilter.framework
libavformat.framework
libavutil.framework
libswresample.framework
libswscale.framework

// Zip SDK
ZIPFoundation.framework

权限相关

  • SDK和数字人交互需要用到录音权限,在Info.plist文件中增加如下代码:

    <key>NSMicrophoneUsageDescription</key>
    <string>{使用麦克风的原因描述}</string>

Flutter接入方式

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

接口列表

API

功能描述

init

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

start

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

interrupt

打断数字人说话

muteLocalMic

是否关闭本地麦克风采集

requestToRespond

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

pushAudioData

外部传入音频,驱动数字人,V0.1.3版本开始支持,仅单独数字人模式生效

exit

退出

扩展接口

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

接口详情

初始化SDK

init

/**
 * 初始化方法,主要用来配置参数,用于云渲染
 * @param license 扩展字段,云渲染暂未用到
 * @param avatarInitData 用户从平台拿到的数字人和资产信息
 * @param dialogConfig 业务层对话配置,如Tap2Talk/PushTalk/Duplex等
 */
init(license: String, avatarInitData: TYAvatarInitData, dialogConfig: TYDialogConfig)

参数说明

参数名称

类型

是否必传

描述

license

String

SDK license,云渲染数字人可不传,端渲染数字人必传

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运行过程中的所有信息,都会从这里透出给上层
 */
func start(completion: @escaping (Bool, TYError?) -> Void)

参数名称

类型

是否必传

描述

completion

@escaping (Bool, TYError?)

启动对话的回调

TYError的格式为

参数名称

类型

是否必传

描述

key

Int

错误信息Key

message

String

错误信息Message

绑定回调

并不是所有回调都需要绑定,建议开发者根据业务开发需求进行绑定即可。

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

    • /**
       * 对话准备完成,三端(客户端/VoiceChat/Avatar)均加入通道后,会回调该消息,此时才能调用业务接口
       */
      public var onReadyToSpeech: (() -> Void)?
  • onFirstFrameReceived: 收到第一帧视频帧

    • /**
       * RTC收到第一帧视频
       */
      public var onFirstFrameReceived: (() -> Void)?
  • onStateChanged: 数字人状态切换

    • /**
       * 状态切换
       */
      public var onStateChanged: ((TYVoiceChatState) -> Void)?
    • TYVoiceChatState为数字人状态,详细信息如下

      /// VoiceChat对话状态,和服务端状态一一对应
      public enum TYVoiceChatState: String {
          case idle = "Idle" // 空置状态,未连接/连接断开对应的状态
          case listening = "Listening" // 听
          case responding = "Responding" // 说
          case thinking = "Thinking" // 思考
      }
  • onVolumeChanged: 音频强度回调

    • /**
       * 音量强度回调
       * @param audioType 音频类型参考
       * @param audioLevel 音频强度,归一到【0,1】区间
       */
      public var onVolumeChanged: ((Float, TYVolumeSourceType) -> Void)?
    • TYVolumeSourceType为音频类型,详细信息如下

      /**
       * 语音类型,分为本地采集和远端TTS两种
       */
      public enum TYVolumeSourceType: Int {
          case mic
          case player
      }
  • onMessageReceived: 对话过程中的文本详情回调

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

      参数名称

      类型

      是否必传

      描述

      type

      TYVoiceChatMessageType

      消息类型

      text

      String

      过滤特殊字符后的文本信息

      rawText

      String?

      llm输出的原始文本信息,0.0.7版本之后支持

      isFinish

      Boolean

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

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

        /// voice chat消息类型
        public enum TYVoiceChatMessageType: Int {
            case speaking // 输入消息
            case responding // 输出消息
        }
  • onPerformanceInfoTrack:对话过程中的性能监测

    • /**
       * 对话过程中的性能监测
       * @param TYChatPerformace 信息详情
       */
      public var onPerformaceDataReceived: ((TYChatPerformace) -> Void)?
      • TYChatPerformace为性能信息详情,具体如下

        参数名称

        类型

        是否必传

        描述

        llmDelay

        Int64

        llm的时延

        ttsDelay

        Int64

        tts的时延

        avatarDelay

        Int64

        数字人画面帧的时延

        totalDelay

        Int64

        当前roundCount对话的总时延

        roundCount

        Int64

        会话轮次的计数值

        roundAverageTotalDelay

        Int64

        当前roundId对话的平均总时延,即totalDelay的平均值

  • onErrorReceived: 对话过程中的异常回调

    • /**
       * 对话过程中的异常信息
       * @param errorInfo 异常信息
       */
      public var onErrorReceived: ((TYError) -> Void)?
  • onLocalAvatarAssetsLoaded:端渲染数字人资产加载结果回调

    • /**
       * 端渲染数字人资产加载结果回调
       */
      public var onLocalAvatarAssetsLoaded: ((Bool) -> Void)?
  • localAvatarMotionDataDidLag:端渲染数字人音频卡顿

    • /**
       * 端渲染数字人音频卡顿
       */
      public var localAvatarMotionDataDidLag: (() -> Void)?

打断

interrupt

打断数字人说话,异步方法,打断结果会通过回调返回

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

暂停收音/恢复收音

muteLocalMic

是否关闭本地麦克风采集

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

文本问答

requestToRespond

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

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

推送音频数据

pushAudioData

调用侧传入音频数据给SDK,驱动数字人,仅单独数字人模式生效

/**
 * 推送音频数据,该接口仅在单独数字人模式下生效
 * @param audio 音频数据
 * @param end 是否结束,音频支持流式推送,最后一帧end需设置为true
 * @return 推送结果
 */
public func pushAudioData(_ audio:[Int16], end: Bool) ->Bool?

退出

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标识降低音量

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

端渲染模式下语音LAG

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

服务端错误

参考服务端错误码