虛拟形象是虛拟世界的核心資産,也是打造元宇宙社交的數字名片,從虛拟形象為切入點,ZEGO Avatar 基于強大的 AI 算法能力,可以為企業提供多元化風格虛拟形象制作及智能互動服務,助力企業打造虛拟形象數字資産,創造多樣的玩法體驗,支援客戶以相對較低的門檻快速進入元宇宙賽道。
上期内容中我們介紹了元宇宙場景下的虛拟直播實踐流程,本期内容我們以 iOS 版本為例來講一講如何捏出千人千面的虛拟形象,助力開發者快速實作虛拟形象!
=======
前提條件
=================
在實作基本的 Avatar 功能之前,請確定:
- 已在項目中內建了 Avatar SDK,詳情請參考 內建 SDK;
- 已開啟攝像頭權限。
=======
使用步驟
=================
本節介紹如何使用 ZegoAvatar SDK 實作基本的圖像處理功能,API 調用時序如下圖:
1
申請鑒權
ZEGO Avatar 目前使用 線上鑒權 的方式擷取 License 授權檔案。
1.1 開通 ZegoAvatar 權限
- 請先在 ZEGO 控制台 建立項目,并申請有效的 AppID 和 AppSign,詳情請參考 控制台 - 項目管理 中的“項目資訊”。
- 請聯系 ZEGO 商務人員,提供自己項目的 Bundle Id,開通相關權限。
1.2 擷取參考代碼
請将從 下載下傳 擷取到的示例源碼中的 LicenseHelper 檔案夾中的代碼,拷貝到自己的項目下。
- 修改 ZegoAvatarConfig.h 檔案,請使用已擷取的 AppID 和 AppSign 正确填寫,否則示例源碼無法正常運作。
// 鑒權伺服器的位址
static NSString *AVATAR_BASE_URL = @"https://aieffects-api.zego.im?Actinotallow=DescribeAvatarLicense";
// 向 ZEGO 申請的 AppID, APPID 跟 Bundle Id 有綁定關系,“Bundle Identifier” 設定為申請 AppID 時所提供的 Bundle Id
static NSUInteger AVATAR_APPID = YOUR_APP_ID;
// 向 ZEGO 申請的得到的 AppSign
static NSString *AVATAR_APP_SIGN = YOUR_APP_SIGN;
- 在項目中,選擇 “TARGETS > Signing & Capabilities” 菜單,将 “Bundle Identifier” 設定為申請權限時所提供的 Bundle Id。
1.3 安裝依賴庫
- 打開終端,進入項目根目錄,執行
引入依賴庫;pod 'YTKNetwork'
- 執行
指令安裝依賴庫。pod install
1.4 擷取 License
通過 ZGAvatarLicenseHelper 中的
requestLicense
接口,發起網絡請求,擷取鑒權 License 字元串。
// 發起網絡請求擷取 License
[ZGAvatarLicenseHelper requestLicense:^(NSString * _Nonnull license) {
if (license.length > 0) {
// 初始化 avatar Service
[self initAvatarService: license];
}
}];
2
初始化 AvatarService
2.1 初始化 AvatarService 之前,請先導入以下相關的頭檔案,準備基礎工作。
// 引入 頭檔案
#import <ZegoAvatar/ZegoAvatarService.h>
2.2 導入頭檔案後,調用 initWithConfig 接口,傳入之前擷取到的鑒權 License 字元串,初始化 AvatarService。
// 初始化 AvatarService
- (void) initAvatarService: (NSString*) license{
// 建立 config
ZegoServiceConfig *config = [[ZegoServiceConfig alloc] init];
// 将擷取到的 License 檔案傳入
config.license = license;
// 指定 AI 模型的路徑
config.AIPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/assets/AIModel.bundle"];
// 監聽初始化狀态,addServiceObserver 需要在 "主線程" 執行!!!
[[ZegoAvatarService sharedInstance] addServiceObserver:self];
// 初始化 AvatarService
[[ZegoAvatarService sharedInstance] initWithConfig:config];
}
2.3 注冊 onStateChange 回調,接收初始化狀态的相關回調通知。
// avatarService初始化狀态回調
- (void)onStateChange:(ZegoAvatarServiceState)state {
// SDK初始化成功
if (state == ZegoAvatarServiceState_InitSucceed) {
// 初始化虛拟形象
[self initAvatar];
}
}
3
建立虛拟形象
注意:在建立虛拟人物形象時,為了簡化 Character(虛拟人物形象)的初始化、序列化、資料緩存、路徑拼接等功能的接入流程,ZEGO Avatar SDK 提供了 ZegoCharacterHelper 類(開源),幫助開發者快速建立人物虛拟形象,詳情請參考 ZegoCharacterHelper 使用說明。
初始化 AvatarService 後,通過建立
ZegoCharacterHelper
對象,傳入虛拟人物形象的外觀資料(捏臉、換裝、妝容等),設定視圖參數(寬、高、位置等),建立一個虛拟形象。
- (void) initAvatar{
// 建立 Helper,傳入基礎資源的路徑
NSString *resourcePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/assets/base.bundle"];
_characterHelper = [[ZegoCharacterHelper alloc] init:resourcePath];
// 設定素材資源包位址,如果是動态下載下傳,則傳入下載下傳的目标目錄
NSString *packagesPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/assets/Packages"];
[_characterHelper setExtendPackagesPath:packagesPath];
// 使用預設形象,以男性角色為例
[_characterHelper setDefaultAvatar:MODEL_ID_MALE];
// 建立 AvatarView
_avatarView = [[ZegoAvatarService sharedInstance] createAvatarView:CGRectMake(0, 0, 200, 200)];
[self.view addSubview:_avatarView];
//角色上屏,請保證上屏之前設定過正确的 AvatarJson 資料,即調用過 setDefaultAvatar 或 setAvatarJson 方法。
[_characterHelper setCharacterView:_avatarView];
}
說明:如果使用者不使用預設形象,想要根據圖檔自動生成定制化的虛拟形象,請參考 AI 捏臉。
=======
Avatar 功能拓展
========================
我們已經知道,圖像由像素組成,而像素通過記錄色彩空間各分量呈現各種各樣的色彩。對于 RGB 色彩空間,其三個分量 R(紅)、G(綠)、B(藍),它們之間具有相關性,對于色彩的表示來說缺一不可。
虛拟形象建立完成後,可體驗 Avatar 相關功能:
1
表情随動
ZEGO Avatar SDK 提供了表情随動功能,基于領先的人臉關鍵點精準識别,結合面部、舌頭、眼球在内的 52 種基礎面部表情次元,實時捕獲使用者臉部的表情動作,在虛拟形象上進行實時的還原渲染。可廣泛應用于社互動動、語聊直播等場景中。
開發者請參考以下步驟,實作 “表情随動” 功能:
1.1 開始表情檢測
- 開啟表情檢測前,請确認已開啟攝像頭權限;
- 開發者如果使用了 ZegoCharacterHelper,則無需再調用 IZegoCharacter 的任何相關接口。
搭建出基本的虛拟人物形象後,調用 startDetectExpression 接口,設定驅動模式為
ZegoExpressionDetectModeCamera
,通過前置攝像頭,開始檢測表情;然後可以直接通過 ZegoCharacterHelper的
setExpression
接口設定表情,驅動目前虛拟人物的面部表情變化。
// 開始表情檢測
___weak typeof(self) weakSelf = self;
BOOL ret = [[[ZegoAvatarService sharedInstance] getInteractEngine] startDetectExpression:ZegoExpressionDetectModeCamera callback:^(ZegoExpression *expression) {
// 驅動虛拟人物的臉部變化
__strong typeof(self) strongSelf = weakSelf;
[strongSelf.characterHelper setExpression: expression];
}];
1.2 停止表情檢測
将應用切換到背景運作、或退出目前頁面時,需要調用 stopDetectExpression 接口,停止表情檢測。
// 停止表情檢測
[[[ZegoAvatarService sharedInstance] getInteractEngine] stopDetectExpression];
2
語音驅動
ZEGO Avatar SDK 提供了語音驅動功能,通過聲音的聲波資訊,實時驅動目前虛拟人物的嘴形變化,使得虛拟形象能夠和真人一樣進行自然的情緒表達。
可廣泛應用于社互動動、語聊直播等場景中。
開發者請參考以下步驟,實作 “語音驅動” 功能:
2.1 開始語音檢測
- 開始語音檢測前,請确認已開啟麥克風權限;
- 開發者如果使用了 ZegoCharacterHelper,則無需再調用 IZegoCharacter 的任何相關接口。
搭建出基本的虛拟人物形象後,調用 startDetectExpression 接口,設定驅動模式為
ZegoExpressionDetectModeAudio
,通過麥克風,開始檢測聲音波動;然後可以直接通過 ZegoCharacterHelper 的 setExpression 接口設定表情,驅動目前虛拟人物的嘴形變化。
// 開始語音檢測
___weak typeof(self) weakSelf = self;
BOOL ret = [[[ZegoAvatarService sharedInstance] getInteractEngine] startDetectExpression:ZegoExpressionDetectModeAudio callback:^(ZegoExpression *expression) {
// 驅動虛拟人物的嘴形變化
__strong typeof(self) strongSelf = weakSelf;
[strongSelf.characterHelper setExpression: expression];
}];
2.2 自定義音頻采集
開發者可以調用 setCustomAudioDelegate 接口,設定自定義的音頻資料采集代理(需要繼承 AudioDataDelegate 實作 onStart 和 onStop 方法)。采集到音頻資料後,調用 sendAudioData 接口,發送資料。
@interface ExpressAudioCaptureDelegate()<ZegoEventHandler, ZegoCustomAudioProcessHandler>
{
BOOL _isRunning;
}
@end
@implementation ExpressAudioCaptureDelegate
- (void)onStart{
// 啟動音頻采集
_isRunning = YES;
}
- (void)onStop{
// 停止音頻采集
_isRunning = NO;
}
// 這是 Express 的自定義聲音的前處理回調, 把資料發送給 Avatar SDK
- (void)onProcessCapturedAudioData:(unsigned char * _Nonnull)data dataLength:(unsigned int)dataLength param:(ZegoAudioFrameParam *)param timestamp:(double)timestamp; {
if(_isRunning){
// data: pcm的原始資料
// length: data的長度
// dataType: data采集的位數 0表示16位,1表示8位
// timeStamp: 時間戳, 從啟動采集到現在經過的時間
// sendAudioData 是父類方法, 資料透傳給 Avatar SDK, RTC 的資料是 8位的, dataType 是 1
[super sendAudioData: (void*)data size:dataLength dataType: 1 /* RTC 給的 8bit*/ timeStamp: [super getDurationMs]/*這個方法是父類的,直接調用*/];
}
}
@end
2.3 停止語音檢測
将應用切換到背景運作、或退出目前頁面時,需要調用 stopDetectExpression 接口,停止語音檢測。
// 停止語音檢測``[[[ZegoAvatarService sharedInstance] getInteractEngine] stopDetectExpression];
3
手動捏臉
ZEGO Avatar SDK 提供了手動捏臉功能,支援使用者根據自己的審美偏好,對虛拟人物形象臉部的各個部位進行細微調節(如眼睛大小、鼻子寬窄、嘴巴大小等),融合成自定義的虛拟人物形象人臉,自由定義,打造獨一無二的專屬形象,可廣泛應用于各類遊戲場景中。
開發者請參考以下步驟,實作 “手動捏臉” 功能:
搭建出基本的虛拟人物形象後調用
setFaceShape
接口,傳入 faceshapeID(可調整的臉部次元,請參考下表)和 value(捏臉系數)等參數,設定或修改臉部相關位置的形狀。我們在 helper/ZegoCharacterHelper.h 中,同樣聲明了所有可支援調整的臉部次元 faceshapeID。
// 停止語音檢測
[[[ZegoAvatarService sharedInstance] getInteractEngine] stopDetectExpression];
/** 設定捏臉系數,faceshapeID 值參考下表,并且 ZegoCharacterHelper 内有定義好的常量,可以直接使用。*/
[_characterHelper setFaceShape:FACESHAPE_BROW_SIZE_Y value:0.3];
4
AI 捏臉
ZEGO Avatar SDK 提供了AI 捏臉功能,支援通過“攝像頭”或者“上傳圖像”的方式,結合對人臉進行海量分析和訓練後的 AI 算法,識别人臉特征,再以美術設計提供的虛拟形象人模為基礎,生成與真人高度還原的虛拟形象。可廣泛應用于各類遊戲場景中。
開發者請參考以下步驟,實作 “AI 捏臉” 功能。
4.1 初始化 AvatarService
請參考 建立虛拟形象 文檔,擷取鑒權 License 檔案;并傳入正确的 AIPath,初始化 AvatarService。
4.2 建立虛拟人物形象
準備需要用來建立虛拟人物形象的 UIImage 圖檔。
- 推薦使用攝像頭拍攝圖檔。
準備好圖檔後,調用 detectFaceFeature 接口,傳入 UIImage,即可生成該圖檔對應的虛拟人物形象。
/ 根據傳入的圖檔,提取人臉特征
ZegoFaceFeature *feature = [[[ZegoAvatarService sharedInstance] getInteractEngine] detectFaceFeature:image];
- 如果 UIImage 中檢測不到人臉,調用 detectFaceFeature 接口會直接傳回 nil。
4.3 設定捏臉資料
建立出虛拟人物形象後,調用 ZegoCharacterHelper 的 applyFaceFeature 接口,傳入 feature(設定的臉部次元,可設定的次元請參考下表),設定臉部相關位置的形狀。
// 根據人臉特征,設定人物外形
[_characterHelper applyFaceFeature:feature];
目前,支援調整的臉部次元可以點選連結檢視詳情:https://doc-zh.zego.im/article/14972
5
妝容換裝
ZEGO Avatar SDK 提供了多種妝容配飾(如美瞳、口紅、眼鏡、胡子、服裝等)等美術素材,支援在虛拟形象上實時渲染、自然替換,打造符合自己品味的專屬形象。
開發者請參考以下步驟,實作 “換妝容、換服裝” 功能。
目前,支援調整的次元有:眉毛、刺青、嘴唇、胡子、美瞳、眼鏡、耳機、耳飾、頭發、服裝等。具體的支援次元和資源類型,請咨詢 ZEGO 商務人員。
開發者如果使用了 ZegoCharacterHelper,則無需再調用 IZegoCharacter 的任何相關接口。雖然 IZegoCharacter 也有同名的 setPackage 接口,但請不要直接調用。如果跳過 ZegoCharacterHelper 直接調用 IZegoCharacter 的接口,ZegoCharacterHelper 層的緩存将不再可信。
搭建出基本的虛拟人物形象後:
- 如果開發者把 Packages 資源包做成動态下載下傳,則需要在使用 Packages 前,調用 ZegoCharacterHelper 的
接口設定 Packages 的下載下傳目錄到參數 downloadPath,以便資源索引。setExtendPackagesPath
downloadPath 需指到 Packages 檔案夾,例如:/Documents/downloads/Package/。
- 調用 setPackage 接口,傳入 packageID,調整虛拟人物相關位置的外觀。
//確定換裝調用前已經設定的外部 Packages 的目錄
[_characterHelper setExtendPackagesPath:downloadPath]
/** 調用換裝接口*/
NSString *packageID = @"earphone7"; //earphone7 是一款耳機資源的目錄名稱,使用 Zego 提供的 Pacakges 下的目錄名稱即可。
[_characterHelper setPackage:packageID];
=======
demo 展示
元宇宙是人類對于未來社會的美好想象,而虛拟人則是人類對于未來“Better me”的美好寄托。ZEGO 即構科技為使用者定制個性化的虛拟形象,從技術底層為開發者賦能,與元宇宙生态裡的所有成員一起,讓元宇宙的理想程序推進得再快、再穩一些。
下方是ZEGO即構科技的 Avatar 展示!