天天看點

元宇宙場景技術實踐|實作“虛拟人”自由

虛拟形象是虛拟世界的核心資産,也是打造元宇宙社交的數字名片,從虛拟形象為切入點,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 的 ​

    ​setExtendPackagesPath​

    ​ 接口設定 Packages 的下載下傳目錄到參數 downloadPath,以便資源索引。

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 展示!

繼續閱讀