# 互動數字人
互動數字人是一款基于大語言模型的在綫互動數字人産品,一鍵式提供數字人問答服務,集成簡單,便于使用。
# 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
}
},