Android使用指南
本文將介紹如何將AICallKit SDK集成到您的Android應(yīng)用中。
環(huán)境要求
Android Studio 插件版本4.1.3
Gradle 7.0.2
Android Studio自帶JDK11
集成SDK
在項(xiàng)目級(jí)build.gradle項(xiàng)目文件中添加阿里云Maven倉(cāng)庫(kù)。
allprojects { repositories { google() jcenter() maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/public' } } }
在相應(yīng)build.gradle項(xiàng)目文件下,加入引入ARTCAICallKit依賴項(xiàng)。
dependencies { implementation 'com.aliyun.aio:AliVCSDK_ARTC:x.x.x' //修改x.x.x為你工程適配的版本 implementation 'com.aliyun.auikits.android:ARTCAICallKit:1.5.0' }
說(shuō)明ARTC SDK版本請(qǐng)到官網(wǎng)獲取最新適配版本號(hào)。
SDK使用示例
ARTCAICallEngine mARTCAICallEngine = null;
// 創(chuàng)建engine實(shí)例
void initEngine(Context context, String userId) {
// 初始化
// context -> Android Context
// userId -> 進(jìn)入rtc頻道的用戶id
mARTCAICallEngine = new ARTCAICallDepositEngineImpl(context, userId);
}
// 設(shè)置回調(diào)
void initCallback() {
mARTCAICallEngine.setEngineCallback(mCallEngineCallbackWrapper);
}
// 啟動(dòng)智能體后,開始通話
void call() {
// 設(shè)置engine的啟動(dòng)參數(shù)
ARTCAICallEngine.ARTCAICallConfig artcaiCallConfig = new ARTCAICallEngine.ARTCAICallConfig();
// 如果有臨時(shí)的智能體ID,可以配置
artcaiCallConfig.aiAgentId = aiAgentId;
mARTCAICallEngine.init(artcaiCallConfig);
// 指定智能體的類型:純語(yǔ)音、數(shù)字人、視覺理解
ARTCAICallEngine.ARTCAICallAgentType aiAgentType = VoiceAgent;
mARTCAICallEngine.setAiAgentType(aiAgentType);
// 如果是數(shù)字人類型,則需要配置數(shù)字人顯示的視圖容器
if (aiAgentType == AvatarAgent) {
ViewGroup avatarlayer;
mARTCAICallEngine.setAvatarAgentView(
avatarlayer,
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT)
);
}
// 如果是視覺理解類型,則需要配置本地視頻預(yù)覽顯示的視圖容器
else if (aiAgentType == VisionAgent) {
ViewGroup previewLayer;
mARTCAICallEngine.setVisionPreviewView(previewLayer,
new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT)
);
}
// 進(jìn)入頻道
String aIAgentInstanceId = “XXX”;
String rtcAuthToken = "XXX";
String aIAgentUserId = "XXX";
String channelId = "XXX";
mARTCAICallEngine.call(rtcAuthToken, aIAgentInstanceId,
aIAgentUserId, channelId);
}
// 結(jié)束通話
void handup() {
mARTCAICallEngine.handup();
}
// 其他功能調(diào)用示例,請(qǐng)參考API說(shuō)明
// 回調(diào)處理(僅示例不分核心的回調(diào)操作)
ARTCAICallEngine.IARTCAICallEngineCallback mCallEngineCallbackWrapper = new ARTCAICallEngine.IARTCAICallEngineCallback() {
@Override
public void onErrorOccurs(ARTCAICallEngine.AICallErrorCode errorCode) {
// 發(fā)生了錯(cuò)誤,結(jié)束通話
mARTCAICallEngine.handup();
}
@Override
public void onCallBegin() {
// 通話開始(入會(huì))
}
@Override
public void onCallEnd() {
// 通話結(jié)束(離會(huì))
}
@Override
public void onAICallEngineRobotStateChanged(ARTCAICallEngine.ARTCAICallRobotState oldRobotState, ARTCAICallEngine.ARTCAICallRobotState newRobotState) {
// 機(jī)器人狀態(tài)同步
}
@Override
public void onUserSpeaking(boolean isSpeaking) {
// 用戶說(shuō)話回調(diào)
}
@Override
public void onUserAsrSubtitleNotify(String text, boolean isSentenceEnd, int sentenceId) {
// 同步ASR識(shí)別用戶的話
}
@Override
public void onAIAgentSubtitleNotify(String text, boolean end, int userAsrSentenceId) {
// 同步智能體回應(yīng)的話
}
@Override
public void onNetworkStatusChanged(String uid, ARTCAICallEngine.ARTCAICallNetworkQuality quality) {
// 網(wǎng)絡(luò)狀態(tài)回調(diào)
}
@Override
public void onVoiceVolumeChanged(String uid, int volume) {
// 音量變化
}
@Override
public void onVoiceIdChanged(String voiceId) {
// 當(dāng)前通話的音色發(fā)生了改變
}
@Override
public void onVoiceInterrupted(boolean enable) {
// 當(dāng)前通話的語(yǔ)音打斷設(shè)置改變
}
@Override
public void onAgentVideoAvailable(boolean available) {
// 智能體視頻是否可用(推流)
}
@Override
public void onAgentAudioAvailable(boolean available) {
// 智能體音頻是否可用(推流)
}
@Override
public void onAgentAvatarFirstFrameDrawn() {
// 數(shù)字人首視頻幀渲染
}
@Override
public void onUserOnLine(String uid) {
// 用戶上線回調(diào)
}
};
API說(shuō)明
API概覽
類/協(xié)議 | API | 說(shuō)明 |
ARTCAICallEngine 引擎接口定義 | 初始化 | |
設(shè)置智能體類型 | ||
創(chuàng)建&開始通話 | ||
掛斷 | ||
切換麥克風(fēng)狀態(tài) | ||
打斷機(jī)器人說(shuō)話 | ||
開啟/關(guān)閉智能打斷 | ||
開啟/關(guān)閉揚(yáng)聲器 | ||
開啟/關(guān)閉對(duì)講機(jī)模式 | ||
對(duì)講機(jī)模式是否開啟 | ||
對(duì)講機(jī)模式:開始講話 | ||
對(duì)講機(jī)模式:結(jié)束講話 | ||
對(duì)講機(jī)模式:取消這次通話 | ||
切換音色 | ||
獲取正在使用的音色 | ||
注冊(cè)回調(diào) | ||
是否關(guān)閉麥克風(fēng) | ||
揚(yáng)聲器是否開啟 | ||
智能打斷是否開啟 | ||
設(shè)置數(shù)字人視圖載體 | ||
設(shè)置本地視頻預(yù)覽視圖載體 | ||
關(guān)閉/取消關(guān)閉攝像頭 | ||
攝像頭是否關(guān)閉 | ||
切換前后攝像頭 | ||
獲取RTC引擎實(shí)例 | ||
獲取官方協(xié)議實(shí)現(xiàn) | ||
IARTCAICallEngineCallback 引擎回調(diào)事件 | 發(fā)生了錯(cuò)誤 | |
通話開始 | ||
通話結(jié)束 | ||
機(jī)器人狀態(tài)同步 | ||
用戶說(shuō)話回調(diào) | ||
同步ASR識(shí)別用戶的話 | ||
同步智能體回應(yīng)的話 | ||
網(wǎng)絡(luò)狀態(tài)回調(diào) | ||
音量變化 | ||
onVoiceIdChanged | ||
當(dāng)前通話的語(yǔ)音打斷設(shè)置改變 | ||
智能體視頻是否可用(推流) | ||
智能體音頻是否可用(推流) | ||
數(shù)字人首視頻幀渲染 | ||
用戶上線回調(diào) | ||
當(dāng)前智能體即將離開(結(jié)束當(dāng)前通話) | ||
當(dāng)真人即將接管當(dāng)前智能體 | ||
當(dāng)真人接管已經(jīng)接通 | ||
智能體自定義消息 | ||
IARTCAICallService類 | 請(qǐng)求啟動(dòng)分享的智能體通話 | |
ARTCAIAgentUtil類 | 解析分享智能體的信息 | |
解析智能體啟動(dòng)的響應(yīng)信息 |
ARTCAICallEngine詳情
init
初始化
/**
* 初始化
* @param config 初始化配置
*/
public abstract void init(ARTCAICallConfig config);
setAICallAgentType
設(shè)置智能體類型
/**
* 設(shè)置智能體類型
* @param aiAgentType
*/
public abstract void setAICallAgentType(ARTCAICallAgentType aiAgentType);
call
創(chuàng)建&開始通話
/**
* 創(chuàng)建&開始通話
*/
public abstract void call(String rtcToken, String aiAgentInstanceId, String aiAgentUserId, String channelId);
handup
掛斷
/**
* 掛斷
*/
public abstract void handup();
switchMicrophone
切換麥克風(fēng)狀態(tài)
/**
* 切換麥克風(fēng)狀態(tài)
* @param on
*/
public abstract void switchMicrophone(boolean on);
interruptSpeaking
打斷機(jī)器人說(shuō)話
/**
* 打斷機(jī)器人說(shuō)話
*/
public abstract boolean interruptSpeaking();
enableVoiceInterrupt
開啟/關(guān)閉智能打斷
/**
* 開啟/關(guān)閉智能打斷
*/
public abstract boolean enableVoiceInterrupt(boolean enable);
enableSpeaker
開啟/關(guān)閉揚(yáng)聲器
/**
* 開啟/關(guān)閉揚(yáng)聲器
*/
public abstract boolean enableSpeaker(boolean enable);
enablePushToTalk
開啟/關(guān)閉對(duì)講機(jī)模式
/**
* 開啟/關(guān)閉對(duì)講機(jī)模式,對(duì)講機(jī)模式下,只有在finishPushToTalk被調(diào)用后,智能體才會(huì)播報(bào)結(jié)果
* @param enable
* @return
*/
public abstract boolean enablePushToTalk(boolean enable);
isPushToTalkEnable
對(duì)講機(jī)模式是否開啟
/**
* 對(duì)講機(jī)模式是否開啟
* @return
*/
public abstract boolean isPushToTalkEnable();
startPushToTalk
對(duì)講機(jī)模式:開始講話
/**
* 對(duì)講機(jī)模式:開始講話
* @return
*/
public abstract boolean startPushToTalk();
finishPushToTalk
對(duì)講機(jī)模式:結(jié)束講話
/**
* 對(duì)講機(jī)模式:結(jié)束講話
* @return
*/
public abstract boolean finishPushToTalk();
cancelPushToTalk
對(duì)講機(jī)模式:取消這次通話
/**
* 對(duì)講機(jī)模式:取消這次通話
* @return
*/
public abstract boolean cancelPushToTalk();
switchRobotVoice
切換音色
/**
* 切換音色
*/
public abstract boolean switchRobotVoice(String voiceId);
getRobotVoiceId
獲取正在使用的音色
/**
* 獲取正在使用的音色
* @return
*/
public abstract String getRobotVoiceId();
setEngineCallback
注冊(cè)回調(diào)
/**
* 注冊(cè)回調(diào)
* @param engineCallback
*/
public abstract void setEngineCallback(IARTCAICallEngineCallback engineCallback);
isMicrophoneOn
是否關(guān)閉麥克風(fēng)
/**
* 是否關(guān)閉麥克風(fēng)
* @return
*/
public abstract boolean isMicrophoneOn();
isSpeakerOn
揚(yáng)聲器是否開啟
/**
* 揚(yáng)聲器是否開啟
* @return
*/
public abstract boolean isSpeakerOn();
isVoiceInterruptEnable
智能打斷是否開啟
/**
* 智能打斷是否開啟
* @return
*/
public abstract boolean isVoiceInterruptEnable();
setAvatarAgentView
設(shè)置數(shù)字人視圖載體
/**
* 設(shè)置數(shù)字人視圖載體
* @param viewGroup
* @param avatarLayoutParams
*/
public abstract void setAvatarAgentView(ViewGroup viewGroup, ViewGroup.LayoutParams avatarLayoutParams);
setVisionPreviewView
設(shè)置本地視頻預(yù)覽視圖載體
/**
* 設(shè)置本地視頻預(yù)覽視圖載體
* @param viewGroup
* @param visionLayoutParams
*/
public abstract void setVisionPreviewView(ViewGroup viewGroup, ViewGroup.LayoutParams visionLayoutParams);
muteLocalCamera
關(guān)閉/取消關(guān)閉攝像頭
/**
* 關(guān)閉/取消關(guān)閉攝像頭
*/
public abstract boolean muteLocalCamera(boolean mute);
isLocalCameraMute
攝像頭是否關(guān)閉
/**
* 攝像頭是否關(guān)閉
* @return
*/
public abstract boolean isLocalCameraMute();
switchCamera
切換前后攝像頭
/**
* 切換前后攝像頭
*/
public abstract boolean switchCamera();
getRtcEngine
獲取RTC引擎實(shí)例
/**
* 獲取rtc引擎實(shí)例
* @return
*/
public abstract AliRtcEngine getRtcEngine();
getIARTCAICallService
獲取官方協(xié)議實(shí)現(xiàn)
/**
* 獲取官方協(xié)議實(shí)現(xiàn)
* @return
*/
public abstract IARTCAICallService getIARTCAICallService();
IARTCAICallEngineCallback詳情
onErrorOccurs
發(fā)生了錯(cuò)誤
/**
* 發(fā)生了錯(cuò)誤
* @param errorCode 錯(cuò)誤碼
*/
void onErrorOccurs(AICallErrorCode errorCode);
onCallBegin
通話開始(入會(huì))
/**
* 通話開始(入會(huì))
*/
void onCallBegin();
onCallEnd
通話結(jié)束(離會(huì))
/**
* 通話結(jié)束(離會(huì))
*/
void onCallEnd();
onAICallEngineRobotStateChanged
機(jī)器人狀態(tài)同步
/**
* 機(jī)器人狀態(tài)同步
* @param oldRobotState
* @param newRobotState
*/
void onAICallEngineRobotStateChanged(ARTCAICallRobotState oldRobotState, ARTCAICallRobotState newRobotState);
onUserSpeaking
用戶說(shuō)話回調(diào)
/**
* 用戶說(shuō)話回調(diào)
* @param isSpeaking 是否在說(shuō)話
*/
void onUserSpeaking(boolean isSpeaking);
onUserAsrSubtitleNotify
同步ASR識(shí)別用戶的話
/**
* 同步ASR識(shí)別用戶的話
* @param text ASR識(shí)別出的具體文本
* @param isSentenceEnd 當(dāng)前文本是否為這句話的最終結(jié)果
* @param sentenceId 當(dāng)前文本屬于的句子ID
*/
void onUserAsrSubtitleNotify(String text, boolean isSentenceEnd, int sentenceId);
onAIAgentSubtitleNotify
同步智能體回應(yīng)的話
/**
* 同步智能體回應(yīng)的話
* @param text 智能體的話
* @param end 當(dāng)前回復(fù)是否結(jié)束
* @param userAsrSentenceId 表示回應(yīng)對(duì)應(yīng)sentenceId語(yǔ)音輸入的llm內(nèi)容
*/
void onAIAgentSubtitleNotify(String text, boolean end, int userAsrSentenceId);
onNetworkStatusChanged
網(wǎng)絡(luò)狀態(tài)回調(diào)
/**
* 網(wǎng)絡(luò)狀態(tài)回調(diào)
* @param uid 入會(huì)用戶id
* @param quality 網(wǎng)絡(luò)狀態(tài)
*/
void onNetworkStatusChanged(String uid, ARTCAICallNetworkQuality quality);
onVoiceVolumeChanged
音量變化
/**
* 音量變化
* @param uid 用戶id
* @param volume 音量[0-255]
*/
void onVoiceVolumeChanged(String uid, int volume);
onVoiceIdChanged
當(dāng)前通話的音色發(fā)生了改變
/**
* 當(dāng)前通話的音色發(fā)生了改變
*/
void onVoiceIdChanged(String voiceId);
onVoiceInterrupted
當(dāng)前通話的語(yǔ)音打斷設(shè)置改變
/**
* 當(dāng)前通話的語(yǔ)音打斷設(shè)置改變
*/
void onVoiceInterrupted(boolean enable);
onAgentVideoAvailable
智能體視頻是否可用(推流)
/**
* 智能體視頻是否可用(推流)
*/
void onAgentVideoAvailable(boolean available);
onAgentAudioAvailable
智能體音頻是否可用(推流)
/**
* 智能體音頻是否可用(推流)
*/
void onAgentAudioAvailable(boolean available);
onAgentAvatarFirstFrameDrawn
數(shù)字人首視頻幀渲染
/**
* 數(shù)字人首視頻幀渲染
*/
void onAgentAvatarFirstFrameDrawn();
onUserOnLine
用戶上線回調(diào)
/**
* 用戶上線回調(diào)
*/
void onUserOnLine(String uid);
onAgentWillLeave
當(dāng)前智能體即將離開(結(jié)束當(dāng)前通話)
/**
* 當(dāng)前智能體即將離開(結(jié)束當(dāng)前通話)
* @param reason 原因:2001(閑時(shí)退出) 0(其他)
* @param message 描述原因
*/
void onAgentWillLeave(int reason, String message);
onHumanTakeoverWillStart
當(dāng)真人即將接管當(dāng)前智能體
public void onHumanTakeoverWillStart(String takeoverUid, int takeoverMode);
參數(shù)詳情:
參數(shù) | 類型 | 含義 |
takeoverUid | String | 真人uid |
takeoverMode | Int | 1:表示使用真人音色輸出;0:表示使用智能體音色輸出 |
onHumanTakeoverConnected
當(dāng)真人接管已經(jīng)接通
public void onHumanTakeoverConnected(String takeoverUid);
參數(shù)詳情:
參數(shù) | 類型 | 含義 |
takeoverUid | String | 真人uid |
onReceivedAgentCustomMessage
智能體自定義消息
/**
* 智能體自定義消息
* @param data 自定義消息體,使用json字符串
*/
public void onReceivedAgentCustomMessage(String data);
IARTCAICallService詳情
generateAIAgentShareCall
請(qǐng)求啟動(dòng)分享的智能體通話
/**
* 請(qǐng)求啟動(dòng)分享的智能體通話
* @param userId 當(dāng)前登錄的用戶id
* @param aiAgentId 智能體id
* @param aiAgentType 智能體類型
* @param artcaiCallConfig 智能體配置
* @param callback 請(qǐng)求回調(diào)
*/
void generateAIAgentShareCall(String userId, String aiAgentId, ARTCAICallEngine.ARTCAICallAgentType aiAgentType, ARTCAICallEngine.ARTCAICallConfig artcaiCallConfig, IARTCAICallServiceCallback callback);
ARTCAIAgentUtil詳情
parseAiAgentShareInfo
解析分享智能體的信息
/**
* 解析分享智能體的信息
* @param shareInfoText
* @return 分享智能體的結(jié)構(gòu)化配置
*/
public static ARTCAIAgentShareInfo parseAiAgentShareInfo(String shareInfoText);
parseAiAgentInfo
解析智能體啟動(dòng)的響應(yīng)信息
/**
* 解析智能體啟動(dòng)的響應(yīng)信息
* @param jsonObject 智能體啟動(dòng)的響應(yīng)信息
* @return 智能體啟動(dòng)響應(yīng)的結(jié)構(gòu)化信息
*/
public static ARTCAIAgentInfo parseAiAgentInfo(JSONObject jsonObject);