星尘交互数字人SDK文档接口说明

更新时间:

实时交互数字人以深度个性化大模型、AI驱动的实时渲染技术为核心,致力于提供类人智能体交互数字人解决方案。基于通义星尘的大语言模型,以及在语音和图像等领域的技术优势,打造具有高度互动性的数字人产品,适用于多种对话应用场景。

产品介绍

交互数字人产品介绍:

  1. 定制数字人形象:提供多种方式创造独特数字人形象,包括一键生成超逼真的2D数字人,以及文字生成的3D卡通数字人,满足不同需求。

  2. 高智商数字人:结合星尘大语言模型,数字人在多场景中展现卓越的智能问答能力,迅速且精准地响应用户,提高互动体验的愉悦感。

  3. 真实动作表情:精准还原口型与表情,基于对话语义实时生成适宜的动作与表情,使交互过程更生动自然。

  4. 多样化语音生成:支持多种TTS音色,通过简单的10秒录音实现个性化音调的克隆,提升交流的个性化、自然性及辨识度。

  5. 灵活渲染模式:提供多种渲染方案(如H5渲染、云渲染、端渲染),并通过自主研发的引擎适配Android、iOS、Web等多个平台,确保跨平台的一致性与灵活性。

产品优势:

  1. 高效集成:完整解决方案简化开发流程,缩短项目周期并降低成本,使技术实现更加便捷。

  2. 实时性:支持低延迟互动,确保流畅无缝的用户体验,提升参与度和满意度。

  3. 多功能:整合语音、视觉、情感识别等多种互动功能,全方位提升用户参与感与沉浸感,为产品增添独特价值。

SDK介绍

SDK类型:

类型

渲染方式

开发方式

交互数字人(支持语音端到端对话等)

云渲染(云端完成数字人渲染推流至应用侧)

Android/iOS/Web

交互数字人(支持语音端到端对话等)

端渲染(H5端完成数字人渲染推流至应用侧)

Web

仅数字人(需要客户自行串联语音、对话等)

数字人端渲染(H5端完成数字人渲染推流至应用侧)

Web

SDK获取方式:

目前星尘数字人SDK使用需添加白名单,请添加星尘官网钉钉群,联系管理员!

星尘钉钉群官方二维码:

image.png

SDK接口文档

  • SDK支持功能如下

  • 使用通义星尘网关鉴权

    • 支持Tap2Talk/Push2Talk/Duplex三种通话模式

  • 支持音色配置、数字人配置、对话过程手动打断/语音打断

三端统一接口(支持Android/iOS/H5)

主要对话流程

package com.tongyi.video_chat_sdk

import android.app.Activity
import com.tongyi.video_chat_sdk.data.IChatCallback
import com.tongyi.video_chat_sdk.data.request.TYRTCAuthParams
import com.tongyi.video_chat_sdk.data.request.TYRequestConfig

/**
 * @author flyingfish
 * @date 2024/08/27
 * description:接口能力列表
 */
interface IVideoChat {
    /**
     * 初始化方法,主要用来配置参数
     * @param authParams RTC鉴权参数
     * @param requestConfig 网关信息参数
     * @return 初始化结果
     */
    fun init(activity: Activity, authParams: TYRTCAuthParams, requestConfig: TYRequestConfig): Boolean

    /**
     * 初始化成功后,启动对话流程
     * @param chatCallback 主回调,除了初始化过程的所有消息,都会从这里透出给上层
     */
    fun start(chatCallback: IChatCallback)

    /**
     * 打断AI说话
     */
    fun interrupt()

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

    /**
     * Push2Talk 用户开始说话
     */
    fun startSpeech()

    /**
     * Push2Talk 用户结束说话
     */
    fun stopSpeech()

    /**
     * Push2Talk 用户取消说话
     */
    fun cancelSpeech()

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

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

import android.view.SurfaceView
import com.alibaba.ty.conv.ConvConstants.DialogState
import com.tongyi.video_chat_sdk.Constant

/**
 * @author flyingfish
 * @date 2024/08/27
 * description:对话过程中的主回调
 */
interface IChatCallback {
    /**
     * 对话启动结果,鉴权、客户端加入通道成功后,会回调该消息
     */
    fun onStartResult(isSuccess: Boolean, errorInfo: TYError?)

    /**
     * 主动打断的回调,包括手动打断和语音打断
     */
    fun onInterruptResult(isSuccess: Boolean, errorInfo: TYError?)

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

    /**
     * 状态切换
     */
    fun onStateChanged(state: DialogState)

    /**
     * 音量强度回调
     * @param audioType 参考 {@link Constant.TYVolumeSourceType}
     * @param audioLevel 0-100
     */
    fun onVolumeChanged(audioLevel: Float, audioType: Constant.TYVolumeSourceType)

    /**
     * 对话的文本详情回调
     * @param chatMessage
     */
    fun onMessageReceived(chatMessage: TYVoiceChatMessage)

    /**
     * RTC准备好的渲染组件,需要调用者把它显示到屏幕上
     */
    fun onGotRenderView(renderView: SurfaceView)

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

    /**
     * 运行过程中回调关键日志信息给上层
     * @param level 日志级别,参考Android.Log
     * @param type 日志类型
     * @param debugInfo 日志信息
     */
    fun onDebugInfoTrack(level: Int, type: Constant.TYDebugInfoType, debugInfo: String)
}

请求鉴权参数及示例

/**
 * @author flyingfish
 * @date 2024/08/28
 * description:RTC鉴权必要的传入参数
 */
class TYRTCAuthParams : Serializable {
    /**
     * 模型Id
     */
    var modelId: String? = null

    /**
     * 音色信息
     */
    var voiceId: String? = null

    /**
     * 数字人Id
     */
    var avatarId: String? = null

    /**
     * 对话模式
     */
    var mode: String? = null

    /**
     * 租户Id
     */
    var appId: String? = null

    /**
     * 个性id,和Content必须传一个
     */
    var characterId: String? = null

    /**
     * 个性Content,和characterId必须传一个
     */
    var content: String? = null

    /**
     * userId:业务自定义用户id,必传
     */
    var userId: String? = null

    /**
     * 扩展消息
     */
    var extras: Map<String, Any>? = null

    /**
     * 是否使用RTC内置的AEC
     */
    var useRtcAec: Boolean = true

    /**
     * 默认TTS的采样率 48K
     */
    var outboundSampleRate: Int = 48000

    override fun toString(): String {
        return "TYRTCAuthParams(modelId=$modelId, voiceId=$voiceId, avatarId=$avatarId, mode=$mode, appId=$appId, characterId=$characterId, content=$content, userId=$userId, extras=$extras, useRtcAec=$useRtcAec, outboundSampleRate=$outboundSampleRate)"
    }
}

/**
 * @author flyingfish
 * @date 2024/08/28
 * description:请求鉴权的配置,包含了请求的地址和自定义的Header信息
 */
class TYRequestConfig : Serializable {
    /**
     * 请求的Url
     */
    var url: String? = null

    /**
     * 自定义的Headers
     */
    var headers: Map<String, String>? = null

    override fun toString(): String {
        return "TYRequestConfig(url=$url, headers=$headers)"
    }
}

/*星尘网关示例 端上sdk可控制的参数*/
"authParams": {
    // appId,当前不做校验,鉴权信息放在Header里
    "appId": "",
    // 数字人Id,必传
    "avatarId": "video-chat-tianyou",
    // 个性Id,当前不做校验,characterId和content必须传一个
    "characterId": "123",
    "content": "",
    // 通话模式,必传
    "mode": "tap2talk",
    // LLM大模型ID,必传
    "modelId": "xingchen-plus-v2",
    // 数字人音频播放采样率
    "outboundSampleRate": 48000,
    // 是否开启RTC内置的AEC,默认开启
    "useRtcAec": true,
    // 用户ID,不做权限校验,保证唯一性即可,建议使用UUID传入
    "userId": "lxx",
    // 音色Id,必传
    "voiceId": "longxiaochun"
},
"requestConfig": {
    // Header中预置鉴权信息
    "headers": {
        "Authorization": "鉴权信息,通过“星尘-我的空间-密钥管理”获取",
        "x-fag-appcode": "aca",
        "x-fag-servicename": "aca-videochat-init"
    },
    // 星尘网关的地址
    "url": "https://nlp.aliyuncs.com/v2/api/videochat/initialize"
}

SDK中的常量(对话模式、消息类型、错误码等)

/**
 * 会话模式
 */
object TYVoiceChatMode {
    const val TAP2TALK = "tap2talk" // 默认方式,一方说完,另一方可以说话
    const val PUSH2TALK = "push2talk" // 用户主动开始和结束说话
    const val DUPLEX = "duplex" // 全双工模式,可语音打断
}
/**
 * @author flyingfish
 * @date 2024/08/27
 * description:回调给上层的对话文字,用户说/AI说的内容均可以通过此结构
 */
class TYVoiceChatMessage(
    /**
     * 消息类型
     */
    var chatMessageType: Constant.ChatMessageType,
    /**
     * 文本详情
     */
    var chatMessageText: String?,
    /**
     * 是否结束,用户说/AI说每次会返回当前已识别到的全部内容,说完后,该标志位为true
     */
    var isFinish: Boolean?
        ) {
    override fun toString(): String {
        return "TYVoiceChatMessage(chatMessageType=$chatMessageType, chatMessageText=$chatMessageText, isFinish=$isFinish)"
    }
}

/**
 * 消息类型,分为用户说/AI说两种
 */
enum class ChatMessageType {
    SPEAKING, // 用户问
    RESPONDING // AI回答
}
public static enum DialogState {
    // 空闲
    DIALOG_IDLE(0),
    // 听
    DIALOG_LISTENING(1),
    // 说
    DIALOG_RESPONDING(2),
    // 思考
    DIALOG_THINKING(3);
}
enum TYAvatarType: String {
    case AudioOnly
    case Avatar
    case LocalAvatar
}
enum TYVolumeSourceType {
    case mic
    case player
}
/**
 * 错误码列表
 */
object TYErrorKey {
    const val ERROR_CODE_SUCCESS = 0
    const val HTTP_ERROR_CODE_SUCCESS = 200;

    /**
     * 网关错误码
     */
    object Gateway {
        // 未授权的用户
        const val ERROR_UNAUTHORIZED_USER = 401
        // 数字人资源不足
        const val ERROR_INITIALIZED_LIMIT = 422
        // 大模型对话限流
        const val ERROR_QUOTA_EXCEEDED = 431
    }

    /**
     * RTC错误码
     */
    object RTC {
        // 默认的鉴权失败
        const val ERROR_CODE_AUTH_FAILED = 1001
        // 加入通道失败
        const val ERROR_CODE_JOIN_CHANNEL_FAILED = 1002
    }

    /**
     * VoiceChat错误码
     */
    object VoiceChat {
        // 透传VoiceChat返回的Code
        // 触发绿网
        const val ERROR_CODE_GREEN_NET_FAILED = 40020000
        // 超时不和数字人交互,当前为1分钟
        const val ERROR_CODE_CONVERSATION_IDLE_TOO_LONG = 40030000
        // 连接断开
        const val ERROR_CODE_CONNECT_FAILED = 40000004
    }

    /**
     * 上层业务错误码
     */
    object System {
        // 业务层的Key
        const val ERROR_CODE_UNKNOWN = 9999
    }
}

SDK接入流程

类型

渲染模式

具体文档

Android SDK

云渲染

Android SDK标准化文档

iOS SDK

云渲染

iOS SDK标准化文档

Web SDK

端/云渲染

Web SDK 标准化文档