星塵交互數字人Android SDK標準化文檔
概述
星塵Xingchen-VideoChat-SDK是通義星塵推出的一個實時流媒體數字人Android SDK,具備低延遲、高性能、高并發、跨平臺等優勢, 結合阿里云的RTC、語音交互、渲染引擎、臉部和肢體驅動等技術,提供多種數字人解決方案,幫助企業和開發者快速集成數字人,打造數字人各種場景應用。
產品優勢
高性能低延遲
輕松集成、標準化輸出
產品能力
云端渲染數字人
云端渲染數字人是通過阿里云RTC提供視頻流訂閱,SDK在瀏覽器上拉取視頻流呈現數字人的解決方案。
云端渲染數字人具備完整的語音交互、臉部和肢體驅動能力,提供數字人打斷、多種對話模式。
接入前須知
云端渲染數字人、端測渲染(端到端)數字人的語音交互模式主要有三種模式:push2talk模式、tap2talk模式、duplex雙工模式
在push2talk模式下,用戶需要像類似釘釘發送語音消息那樣,通過發送一段音頻,來觸發語音交互
在tap2talk模式下,SDK內部的語音服務會實時識別用戶的語音輸入。但是用戶想打斷數字人,需要通過額外事件來觸發,比如點擊屏幕,或者點擊某按鈕。
在duplex雙工模式下,SDK內部的語音服務會實時識別用戶的語音輸入。數字人在說話狀態下,仍可以接受用戶的語音打斷信號。
在duplex雙工模式,容易受到外部環境音的影響導致觸發頻繁打斷,請在相對安靜的環境下使用雙工模式。
星塵官網上的ApiKey并沒有包含前綴Bearer 頭,在初始化SDK的時候,請開發者自行添加前綴頭,'Bearer ' + ApiKey, 具體可見如下示例項目中的代碼或快速集成說明。
接入方法
Android Studio接入流程
下載示例工程及SDK aar
從OSS上下載VideoChatSdkDemo壓縮包,并進行解壓
環境配置
Gradle版本 8.0
Android Gradle Plugin 8.1.3
Jdk 17
Android Studio的版本要求,只要能支持上述三項的版本均可;其中Mac開發環境下建議使用以下版本
Android Studio Iguana | 2023.2.1 Patch 1
加載SDK和依賴,video_chat_sdk-release.aar在示例項目里
// aar直接依賴
implementation files('libs/video_chat_sdk-release.aar')
// OKHttp相關依賴
implementation("com.squareup.okhttp3:okhttp:4.10.0")
implementation("com.squareup.okio:okio:3.0.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.10.0")
權限相關
SDK和數字人交互需要用到錄音權限,詳細如下:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
Release混淆處理
SDK中有部分實現類需要使用Json序列化傳輸,不能做混淆處理,上層應用編譯Release版本時,需要把以下混淆規則補充進去
-keep class com.aliyun.allinone.** {
*;
}
-keep class com.aliyun.rts.network.** {
*;
}
-keep class com.aliyun.common.** {
*;
}
-keep class com.huawei.multimedia.alivc.** {
*;
}
-keep class com.alivc.rtc.** {
*;
}
-keep class com.alivc.component.** {
*;
}
-keep class org.webrtc.** {
*;
}
-keep class com.alibaba.ty.conv.** {
*;
}
-keep class com.tongyi.video_chat_sdk.TYVideoChat {
private static final *;
}
-dontwarn com.aliyun.aio.keep.API
-dontwarn com.aliyun.aio.keep.CalledByNative
-dontwarn org.bouncycastle.jsse.BCSSLSocket
-dontwarn org.bouncycastle.jsse.BCSSLParameters
-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
-dontwarn org.conscrypt.*
-dontwarn org.openjsse.javax.net.ssl.SSLParameters
-dontwarn org.openjsse.javax.net.ssl.SSLSocket
-dontwarn org.openjsse.net.ssl.OpenJSSE
接口列表
API | 功能描述 |
init | 初始化方法,主要用來配置參數 |
start | 初始化成功后,啟動對話流程 |
interrupt | 打斷AI說話 |
startSpeech | Push2Talk模式 用戶開始說話 |
stopSpeech | Push2Talk模式 用戶結束說話 |
cancelSpeech | Push2Talk模式 用戶取消說話 |
muteLocalMic | 是否關閉本地麥克風采集 |
requestToRespond | 請求服務端回答指定問題or做TTS播放出來 |
exit | 退出 |
接口詳情
init
初始化SDK參數
/**
* 初始化方法,主要用來配置參數
* @param authParams RTC鑒權參數
* @param requestConfig 網關信息參數
* @return 初始化結果
*/
fun init(activity: Activity, authParams: TYRTCAuthParams, requestConfig: TYRequestConfig): Boolean
參數說明
參數名稱 | 類型 | 是否必傳 | 描述 |
activity | Activity | 是 | 活動實例 |
authParams | TYRTCAuthParams | 是 | 數字人配置參數 |
requestConfig | TYRequestConfig | 是 | 數字人鑒權的配置 |
其中TYRTCAuthParams為數字人配置參數,詳細信息為
參數名稱 | 類型 | 是否必傳 | 描述 |
modelId | String | 是 | 模型Id,默認xingchen-plus-v2 |
voiceId | String | 是 | 音色Id,從星塵官網獲取 |
avatarId | String | 是 | 數字人Id,從星塵官網獲取 |
mode | TYVoiceChatMode | 是 | 對話模式,默認為tap2talk |
appId | String | 否 | 租戶Id |
characterId | String | 否 | 個性id,和Content必須傳一個,從星塵官網獲取 |
content | String | 否 | 個性Content,和characterId必須傳一個 |
userId | String | 是 | 業務自定義Id,保證唯一性即可,建議使用UUID賦值 |
useRtcAec | Boolean | 否 | 是否開啟RTC內置AEC,默認開啟 |
outboundSampleRate | Int | 否 | TTS音頻采樣率,默認為48000 |
extras | Map<String, Any> | 否 | 擴展消息 |
TYVoiceChatMode表示對話模式,是枚舉類型,詳細定義為
/**
* 會話模式
*/
object TYVoiceChatMode {
const val TAP2TALK = "tap2talk" // 默認方式,一方說完,另一方可以說話
const val PUSH2TALK = "push2talk" // 用戶主動開始和結束說話
const val DUPLEX = "duplex" // 全雙工模式,可語音打斷
}
其中TYRequestConfig為數字人鑒權的配置參數,詳細信息為
參數名稱 | 類型 | 是否必傳 | 描述 |
url | String | 是 | 鑒權地址,默認為https://nlp.aliyuncs.com/v2/api/videochat/initialize |
headers | Map<String,String> | 是 | 鑒權Headers,主要為從星塵官網獲取的AppKey |
此處提供Init參考示例
注意點:Headers.Authorization中應包含"Bearer "+ ApiKey,ApiKey可以通過“星塵-我的空間-密鑰管理”獲取"
/*星塵網關示例 端上sdk可控制的參數*/
"authParams": {
// appId,當前不做校驗,鑒權信息放在Header里
"appId": "",
// 數字人Id,必傳
"avatarId": "video-chat-tianyou",
// 個性Id,當前不做校驗,characterId和content必須傳一個
"characterId": "123",
"content": "",
// 通話模式,必傳
"mode": "tap2talk",
// LLM大模型ID,必傳
"modelId": "xingchen-plus-v2",
// 數字人音頻播放采樣率
"outboundSampleRate": 48000,
// 是否開啟RTC內置的AEC,默認開啟
"useRtcAec": true,
// 用戶ID,不做權限校驗,保證唯一性即可,建議使用UUID傳入
"userId": "lxx",
// 音色Id,必傳
"voiceId": "longxiaochun"
},
"requestConfig": {
// Header中預置鑒權信息
"headers": {
// 'Bearer ' + '在此處填入ApiKey'
"Authorization": "鑒權信息,通過“星塵-我的空間-密鑰管理”獲取",
"x-fag-appcode": "aca",
"x-fag-servicename": "aca-videochat-init"
},
// 星塵網關的地址
"url": "https://nlp.aliyuncs.com/v2/api/videochat/initialize"
}
start
初始化成功后,啟動對話流程
/**
* 初始化成功后,啟動對話流程
* @param chatCallback 主回調,除了初始化過程的所有消息,都會從這里透出給上層
*/
fun start(chatCallback: IChatCallback)
參數名稱 | 類型 | 是否必須 | 描述 |
chatCallback | IChatCallback | 是 | 活動實例 |
其中IChatCallback為主回調,除了初始化接口,所有消息都會從這里透出給上層,詳細接口為
onStartResult
對話啟動結果,鑒權、客戶端加入通道成功后,會回調該消息
/**
* 對話啟動結果,鑒權、客戶端加入通道成功后,會回調該消息
*/
fun onStartResult(isSuccess: Boolean, errorInfo: TYError?)
其中TYError的格式為
參數名稱 | 類型 | 是否必須 | 描述 |
key | Int | 是 | 錯誤信息Key |
message | String | 否 | 錯誤信息Message |
onReadyToSpeech
對話準備完成,三端(客戶端/VoiceChat/Avatar)均加入通道后,會回調該消息,此時才能調用業務接口
/**
* 對話準備完成,三端(客戶端/VoiceChat/Avatar)均加入通道后,會回調該消息,此時才能調用業務接口
*/
fun onReadyToSpeech()
onGotRenderView
RTC準備好的渲染組件,需要調用者把它顯示到屏幕上
/**
* RTC準備好的渲染組件,需要調用者把它顯示到屏幕上
*/
fun onGotRenderView(renderView: SurfaceView)
onInterruptResult
主動打斷的回調,包括手動打斷和語音打斷
/**
* 主動打斷的回調,包括手動打斷和語音打斷
*/
fun onInterruptResult(isSuccess: Boolean, errorInfo: TYError?)
參數名稱 | 類型 | 是否必須 | 描述 |
isSuccess | Boolean | 是 | True or False |
errorInfo | TYError | 否 | 錯誤信息,若接口成功,該項可能為空 |
onStateChanged
數字人狀態切換
/**
* 狀態切換
*/
fun onStateChanged(state: DialogState)
其中DialogState為數字人狀態,詳細信息如下
public static enum DialogState {
DIALOG_IDLE(0),// IDLE狀態
DIALOG_LISTENING(1),// 數字人在聽
DIALOG_RESPONDING(2),// 數字人在說
DIALOG_THINKING(3);// 數字人在想
}
onVolumeChanged
音頻強度回調
/**
* 音量強度回調
* @param audioType 參考 {@link Constant.TYVolumeSourceType}
* @param audioLevel 0-100
*/
fun onVolumeChanged(audioLevel: Float, audioType: Constant.TYVolumeSourceType)
參數名稱 | 類型 | 是否必須 | 描述 |
audioLevel | Float | 是 | 音頻強度,歸一到【0,1】區間 |
audioType | TYVolumeSourceType | 是 | 音頻類型 |
其中TYVolumeSourceType為枚舉類型,詳細信息如下
/**
* 語音類型,分為本地采集和遠端TTS兩種
*/
enum class TYVolumeSourceType {
MIC, // 本地采集
PLAYER // 遠端TTS
}
onMessageReceived
對話過程中的文本詳情回調
/**
* 對話的文本詳情回調
* @param chatMessage
*/
fun onMessageReceived(chatMessage: TYVoiceChatMessage)
其中TYVoiceChatMessage為文本詳情封裝類,詳細信息如下
參數名稱 | 類型 | 是否必須 | 描述 |
chatMessageType | ChatMessageType | 是 | 消息類型 |
chatMessageText | String | 是 | 消息文本 |
isFinish | Boolean | 是 | 是否結束,用戶說/AI說每次會返回當前已識別到的全部內容,說完后,該標志位為true |
其中ChatMessageType為枚舉類型,詳細信息如下
/**
* 消息類型,分為用戶說/AI說兩種
*/
enum class ChatMessageType {
SPEAKING, // 用戶問
RESPONDING // AI回答
}
onErrorReceived
對話過程中的異常回調
/**
* 對話過程中的異常信息
* @param errorInfo 異常信息
*/
fun onErrorReceived(errorInfo: TYError)
interrupt
打斷數字人說話,異步方法,打斷結果會通過回調返回
/**
* 打斷數字人說話
*/
fun interrupt()
startSpeech
Push2Talk模式下,用戶開始說話
/**
* Push2Talk 用戶開始說話
*/
fun startSpeech()
stopSpeech
Push2Talk模式下,用戶說話完成
/**
* Push2Talk 用戶結束說話
*/
fun stopSpeech()
cancelSpeech
Push2Talk模式下,用戶取消說話
/**
* Push2Talk 用戶取消說話
*/
fun cancelSpeech()
muteLocalMic
是否關閉本地麥克風采集
/**
* 是否關閉本地麥克風采集
*/
fun muteLocalMic(mute: Boolean): Boolean
requestToRespond
請求服務端回答指定問題or做TTS播放出來
/**
* 請求服務端回答指定問題or做TTS播放出來
* @param type: transcript 表示直接把文本轉語音,prompt 表示把文本送大模型回答
* @param text:對應的文本
*/
fun requestToRespond(type: String, text: String)
exit
退出SDK,退出頁面時必須調用該方法,否則會導致實例未釋放,功能會出現異常
/**
* 銷毀實例
*/
fun exit()
附錄
錯誤碼
網關服務錯誤
云端渲染、端測渲染(端到端)數字人錯誤碼
錯誤碼 | 錯誤名稱 | 錯誤說明 | 解決方案 |
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 ' |
RTC錯誤
錯誤碼 | 錯誤說明 | 是否斷連 | 解決方案 |
1000 | RTC初始化參數錯誤 | 是 | 檢查SDK內部調用星塵initialize初始化的接口返回 |
1001 | RTC鑒權失敗 | 是 | 檢查SDK內部調用星塵initialize初始化的接口返回 |
語音服務錯誤
錯誤碼 | 錯誤說明 | 是否斷連 | 解決方案 |
40000000 | 客戶端錯誤 | 是 | 數字人執行退出操作,重新初始化數字人實例 |
40000001 | 參數不合規、檢查參數 | ||
40000002 | 指令不支持,如指令名稱錯誤 | ||
40000003 | 指令不合規,如指令格式錯誤 | ||
40000004 | 連接錯誤 | ||
40010000 | 拒絕訪問 | ||
40010001 | 未授權 | ||
40020000 | 語音輸入或輸出違規 | 否 | 繼續對話 |
40030000 | 對話靜默超時 | 是 | 數字人執行退出操作,重新初始化數字人實例 |
50000000 | 服務內部錯誤 | ||
50000001 | 服務內部錯誤 | ||
50010000 | 語音識別內部錯誤 | 否 | 繼續對話 |
50020000 | 大模型內部錯誤 | ||
50030000 | 語音合成內部錯誤 | ||
50040000 | 數字人內部錯誤 | 是 | 數字人執行退出操作,重新初始化數字人實例 |
50040001 | 數字人初始化失敗 | ||
50040002 | 數字人初始化超時 |
兼容性
本SDK最低支持Android 8.0機器,即minSdk 26