# 互动数字人

互动数字人是一款基于大语言模型的在线互动数字人产品,一键式提供数字人问答服务,集成简单,便于使用。

# 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配置, 包含 typeNLP Config 的配置, 具体格式参考下方示例, typeNLP Config 的取值参考 流式语音处理文档 > LLM(大语言模型)能力对接说明 > 请求报文格式
asr Object False 直播过程用到的asr配置, 包含 typeASR Config 的配置, 具体格式参考下方示例, typeASR 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 本轮录音结束

示例如下:

  1. 开场白
{
    "service": "opening",
    "text": "你好,有什么疑问都可以向我咨询",
    "trace": "opening_1726043171122",
    "type": "answer",
    "status": "ok"
}
  1. asr识别到内容
{
	"service": "asr",
	"trace": "sense-live-nlp_d001a3ed-f53f-4d3a-a984-eac9f2939b1d_1",
	"type": "text",
	"query": "你好。",
	"index": 1,
	"status": "ok"
}
  1. asr识别结束
{
	"service": "asr",
	"trace": "sense-live-nlp_d001a3ed-f53f-4d3a-a984-eac9f2939b1d_6",
	"type": "eof",
	"query": "",
	"index": 1,
	"status": "ok"
}
  1. asr未识别到内容
{
	"service": "asr",
	"trace": "sense-live-nlp_d001a3ed-f53f-4d3a-a984-eac9f2939b1d_2",
	"type": "eof",
	"query": "",
	"index": 1,
	"status": "fail",
	"error": "query is empty"
}
  1. nlp返回答案
{
	"service": "nlp",
	"id": "i4w8fdpp7i4ihlu10zd711tk",
	"trace": "sense-live-nlp_d001a3ed-f53f-4d3a-a984-eac9f2939b1d_1",
	"type": "answer",
	"answer": "你好,有什么问题需要解答吗?",
	"index": 1,
	"status": "ok"
}
  1. 本轮录音结束
{
	"service": "record",
	"type": "eof",
	"trace": "sense-live-nlp_d001a3ed-f53f-4d3a-a984-eac9f2939b1d_1",
	"status": "ok"
}
  1. 本轮接管结束
{
	"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
    }
  },
最后更新: 2024/9/25 15:07:44