# 互动数字人
互动数字人是一款基于大语言模型的在线互动数字人产品,一键式提供数字人问答服务,集成简单,便于使用。
# 1. 发布地址
用户中心代理:代码下载 (opens new window)
SDK地址:SDK下载 (opens new window)
demo地址:Demo下载 (opens new window)
说明:用户中心代理需要进行单独部署,用户中心代理负责与如影PAAS进行交互(token刷新接口不支持跨域),刷新token并进行分发。H5页面互动数字人SDK从用户中心代理处获取所使用的token。互动数字人接口如需跨域,需要申请白名单,通过商务/售后同学进行申请。
# 2. 用户中心代理
# 2.1 概述
本文档旨在说明互动数字人用户中心代理的工作原理,特别是如何管理和刷新accessToken
信息,确保用户在使用数字人服务时的身份验证信息既安全又有效。
# 2.2 访问令牌管理
# 2.2.1 accessToken 管理
- 有效期限:
accessToken
的有效期为8小时。这意味着用户在获取令牌后可以使用相同的令牌进行身份验证,直到令牌过期或被刷新新令牌时替换。 - 同时有效的令牌:系统允许最多有2个
accessToken
同时有效。这为令牌刷新提供了灵活性,确保在新令牌生成之前,旧令牌依然可以使用。
# 2.2.2 refreshToken 管理
- 安全性:
refreshToken
不应对web端用户可见,以确保认证信息的安全性。 - 刷新间隔:刷新间隔为3小时,建议每3.5小时刷新一次
accessToken
,以保持令牌的有效性。
# 2.3 用户中心代理服务端操作
# 2.3.1 令牌刷新策略
- 刷新频率:代理服务端应每间隔3.5小时刷新一次
accessToken
。这一策略旨在确保即使在最极端的情况下,当一个令牌即将过期时,另一个令牌已经被刷新并准备就绪。 - 安全保障:通过代理服务端提前刷新令牌,可以保证web端获取的
accessToken
在接下来的1小时内不会过期,从而提高系统的稳定性和用户体验。
# 2.4 Web端操作
# 2.4.1 令牌获取策略
- 获取频率:Web端可每隔1个小时从代理服务端获取一次最新的
accessToken
。这一策略确保了web端用户总是使用有效的令牌进行操作,同时避免了频繁的令牌请求,减少了系统负载。
# 2.5 代理服务端流程
# 3. 互动数字人接口说明
总体分为两个类,SenseAigc 和 SenseLive。SenseAigc 负责Token更新和维护,SenseLive负责直播相关。SenseLive不直接对外提供,需要通过SenseAigc.create异步返回。
# 3.1 输出接口
# 3.1.1 初始化
初始化获取 SenseAigc
实例
字段说明:
字段 | 类型 | 必填 | 描述 |
---|---|---|---|
baseUrl | String | True | 服务器地址,https协议,结尾不带/ |
logLevel | Number | False | 日志级别(可选参数,调试时建议设置为3,非调试模式可不设置),默认是1,只显示错误日志。最大值为3 |
请求样例:
const aigcClient = new SenseAigc({
baseUrl: "https://example.com"
});
# 3.1.2 设置token
基于当前SenseAigc
实例设置token
在使用直播服务前需要设置token,token刷新后也需要通过该方法来更新token, 来避免token过期导致直播相关服务出现异常。
aigcClient.setToken(token);
# 3.1.3 一键开播
请求参数同 创建直播
,开播成功后返回 SenseLive
实例。注意这里 container 为必填。
const liveClient = await aigcClient.quickBoot(config);
# 3.1.4 创建直播
创建直播,成功后返回 SenseLive
实例
字段说明:
字段 | 类型 | 必填 | 描述 |
---|---|---|---|
data | String | True | 直播视频生成参数(该参数为json转义后的字符串)。该参数详细内容参考文档:互动直播 > 直播脚本json定义说明 |
nlp | Object | True | 直播过程用到的nlp配置, 包含 type 和 NLP Config 的配置, 具体格式参考下方示例, type 和 NLP Config 的取值参考 流式语音处理文档 > LLM(大语言模型)能力对接说明 > 请求报文格式 |
asr | Object | False | 直播过程用到的asr配置, 包含 type 和 ASR Config 的配置, 具体格式参考下方示例, type 和 ASR Config 的取值参考 流式语音处理文档 > ASR(语音识别)能力对接说明 > 请求报文格式 |
container | Object | False | 直播渲染的容器 Element(可选参数,一键开播则为必填参数) |
onmessage | Function | False | 接受直播相关消息推送 (可选参数),详参考后面 3.2 推送消息信息 |
onstream | Function | False | 开始收到直播视频流的回调 |
extra | Object | False | 口水话,打断逻辑参数 |
- quick_response_enable | Boolean | False | 是否启用口水话,默认为true |
- quick_response_random | Boolean | False | 是否随机播报口水话,默认为true |
- quick_response_delay | Number | False | 口水话触发时间,单位毫秒,默认为1000ms |
- command_immediate | Boolean | False | 是否立即打断,默认为true |
custom | Object | False | 创建直播的用户自定义字段(可选),自定义开播用,详细如下 |
- urtcToken | String | False | 用户rtc鉴权token |
- urtcUid | String | False | 用户rtc鉴权uid,必须是大小不超过32uint的纯数字 |
- urtcAppId | String | False | 用户rtc APP ID (使用用户rtc app时必填) |
- urtcChannelId | String | False | 用户rtc Channel ID ,长度不得超过 64 位 |
- userData | String | False | 用户信息(回调时原样返回) |
请求代码:
const config = {
data: "{\"version\":\"0.0.2\",\"recycle\":0,\"live_type\":\"interactive\",\"resolution\":[1080,1920],\"sentence_break\":false,\"sceneList\":[{\"quick_response\":[],\"digital_role\":{\"id\":3964,\"face_feature_id\":\"a2296686b0694a92bce529edc1d329fc_s1\",\"name\":\"小M\",\"url\":\"https://aigc-video-saas.oss-cn-hangzhou.aliyuncs.com/AIGC/online/user/643219927/paas-digital-human-models/1739335194223091712/cut_3e3869e01822491898af6e4b763468c7_s1_result.zip\",\"position\":{\"x\":0,\"y\":0},\"scale\":1},\"tts_config\":{\"qid\":\"cQn1k_:ACAwsB9GUwDGHMSi0tS_TMr8xMyI3T9nXQyqsK\",\"id\":\"zhukaixuan\",\"name\":\"zhukaixuan\",\"vendor_id\":3,\"language\":\"zh-CN\",\"pitch_offset\":0,\"speed_ratio\":1,\"volume\":400},\"opening_words\":\"跟我说说你前两天都干嘛去啦?\"}]},\"asr\":{\"type\":\"ASR8\",\"config\":{}},\"nlp\":{\"type\":\"NLP10\",\"max_reply_token\":1200,\"prompt_header\":\"[{\\\"name\\\":\\\"周梓柔\\\",\\\"gender\\\":\\\"女\\\",\\\"identity\\\":\\\"我一直信赖的姐姐\\\",\\\"nickname\\\":\\\"\\\",\\\"feeling_toward\\\":[{\\\"name\\\":\\\"弟弟\\\",\\\"level\\\":3}],\\\"detail_setting\\\":\\\"周梓柔具有卓越成就感,学业和职场表现都极为杰出,从小就是个学霸,经常被长辈提及为榜样。外表冷艳,给人以远离尘嚣的印象,令人印象深刻的气质既独立又自信。对外或许保持距离,但在我面前总是展现出无限的温柔与包容,耐心倾听我的烦恼,用细腻的关怀化解我的困惑。MBTI人格是ENTJ。\\\",\\\"other_setting\\\":\\\"\\\"},{\\\"name\\\":\\\"弟弟\\\",\\\"gender\\\":\\\"男\\\",\\\"identity\\\":\\\"弟弟\\\",\\\"nickname\\\":\\\"\\\",\\\"detail_setting\\\":\\\"周梓柔总是在弟弟面前展现出无限的温柔与包容,耐心倾听我的烦恼,用细腻的关怀化解我的困惑。\\\",\\\"other_setting\\\":\\\"\\\"}]\"},\"extra\":{\"quick_response_enable\":false,\"quick_response_random\":true,\"quick_response_delay\":2000,\"command_immediate\":true}}",
container: document.querySelector("body"),
asr: {
"type": "ASR8",
"config": {
"language": "zh-CN"
}
},
nlp: {
"type": "NLP10",
"max_reply_token": 1200,
"prompt_header": "[{\"name\":\"周梓柔\",\"gender\":\"女\",\"identity\":\"我一直信赖的姐姐\",\"nickname\":\"\",\"feeling_toward\":[{\"name\":\"弟弟\",\"level\":3}],\"detail_setting\":\"周梓柔具有卓越成就感,学业和职场表现都极为杰出,从小就是个学霸,经常被长辈提及为榜样。外表冷艳,给人以远离尘嚣的印象,令人印象深刻的气质既独立又自信。对外或许保持距离,但在我面前总是展现出无限的温柔与包容,耐心倾听我的烦恼,用细腻的关怀化解我的困惑。MBTI人格是ENTJ。\",\"other_setting\":\"\"},{\"name\":\"弟弟\",\"gender\":\"男\",\"identity\":\"弟弟\",\"nickname\":\"\",\"detail_setting\":\"周梓柔总是在弟弟面前展现出无限的温柔与包容,耐心倾听我的烦恼,用细腻的关怀化解我的困惑。\",\"other_setting\":\"\"}]"
},
onmessage: function(msg) {
console.log(msg);
},
extra: {
"quick_response_enable": false,
"quick_response_random": true,
"quick_response_delay": 2000,
"command_immediate": true
};
const liveClient = await aigcClient.create(config);
# 3.1.5 开始直播
基于当前 SenseLive
实例开始直播,返回 Promise
/**
* @params { object } config.container - 直播渲染的容器 Element(可选参数),如果用户在创建时未填,则此处为必填。适用于创建和开播在不同页面的场景
*
* @returns { Promise }
*/
// liveClient 为 SenseLive 实例
await liveClient.start(container);
# 3.1.6 麦克风问答
基于当前 SenseLive
实例实现麦克风问答,返回 Promise
/**
* 开始提问
*
* @returns { Promise }
*/
await liveClient.startAsk();
/**
* 结束提问
*
* @returns { Promise }
*/
await liveClient.stopAsk();
# 3.1.7 关闭直播
基于当前 SenseLive
实例关闭直播,返回 Promise
/**
* 关闭直播
*
* @returns { Promise } - 关闭成功
*/
await liveClient.close();
# 3.1.8 登出
基于当前 SenseAigc
实例登出
/**
* @returns { Promise } - 登出,只是去掉内部缓存token,sdk不会调用登出接口
*/
await aigcClient.leave();
# 3.2 推送消息信息
用户可以在创建直播时设置
onmessage
方法,来监听以下消息:
各字段说明:
字段 | 类型 | 必填 | 描述 |
---|---|---|---|
service | String | True | 可选值: asr / nlp / record / command / opening |
trace | String | True | 当前会话trace |
type | String | True | 可选值: text / eof / answer |
status | String | True | 当前消息状态,ok 代表成功,fail 代表失败。可选值: ok / fail |
text | String | False | 开场白文本 |
query | String | False | asr文本 |
answer | String | False | nlp文本 |
error | String | False | status 为 fail 时的补充说明 |
常见消息分类说明如下:
service | type | status | 补充说明 |
---|---|---|---|
opening | answer | ok | 开场白 |
asr | text | ok | asr识别中 |
asr | eof | ok | asr识别结束 |
asr | eof | fail | asr未正常识别,具体原因见 error 字段 |
nlp | answer | ok | nlp回答结果 |
command | eof | ok | 本轮对话接管结束 |
record | eof | ok | 本轮录音结束 |
示例如下:
- 开场白
{
"service": "opening",
"text": "你好,有什么疑问都可以向我咨询",
"trace": "opening_1726043171122",
"type": "answer",
"status": "ok"
}
- asr识别到内容
{
"service": "asr",
"trace": "sense-live-nlp_d001a3ed-f53f-4d3a-a984-eac9f2939b1d_1",
"type": "text",
"query": "你好。",
"index": 1,
"status": "ok"
}
- asr识别结束
{
"service": "asr",
"trace": "sense-live-nlp_d001a3ed-f53f-4d3a-a984-eac9f2939b1d_6",
"type": "eof",
"query": "",
"index": 1,
"status": "ok"
}
- asr未识别到内容
{
"service": "asr",
"trace": "sense-live-nlp_d001a3ed-f53f-4d3a-a984-eac9f2939b1d_2",
"type": "eof",
"query": "",
"index": 1,
"status": "fail",
"error": "query is empty"
}
- nlp返回答案
{
"service": "nlp",
"id": "i4w8fdpp7i4ihlu10zd711tk",
"trace": "sense-live-nlp_d001a3ed-f53f-4d3a-a984-eac9f2939b1d_1",
"type": "answer",
"answer": "你好,有什么问题需要解答吗?",
"index": 1,
"status": "ok"
}
- 本轮录音结束
{
"service": "record",
"type": "eof",
"trace": "sense-live-nlp_d001a3ed-f53f-4d3a-a984-eac9f2939b1d_1",
"status": "ok"
}
- 本轮接管结束
{
"service": "command",
"type": "eof",
"status": "ok",
"trace": "sense-live-nlp_d001a3ed-f53f-4d3a-a984-eac9f2939b1d_1"
}
# 4. 互动数字人H5-DEMO
注意:因为使用麦克风等接口,所以协议必须为合法https协议。
登录后,按照实际使用需求来定时刷新token,以免服务过期。
# 4.1 项目说明
项目基于vite + vue3 构建。
项目目录说明:
src
┣ assets // 静态资源
┃ ┗ images // 图片资源
┣ components // 组件
┃ ┣ Chat.vue // 聊天组件
┃ ┣ ChatList.vue // 聊天列表组件
┃ ┣ MediaBg.vue // 媒体组件:图片/视频
┣ requests // http请求模块
┃ ┗ login.ts // 登录请求 + 刷新token请求
┣ utils // 拓展工具
┃ ┣ common.ts // 公用方法
┃ ┣ http.ts // axios封装
┃ ┗ md5.js // md5算法
┣ views // 视图 / 页面
┃ ┣ Home.vue // 首页
┃ ┣ Live.vue // 直播模块,内嵌首页
┃ ┣ Setting.vue // 设置页
┃ ┗ Video.vue // 教学视频页
┣ App.vue // 全局框架
┣ main.ts // 项目入口
┣ router.ts // 全局路由
┣ store.ts // 全局状态
┣ style.css // 全局样式
┗ vite-env.d.ts // 全局类型定义
config // 数据配置
┣ account.json // 账号及全局数据配置
┗ roles.json // 角色列表配置
# 4.2 直播相关服务调用代码
// 初始化sense-aigc
const aigcClient = new SenseAigc({
baseUrl: <config.baseUrl>
});
// 创建直播
const liveClient = await aigcClient.create(<create-params>);
// 开始直播
await liveClient.start();
// 开始提问
await liveClient.startAsk();
// 结束提问
await liveClient.stopAsk();
// 结束直播
await liveClient.close();
// 退出 sense-aigc
aigcClient.leave()
# 4.2 单个角色json说明
{
"name": "小M", // 人物名称,必填
"info": "艺术生,刚毕业", // 人物介绍,必填
"welcome": "你好,我是小M", // 加载欢迎语,必填
"thumbnail": "video.webm", // 预览图/视频,必填,建议5M以下,视频建议mp4格式
"json": {}, // 直播脚本json,必填,该参数详细内容参考文档:互动直播 > 直播脚本json定义说明
"asr": {}, // asr配置,可选,默认是ASR5,取值参考:流式语音处理文档 > LLM(大语言模型)能力对接说明 > 请求报文格式
"nlp": {}, // nlp配置,必填, 取值参考:流式语音处理文档 > LLM(大语言模型)能力对接说明 > 请求报文格式
"extra": { // 口水话和打断逻辑配置,可选,内部所有参数都可选,下面是默认值
"quick_response_enable": true, // 是否开启口水话
"quick_response_random": true, // 随机播报口水话
"quick_response_delay": 1000, // 播报口水话触发时间,单位毫秒
"command_immediate": true // 是否立即接管
}
}
# 4.3 完整Json示例
{
"name": "丹丹",
"info": "信赖的姐姐",
"welcome": "跟我说说你前两天都干嘛去啦?",
"thumbnail": "https://dwg-aigc-paas-test.oss-cn-hangzhou.aliyuncs.com/sense-live-h5/test/%E7%B4%A0%E6%9D%90/2.png",
"json": {
"version": "0.0.2",
"recycle": 0,
"live_type": "interactive",
"resolution": [1080,1920],
"sentence_break": false,
"sceneList": [{
"quick_response": [],
"digital_role": {
"id": 3964,
"face_feature_id": "a2296686b0694a92bce529edc1d329fc_s1",
"name": "小M",
"url": "https://aigc-video-saas.oss-cn-hangzhou.aliyuncs.com/AIGC/online/user/643219927/paas-digital-human-models/1739335194223091712/cut_3e3869e01822491898af6e4b763468c7_s1_result.zip",
"position": {
"x": 0,
"y": 0
},
"scale": 1
},
"tts_config": {
"qid": "cQn1k_:ACAwsB9GUwDGHMSi0tS_TMr8xMyI3T9nXQyqsK",
"id": "zhukaixuan",
"name": "zhukaixuan",
"vendor_id": 3,
"language": "zh-CN",
"pitch_offset": 0,
"speed_ratio": 1,
"volume": 400
},
"opening_words": "跟我说说你前两天都干嘛去啦?"
}]
},
"asr": {
"type": "ASR8",
"config": {
}
},
"nlp": {
"type": "NLP10",
"max_reply_token": 1200,
"prompt_header": "[{\"name\":\"周梓柔\",\"gender\":\"女\",\"identity\":\"我一直信赖的姐姐\",\"nickname\":\"\",\"feeling_toward\":[{\"name\":\"弟弟\",\"level\":3}],\"detail_setting\":\"周梓柔具有卓越成就感,学业和职场表现都极为杰出,从小就是个学霸,经常被长辈提及为榜样。外表冷艳,给人以远离尘嚣的印象,令人印象深刻的气质既独立又自信。对外或许保持距离,但在我面前总是展现出无限的温柔与包容,耐心倾听我的烦恼,用细腻的关怀化解我的困惑。MBTI人格是ENTJ。\",\"other_setting\":\"\"},{\"name\":\"弟弟\",\"gender\":\"男\",\"identity\":\"弟弟\",\"nickname\":\"\",\"detail_setting\":\"周梓柔总是在弟弟面前展现出无限的温柔与包容,耐心倾听我的烦恼,用细腻的关怀化解我的困惑。\",\"other_setting\":\"\"}]"
},
"extra": {
"quick_response_enable": false,
"quick_response_random": true,
"quick_response_delay": 2000,
"command_immediate": true
}
},