灵眸数字人开放平台推出的适用于Web端的数字人流媒体服务SDK。当您调用服务端OpenAPI CreateChatSession - 创建实时数字人会话接口获取对话初始化信息后,可以调用该SDK,实现数字人的对话。SDK通过阿里云RTC提供视频流订阅能力,并通过RTC内置的消息通道进行信令传输。
产品能力
云渲染数字人
云端渲染数字人是通过阿里云RTC提供视频流订阅,SDK在浏览器上拉取视频流呈现数字人的解决方案。
云端渲染数字人具备完整的语音交互、脸部和肢体驱动能力,提供数字人多种对话模式和打断能力。
端渲染(端到端)数字人
端渲染数字人是通过阿里云RTC提供音频和模型脸部肢体动作数据,SDK在浏览器上通过拉取数据并使用WebGL渲染数字人的解决方案。
端渲染数据人同样具备完整的语音交互、脸部和肢体驱动能力,同样提供数字人多种对话模式和打断能力。
接入前须知
受浏览器底层WebSocket、底层录音权限、WebRTC等限制,本地开发环境仅支持使用localhost运行。生产环境上页面协议请使用HTTPS,否则会出现录音权限获取失败、拉流播放失败等问题。
云渲染数字人、端渲染数字人的语音交互模式分为两种模式:tap2talk模式 和 duplex双工模式
在tap2talk模式下,SDK内部的语音服务会实时识别用户的语音输入。但是用户想打断数字人,需要通过额外事件来触发,比如点击屏幕,或者点击某按钮。
在duplex双工模式下,SDK内部的语音服务会实时识别用户的语音输入。数字人在说话状态下,仍可以接受用户的语音打断信号。
在duplex双工模式,容易受到外部环境音的影响导致触发频繁打断,请在相对安静的环境下使用双工模式。
若使用本文档提供的SDK,用于对公众提供人工智能生成合成服务,作为服务提供者需遵守《互联网信息服务深度合成管理规定》《人工智能生成合成内容标识办法》以及相关标准要求,履行人工智能生成合成内容标识的义务。
接入方法
示例工程
Npm集成
请根据自己使用的包管理器,选择对应的命令,安装lm-avatar-chat-sdk依赖包
当前版本是 0.0.5
npm i lm-avatar-chat-sdk
pnpm i lm-avatar-chat-sdk
yarn i lm-avatar-chat-sdk
设置挂载元素
云渲染数字人底层通过阿里云RTC进行音视频流的传输,需要挂载在一个video元素上。所以开发者要在页面html中先添加video容器元素。而端渲染数字人sdk会创建一个canvas用来渲染数字人画面,需要挂载在一个div元素上,所以页面中需要添加一个div容器元素。
// 云渲染
<video id="cloudAvatarContainer" muted></video>
// 端渲染
<div id="localAvatarContainer"></div>
创建对话数字人
对话数字人支持两种语音交互模式:tap2talk 和 duplex。这两种语音交互模式的取值可以通过SDK中的TYVoiceChatMode枚举值获取。云渲染和端渲染的创建方法相同,区别在于端渲染需要额外的资产信息,所以多了第三个入参
import {
createAvatar,
TYAvatarType,
IAvatarInitConfig,
TYVoiceChatMode,
IAvatarAssetModelType
} from 'lm-avatar-chat-sdk';
const avatarInitParams = { // rtc相关参数需要从接口获取,详见IAvatarInitConfig
rootContainer: 'xxx',
appId: 'xxx',
channel: 'xxx',
timestamp: 'xxx',
token: 'xxx',
clientUserId: 'xxx',
clientUserName: 'xxx',
serverUserId: 'xxx',
avatarUserId: 'xxx',
sessionId: 'xxx',
} as IAvatarInitConfig
const assetParams = { // 参数需要从接口获取,详见IAvatarAssetsConfig
type: IAvatarAssetModelType.AVATAR_3D_TRADITIONAL,
url: 'xxxx.zip?xxxx',
secret: 'xxxxx',
license: 'xxxxx'
}
// 创建云渲染数字人
const avatar = createAvatar(TYAvatarType.cloudAvatar, avatarInitParams)
// 创建端渲染数字人
const avatar = createAvatar(TYAvatarType.localAvatar, avatarInitParams, assetParams)
启动对话
avatar.start({
mode: TYVoiceChatMode.tap2talk,
})
绑定回调
并不是所有回调都需要绑定,建议开发者根据业务开发需求进行绑定即可。
onFirstFrameReceived
在数字人首页画面出现的时候触发此回调
avatar.onFirstFrameReceived(() => {
console.log('数字人渲染完毕')
})
onReadyToSpeech
在数字人可以开始进行语音交互的时候触发此回调
avatar.onReadyToSpeech(() => {
console.log('可以进行语音交互了')
})
onErrorReceived
在数字人内部出现错误的时候触发此回调, 更多错误码详情见此教程的错误码列表
avatar.onErrorReceived((err:TYError) => {
console.log('数字人内部发生错误:' + err.code + ' ' + err.message)
})
onStateChanged
在数字人内部状态发生变化的时候触发此回调,详情见SDK中的TYVoiceChatState类型声明。
云端数字人拥有三种状态:Listening(倾听)、Thinking(思考中)、Responding(反馈中)
// 数字人状态
avatar.onStateChanged((tyState: TYVoiceChatState) => {
console.log('当前数字人状态' + tyState)
})
onVolumeChanged
在数字人或者用户说话音量发生变化的时候触发此回调。回调返回的数据中,source为TYVolumeSourceType.mic的数据表示用户自己说话的音量,source为TYVolumeSourceType.player的数据表示数字人的音量。详情见SDK中的TYVolume和TYVolumeSourceType类型声明。
请注意:SDK已将数字人的音量做了归一化处理,数值大小范围为0~1
avatar.onVolumeChanged((data: TYVolume) => {
if(data.source === TYVolumeSourceType.mic) {
console.log('用户音量:' + data.volume)
} else {
console.log('数字人音量:' + data.volume)
}
})
onMessageReceived
在识别出数字人对话文本或用户对话文本的时候触发此回调,详情见SDK中的TYVoiceChatMessage和TYVoiceChatMessageType类型声明。
avatar.onMessageReceived((msg: TYVoiceChatMessage) => {
if(msg.type === TYVoiceChatMessageType.speaking) {
console.log("用户的提问文本内容", msg.text)
} else {
console.log("数字人的回复文本内容", msg.text)
}
})
onPerformanceInfoTrack
数字人对话过程中性能相关的事件回调,如lm、tts的时延,rtc的音视频帧信息,详情见SDK中的TYPerformanceInfo 和 TYPerformanceInfoType 类型声明
avatar.onPerformanceInfoTrack((info: TYPerformanceInfo) => {
const { type, data } = info
console.log('性能信息:', type, data)
})
TYPerformanceInfo说明
参数名称 | 类型 | 描述 |
type | TYPerformanceInfoType | TimestampStatistics | RemoteRtcAudioStats|RemoteRtcVideoStats |
data | Object | Array | 详细的性能信息 |
当 type = TimestampStatistics时,data中包含了对话各链路的时延数据,具体如下:
字段名称 | 说明 |
firstAudioTime | 接收到输入的第一个语音片段的时间 |
asrCompleteTime | asr完成的时间 |
llmRequestTime | 发起llm请求的时间 |
llmFirstTokenTime | llm输出第一个token的时间 |
ttsFirstByteTime | tts输出第一个byte的时间 |
respondingStartTime | 数字人开始回复的时间 |
llmDelay | llm的时延,等于llmFirstTokenTime - llmRequestTime |
ttsDelay | tts的时延,等于ttsFirstByteTime - llmFirstTokenTime |
avatarDelay | 数字人画面帧的时延(云渲染),等于respondingStartTime - ttsFirstByteTime |
totalDelay | 单轮对话的总时延,等于respondingStartTime - llmRequestTime |
当 type = RemoteRtcAudioStats 或 RemoteRtcVideoStats 时,返回的是rtc的音视频帧信息,由底层依赖的aliyun-rtc-sdk透出,字段信息说明参考https://developer.mozilla.org/en-US/docs/Web/API/RTCInboundRtpStreamStats
核心API
初始化创建
createAvatar(
type: TYAvatarType,
avatarInitParams: IAvatarInitConfig,
assetParams?: IAvatarAssetsConfig,
)
参数说明
参数名称 | 类型 | 是否必传 | 描述 |
type | TYAvatarType | 是 | cloudAvatar | localAvatar,数字人类型,是云渲染还是端渲染 |
avatarInitParams | IAvatarInitConfig | 是 | 数字人对话初始化需要的必备参数 |
assetParams | IAvatarAssetsConfig | 否 | 端渲染需要的数字人资产配置 |
IAvatarInitConfig参数说明
参数名称 | 类型 | 是否必传 | 描述 |
appId | String | 是 | RTC应用id |
channel | String | 是 | RTC通道id |
timestamp | long | 是 | RTC鉴权有效的时间戳 |
token | String | 是 | RTC鉴权相关的token |
nonce | String | 否 | RTC鉴权标识 |
clientUserId | String | 是 | 客户端入会的id |
clientUserName | String | 否 | 客户端入会的name |
serverUserId | String | 是 | 服务端入会的id |
avatarUserId | String | 是 | 数字人入会的id |
sessionId | String | 是 | 数字人对话的全局sessionId,从接口获取 |
rootContainer | String | 是 | 数字人画面的页面挂载元素 |
IAvatarAssetsConfig参数说明,这是端渲染的必须字段,云渲染不需要
参数名称 | 类型 | 是否必传 | 描述 |
type | String | 否 | 数字人模型类型,目前只支持默认值AVATAR_3D_TRADITIONAL |
url | String | 是 | 资产zip链接 |
secret | String | 是 | 资产加密密钥 |
license | String | 是 | secret的解密公钥,从灵眸数字人平台获取,必须与调用pop接口获取对话数字人初始化参数时传递的license一致 |
开启对话
start(dialogParams: IDialogConfig)
IDialogConfig 参数说明
参数名称 | 类型 | 是否必传 | 描述 |
mode | TYVoiceChatMode | 是 | tap2talk|duplex 数字人语音交互类型 |
outboundSampleRate | IOutboundSampleRate | 否 | TTS音频播放采样率,默认48000 |
暂停收音/恢复收音
云端渲染数字人默认会自动开启收音。暂停收音和恢复收音功能均可以在三种语音交互模式下有效,但一般主要用于duplex双工语音交互场景。
在开启双工语音交互模式下,数字人容易受到外界环境音影响,开发者可以通过暂停收音的方法,让数字人免受外界环境音影响。
// true:暂停收音
// false(默认值):恢复收音
avatar.muteLocalMic(mute: boolean)
打断
打断方法常用于tap2talk语音交互模式下,而在duplex双工模式下,SDK内部的语音服务本身就能识别用户新的语音输入进行打断。
用户主动打断只有在数字人Responding状态下才会得到响应
avatar.interrupt()
文本问答
文本问答有两个常见使用场景,1.用户通过输入文本的形式向数字人进行提问,代替语音输入;2.用户需要指定数字人回复的内容。这两种场景的方法入参不同,详情见SDK中的 IRequestToRespondType 类型声明。
该方法仅在数字人Listening状态下才会得到响应
avatar.requestToRespond(type: IRequestToRespondType, content: string)
requestToRespond 参数说明
参数名称 | 类型 | 是否必传 | 描述 |
type | IRequestToRespondType | 是 | IRequestToRespondType.prompt:文本提问 IRequestToRespondType.transcript:文本复刻 |
content | string | 是 | 文本的具体内容 |
退出
在离开数字人页面或更换数字人角色的时候,都要调用此方法。否则会占用数字人服务并发数,页面中会存在多个数字人实例,导致异常情况出现。
avatar.exit()
错误码
应用内部错误
详细枚举值见SDK中的枚举值ApplicationErrorCode
错误码 | 错误说明 | 是否断连 | 解决方案 |
1120 | 入会成功后,连接Chat服务失败 | 是 | 检查是否退出数字人后,使用相同RTC入会信息重复入会;检查获取入会信息后,是否未及时入会 |
RTC错误
详细枚举值见SDK中的枚举值RTCErrorCode
错误码 | 错误说明 | 是否断连 | 解决方案 |
1000 | RTC初始化参数错误 | 是 | 检查SDK内部调用星尘initialize初始化的接口返回 |
1001 | RTC鉴权失败 | 是 | 检查SDK内部调用星尘initialize初始化的接口返回 |
1002 | RTC加入频道错误 | 是 | 检查SDK内部调用星尘initialize初始化的接口返回 |
1003 | RTC数据丢包 | 否 | 请联系产品运营同学进行错误排查 |
1004 | RTC 数据通道崩溃 | 是 | 请联系产品运营同学进行错误排查 |
1005 | RTC房间被销毁 | 是 | RTC房间被服务端主动销毁 |
1006 | 用户被踢出RTC房间 | 是 | 服务端将用户主动踢出房间 |
1007 | 端渲染模式下语音延迟 | 否 | 请联系产品运营同学进行错误排查 |
系统错误
详细枚举值见SDK中的枚举值SystemErrorCode
错误码 | 错误说明 | 是否断连 | 解决方案 |
1100 | 浏览器底层不支持RTC | 是 |
|
1102 | 浏览器相机未授权 | 是 | 刷新页面,授权浏览器相机采集 |
1103 | 浏览器麦克风未授权 | 是 | 刷新页面,授权浏览器麦克风采集 |
1104 | 浏览器音频推流失败 | 是 |
|
1105 | 浏览器视频推流失败 | 是 |
|
1106 | 未知错误 | 是 |
|
服务端错误
参考服务端错误码
URL协议限制
环境 | 协议 | 云渲染数字人 | 端渲染(端到端)数字人 |
线上生产环境 | HTTPS | 支持 | 支持 |
HTTP | 不支持 | 不支持 | |
本地开发环境 | http://localhost:[端口] | 支持 | 支持 |
http://[本地IP]:[端口] | 不支持 | 不支持 |
兼容性
目前SDK均不支持在原生的小程序开发上使用,但是可以尝试通过webview的方式打开自己的业务网页。开发者使用自己的业务网页时需要在域名根目录上添加小程序的校验文件,校验文件配置方案请参考各小程序平台的接入方式。
云渲染数字人和端渲染(端到端)数字人,底层均依赖阿里云RTC的能力。具体兼容性请参考:概述