星塵交互數字人iOS SDK標準化文檔
概述
星塵videochat_ios_sdk是通義星塵推出的一個實時流媒體數字人iOS SDK(framework),具備低延遲、高性能、高并發、跨平臺等優勢, 結合阿里云的RTC、語音交互、渲染引擎、臉部和肢體驅動等技術,提供多種數字人解決方案,幫助企業和開發者快速集成數字人,打造數字人各種場景應用。
產品優勢
高性能低延遲
輕松集成、標準化輸出
多種數字人解決方案提供支持
產品能力
云端渲染數字人
云端渲染數字人是通過阿里云RTC提供視頻流訂閱,SDK在瀏覽器上拉取視頻流呈現數字人的解決方案。
云端渲染數字人具備完整的語音交互、臉部和肢體驅動能力,提供數字人打斷、多種對話模式。
接入前須知
受瀏覽器底層WebSocket、底層錄音權限、WebRTC等限制,本地開發環境僅支持使用localhost運行。生產環境上頁面協議請使用HTTPS,否則會出現錄音權限獲取失敗、拉流播放失敗等問題。
云端渲染數字人、端測渲染(端到端)數字人的語音交互模式主要有三種模式:push2talk模式、tap2talk模式、duplex雙工模式
在push2talk模式下,用戶需要像類似釘釘發送語音消息那樣,通過發送一段音頻,來觸發語音交互
在tap2talk模式下,SDK內部的語音服務會實時識別用戶的語音輸入。但是用戶想打斷數字人,需要通過額外事件來觸發,比如點擊屏幕,或者點擊某按鈕。
在duplex雙工模式下,SDK內部的語音服務會實時識別用戶的語音輸入。數字人在說話狀態下,仍可以接受用戶的語音打斷信號。
在duplex雙工模式,容易受到外部環境音的影響導致觸發頻繁打斷,請在相對安靜的環境下使用雙工模式。
星塵官網上的ApiKey并沒有包含前綴Bearer 頭,在初始化SDK的時候,請開發者自行添加前綴頭,'Bearer ' + ApiKey, 具體可見如下示例項目中的代碼或快速集成說明。
接入方法
Xcode framework集成
環境配置
Xcode 14及以上
加載SDK和依賴
在Xcode新建項目,將以下frameworks導入項目工程中 videochat_ios_sdk.framework AliVCSDK_ARTC.framework
alivcffmpeg.framework
權限相關
SDK和數字人交互需要用到錄音權限,在Info.plist文件中增加如下代碼:
<key>NSMicrophoneUsageDescription</key>
<string>{使用麥克風的原因描述}</string>
云端渲染數字人
示例項目
本示例項目提供了信息錄入的界面,包含數字人生成和退出的入口,并且支持push2talk、tap2talk、duplex三種語音交互模式下切換。
下載
從OSS上下載videochat_ios_demo_2biz 項目壓縮包,并進行解壓。
文件結構
解壓后的示例項目文件架構如下:
videochat_ios_demo
├─videochat_ios_demo.xcodeproj
├─videochat_ios_sdk.framework
├─AliVCSDK_ARTC.framework
├─alivcffmpeg.framework
├─SnapKit.framework
├─videochat_ios_demo
| ├─ConfigViewController.swift
| ├─VideoChatViewController.swift
| ├─SceneDelegate.swift
| └ ...
安裝依賴并運行示例項目
在解壓后的文件夾中雙擊打開videochat_ios_demo.xcodeproj,默認在Xcode中加載。
Xode登錄Apple賬號,在選擇對應的Team,并且勾選Automatically Manage Signing.
設置完成后,點擊左上角?運行項目。
在頁面上錄入對應的信息,然后點擊 生成數字人 ,即可看到數字人交互頁面。
請注意:云端渲染數字人的數字人資產ID和數字人模型ID請保持一致,均為數字人資產ID
首次啟動示例項目并生成數字人后,語音交互模式默認以duplex雙工模式的啟動。
如果想要切換模式,點擊頁面頂部進行切換模式。每次切換模式后,都要重新生成數字人。
快速集成
新建云端渲染數字人實例
云端渲染數字人支持三種語音交互模式,分別是duplex雙工、tap2talk、push2talk。這三種語音交互模式的取值可以通過SDK中的TYVoiceChatMode枚舉值獲取。
請注意:云端渲染數字人的數字人資產ID和數字人模型ID請保持一致,均為數字人資產ID
self.avatar =
TYVideoChat(enableVolumeDetection: true,
params: TYRTCAuthParams(type: .Avatar, // 云渲染交互模式
modelId: 'xingchen-plus-v2', //大模型Id,可默認
voiceId: "", // 輸入從星塵官網上獲取的語音ID
avatarId: "", // 輸入從星塵官網上獲取的數字人資產I
mode: .duplex, // 設置語音交互模式, 可選duplex,tap2talk, push2talk
appId: "", // 預留字段,先臨時寫死123
characterId: "", // 輸入從星塵官網上獲取的角色ID
userId: "", //用戶Id,建議使用唯一值
extras: [
// 開發者一般不需要設置此配置,設置后會影響到SDK內部的LLM語音模型
'parameters': [
// LLM語言模型的回復多樣性
'topP': 0.1,
// LLM語言模型的回復發散度
'temperature': 1.0,
]
]),
config: TYRequestConfig(headers: [
'Authorization': 'Bearer ' + ApiKey
], url: "https://nlp.aliyuncs.com/v2/api/videochat/initialize"))
設置RTC視頻流容器
在數字人的ViewController里面創建視頻流容器,然后在viewDidLoad方法內設置綁定RTC視頻流。
let videoView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(videoView)
videoView.frame = view.bounds
// 設置綁定RTC視頻流View
self.avatar.setupRTCView(videoView)
}
綁定回調
并不是所有回調都需要綁定,建議開發者根據業務開發需求進行綁定即可。
onFirstFrameReceived
在數字人首頁畫面出現的時候觸發此回調
avatar.onFirstFrameReceived = {
print('數字人渲染完畢')
}
onReadyToSpeech
在數字人可以開始進行語音交互的時候觸發此回調
avatar.onReadyToSpeech = {
print('可以進行語音交互了')
}
onErrorReceived
在數字人內部出現錯誤的時候觸發此回調, 更多錯誤碼詳情見此教程的錯誤碼列表
avatar.onErrorReceived = { err in
print('數字人內部發生錯誤:' + err.code + ' ' + err.message)
}
onStateChanged
在數字人內部狀態發生變化的時候觸發此回調,詳情見SDK中的TYVoiceChatState類型聲明。
云端數字人擁有三種狀態:Listening(傾聽)、Thinking(思考中)、Responding(反饋中)
// 數字人狀態
avatar.onStateChanged = { tyState in
print('當前數字人狀態' + tyState)
}
onVolumeChanged
在數字人或者用戶說話音量發生變化的時候觸發此回調。回調返回的數據中,source為TYVolumeSourceType.mic的數據表示用戶自己說話的音量,source為TYVolumeSourceType.player的數據表示數字人的音量。詳情見SDK中的TYVolume和TYVolumeSourceType類型聲明。
請注意:SDK已將數字人的音量做了歸一化處理,數值大小范圍為0~1
avatar.onVolumeChanged = { data in
if(data.source == TYVolumeSourceType.mic) {
print('用戶音量:' + data.volume)
} else {
print('數字人音量:' + data.volume)
}
}
onMessageReceived
在識別出數字人對話文本或用戶對話文本的時候觸發此回調,詳情見SDK中的TYVoiceChatMessage和TYVoiceChatMessageType類型聲明。
avatar.onMessageReceived = { msg in
if(msg.type == TYVoiceChatMessageType.speaking) {
print("用戶的對話文本內容", msg.text)
} else {
print("數字人的反饋文本內容", msg.text)
}
}
初始化
云端渲染數字人底層通過阿里云RTC進行音視頻流的傳輸,所以需要掛載在一個video元素上。
avatar.start()
暫停收音/恢復收音
云端渲染數字人默認會自動開啟收音。暫停收音和恢復收音功能均可以在三種語音交互模式下有效,但一般主要用于duplex雙工語音交互場景。
在開啟雙工語音交互模式下,數字人容易受到外界環境音影響,開發者可以通過暫停收音的方法,讓數字人免受外界環境音影響。
// true:暫停收音
// false(默認值):恢復收音
avatar.muteLocalMic(mute: Bool)
發送語音和結束語音
發送語音和結束語音主要用于push2talk模式下,用戶調用API,告知SDK開始發送語音和結束語音。
// 發送語音
avatar.sendSpeech()
// 結束語音
avatar.stopSpeech()
打斷
打斷方法常用于push2talk和tap2talk語音交互模式下,而在雙工模式下,SDK內部的語音服務本身就能識別用戶新的語音輸入進行打斷。
avatar.interrupt()
指定應答內容
在默認情況下,用戶輸入的語音如果出現違規的情況下, 數字人是不會做出反饋的。指定應答內容可以讓數字人使用傳入的文本作為回復。
請注意:如果強制反饋的文本也出現違規的情況,那么數字人同樣不會做出反饋。TYRequestToRespondType.prompt表示把文本送到SDK內部的LLM服務進行回答TYRequestToRespondType.transcript表示把文本直接轉成語音
avatar.requestToRespond(type: TYRequestToRespondType, text: String)
退出
在離開數字人頁面或更換數字人角色的時候,都要調用此方法。否則頁面中會存在多個數字人實例,導致互相影響。
avatar.exit()
附錄
接口說明
SDK提供了標準的TypeScript Api類型聲明文件,詳情可以在安裝依賴包中的xingchenAvatar.d.ts文件中進行查看。
網頁版API文檔,請參考Xingchen-Avatar-Sdk API
錯誤碼
網關服務錯誤
云端渲染、端測渲染(端到端)數字人錯誤碼
錯誤碼 | 錯誤名稱 | 錯誤說明 | 解決方案 |
400 | aca.error.invalid.param | 初始化參數錯誤,參考返回的錯誤信息 | 重新在星塵官網確認相關參數 |
401 | 用戶未認證 | ApiKey錯誤 | 1、在星塵官網上確認自己的apiKey是否正確 2、確認SDK初始化的ApiKey有沒有加'Bearer ' |
465 | aca.error.not.paas.whitelist | 沒有開通白名單 | 聯系郵箱tongyixingchen@service.aliyun.com |
403 | aca.error.avatar.permission.error | 沒有形象的使用權限 | 請確認賬號是否擁有形象使用權限 |
403 | aca.error.voice.permission.error | 沒有聲音的使用權限 | 請確認賬號是否擁有聲音使用權限 |
422 | aca.error.videochat.initialize.limit | 數字人資源不足 | 請聯系產品運營同學進行錯誤排查 |
431 | aca.error.videochat.quota.exceeded | 超過運行狀態數限制 | 同一個賬號同時開啟的會話有數量限制,需要更多請聯系產品運營同學 |
500 | aca.error.internal.exception | 內部服務錯誤 | 請聯系產品運營同學進行錯誤排查 |
501 | aca.error.gateway.exception | 服務端驗證ApiKey失敗 | 1、在星塵官網上確認自己的ApiKey是否正確 2、確認SDK初始化的ApiKey有沒有加 'Bearer ' |
600 | 獲取數字人資產失敗 | 請聯系產品運營同學進行錯誤排查 |
RTC錯誤
錯誤碼 | 錯誤說明 | 是否斷連 | 解決方案 |
1000 | RTC初始化參數錯誤 | 是 | 檢查SDK內部調用星塵initialize初始化的接口返回 |
1001 | RTC鑒權失敗 | 是 | 檢查SDK內部調用星塵initialize初始化的接口返回 |
1002 | RTC加入頻道錯誤 | 是 | 檢查SDK內部調用星塵initialize初始化的接口返回 |
1003 | RTC數據丟包 | 否 | 請聯系產品運營同學進行錯誤排查 |
1004 | RTC 數據通道崩潰 | 是 | 請聯系產品運營同學進行錯誤排查 |
WebSocket錯誤
錯誤碼 | 錯誤說明 | 是否斷連 | 解決方案 |
400 | 連接初始化參數不對 | 是 | 重新校對單獨輸出數字人的初始化參數 |
500 | 服務內部錯誤 | 是 | 數字人執行退出操作,重新初始化數字人實例 |
700 | websocket連接斷開 | 是 | 數字人執行退出操作,重新初始化數字人實例 |
語音服務錯誤
錯誤碼 | 錯誤說明 | 是否斷連 | 解決方案 |
40000000 | 客戶端錯誤 | 是 | 數字人執行退出操作,重新初始化數字人實例 |
40000001 | 參數不合規、檢查參數 | ||
40000002 | 指令不支持,如指令名稱錯誤 | ||
40000003 | 指令不合規,如指令格式錯誤 | ||
40000004 | 連接錯誤 | ||
40010000 | 拒絕訪問 | ||
40010001 | 未授權 | ||
40020000 | 語音輸入或輸出違規 | 否 | 繼續對話 |
40030000 | 對話靜默超時 | 是 | 數字人執行退出操作,重新初始化數字人實例 |
50000000 | 服務內部錯誤 | ||
50000001 | 服務內部錯誤 | ||
50010000 | 語音識別內部錯誤 | 否 | 繼續對話 |
50020000 | 大模型內部錯誤 | ||
50030000 | 語音合成內部錯誤 | ||
50040000 | 數字人內部錯誤 | 是 | 數字人執行退出操作,重新初始化數字人實例 |
50040001 | 數字人初始化失敗 | ||
50040002 | 數字人初始化超時 |
兼容性
支持系統iOS14及以上手機,建議內存至少4GB保證性能,暫不支持模擬器上測試。
云端渲染數字人底層均依賴阿里云RTC的能力。具體兼容性請參考:iOS SDK