星尘交互数字人SDK文档接口说明
实时交互数字人以深度个性化大模型、AI驱动的实时渲染技术为核心,致力于提供类人智能体交互数字人解决方案。基于通义星尘的大语言模型,以及在语音和图像等领域的技术优势,打造具有高度互动性的数字人产品,适用于多种对话应用场景。
产品介绍
交互数字人产品介绍:
定制数字人形象:提供多种方式创造独特数字人形象,包括一键生成超逼真的2D数字人,以及文字生成的3D卡通数字人,满足不同需求。
高智商数字人:结合星尘大语言模型,数字人在多场景中展现卓越的智能问答能力,迅速且精准地响应用户,提高互动体验的愉悦感。
真实动作表情:精准还原口型与表情,基于对话语义实时生成适宜的动作与表情,使交互过程更生动自然。
多样化语音生成:支持多种TTS音色,通过简单的10秒录音实现个性化音调的克隆,提升交流的个性化、自然性及辨识度。
灵活渲染模式:提供多种渲染方案(如H5渲染、云渲染、端渲染),并通过自主研发的引擎适配Android、iOS、Web等多个平台,确保跨平台的一致性与灵活性。
产品优势:
高效集成:完整解决方案简化开发流程,缩短项目周期并降低成本,使技术实现更加便捷。
实时性:支持低延迟互动,确保流畅无缝的用户体验,提升参与度和满意度。
多功能:整合语音、视觉、情感识别等多种互动功能,全方位提升用户参与感与沉浸感,为产品增添独特价值。
SDK介绍
SDK类型:
类型 | 渲染方式 | 开发方式 |
交互数字人(支持语音端到端对话等) | 云渲染(云端完成数字人渲染推流至应用侧) | Android/iOS/Web |
交互数字人(支持语音端到端对话等) | 端渲染(H5端完成数字人渲染推流至应用侧) | Web |
仅数字人(需要客户自行串联语音、对话等) | 数字人端渲染(H5端完成数字人渲染推流至应用侧) | Web |
SDK获取方式:
目前星尘数字人SDK使用需添加白名单,请添加星尘官网钉钉群,联系管理员!
星尘钉钉群官方二维码:
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 | 云渲染 | |
iOS SDK | 云渲染 | |
Web SDK | 端/云渲染 |