虛擬主播你了解嗎?帶你認識虛擬主播形象製作的整體流程

98k快訊 發佈 2022-09-21T14:50:47.571790+00:00

什麼是虛擬主播?百度百科的定義:虛擬主播是指使用虛擬形象在視頻網站上進行投稿活動的主播。虛擬主播以原創的虛擬人格設定、形象在視頻網站、社交平台上進行活動。形象多以MMD或Unity的3D模型或Live2D製作的2D模型出現,並以真人聲優配音,但聲優一般情況下並不公開。

什麼是虛擬主播?

百度百科的定義:虛擬主播是指使用虛擬形象在視頻網站上進行投稿活動的主播。虛擬主播以原創的虛擬人格設定、形象在視頻網站、社交平台上進行活動。形象多以MMD或Unity的3D模型或Live2D製作的2D模型出現,並以真人聲優配音,但聲優一般情況下並不公開。

如何製作虛擬主播形象?

通過上面定義我們知道虛擬主播本質是以虛擬形象模型出現。但目前虛擬形象技術門檻高、開發成本高以及全場景實現較為困難等諸多問題,從業者們該如何快速並低成本的實現虛擬形象?即構虛擬形象引擎(ZegoAvatar)給出了一個答案。

ZegoAvatar支持自定義管理人物的虛擬形象,通過默認的虛擬形象或者自定義生成的專有虛擬形象,以表情隨動、聲音驅動等方式與真人實時互動,可廣泛應用於語聊直播、社交互動、在線培訓等多種場景中。開發者只需調用一個SDK,就可以開始去製作虛擬形象。

虛擬主播形象製作的整體流程

下面基於Android端為例講述實現流程。

集成 SDK

準備環境

在開始集成 ZegoAvatar SDK 前,請確保開發環境滿足以下要求:

· Android Studio 2.1 或以上版本。

· Android SDK 25、Android SDK Build-Tools 25.0.2、Android SDK Platform-Tools 25.x.x 或以上版本。

· Android 5.1 或以上版本,且支持音視頻的 Android 真機設備。

· 設備的前置攝像頭和麥克風功能正常。

集成 SDK

1(可選)新建項目

此步驟以如何創建新項目為例,如果是集成到已有項目,可忽略此步。

2 導入 SDK

目前支持的平台架構包括:armeabi-v7a、arm64-v8a。

請前往 下載 (https://doc-zh.zego.im/article/15302?source=zhihu&article3)頁面,獲取最新版本的 SDK。

解壓 SDK 壓縮包,將 ZegoAvatar 的製品包中的 ZegoAvatar.aar 拷貝至自己的項目目錄下,如 「app/libs」。

3.添加 SDK 引用。進入到「app」目錄,打開「build.gradle」文件,在「dependencies」節點引入 「libs」 下所有的 jar。

implementation FileTree(dir: 'libs', include: ['*.jar', "*.aar"])//通配引入

3 設置權限

根據實際應用需要,設置應用所需權限。

進入 「app/src/main」 目錄,打開 「AndroidManifest.xml」 文件,添加權限。

<!-- SDK 必須使用的權限 -->

<uses-permission android:name="android.permission.CAMERA" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.RECORD_AUDIO" />

<!-- App 需要使用的部分權限 -->

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<uses-permission android:name="android.permission.WAKE_LOCK" />

<uses-feature

android:glEsVersion="0x00020000"

android:required="true" />

<uses-feature android:name="android.hardware.camera" />

<uses-feature android:name="android.hardware.camera.autofocus" />

因為 Android 6.0 在一些比較重要的權限上要求必須申請動態權限,不能只通過 「AndroidMainfest.xml」 文件申請靜態權限。因此還需要參考執行如下代碼,其中 「requestPermissions」 是 「Activity」 的方法。

String[] permissionNeeded = {

"android.permission.CAMERA"};

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

if (ContextCompat.checkSelfPermission(this, "android.permission.CAMERA") != PackageManager.PERMISSION_GRANTED) {

requestPermissions(permissionNeeded, 101);

}

}

4 防止混淆代碼

在 「proguard-rules.pro」 文件中,為 SDK 添加 -keep 類的配置,防止混淆 SDK 公共類名稱。

-keep class **.zego.**{*;}

導入資源

使用 Avatar 提供的各項 AI 能力之前,需要導入相應的資源包,請前往 下載(https://doc-zh.zego.im/article/15302?source=cnblog&article3) 頁面,獲取下列資源包。

開發者可以通過 動態下載 或 從本地添加 兩種方式,導入資源包。

(推薦)動態下載

Packages 中包含了部分美術資源,開發者如有需要,請聯繫 ZEGO 商務人員,獲取所有的美術資源。

從本地添加

請前往 下載 頁面,獲取相關的資源包。

解壓獲取到的資源包,找到 「assets」 文件夾,拷貝到自己創建項目的 「assets」 文件夾下。

3.運行項目時,將 「AIModel.bundle」、「base.bundle」 、"Packages" 文件,通過以下代碼,拷貝到設備的私有目錄(/data/data/包名/files)下。(注意:Android 系統的 assets 文件夾只能讀取。)

AssetsFileTransfer.copyAssetsDir2Phone(this.getApplication(),

"AIModel.bundle"/*apk 里的assets 根目錄*/, "assets"/* sd 卡里的目錄, 值為:getFilesDir().getAbsolutePath() + File.separator + destPath */);

AssetsFileTransfer.copyAssetsDir2Phone(this.getApplication(),

"base.bundle", "assets");

AssetsFileTransfer.copyAssetsDir2Phone(this.getApplication(),

"Packages", "assets");

/**

* 把assets/${filePath}目錄中的所有內容拷貝到 手機的Storage的${destPath}/目錄中

*

* @param activity activity 使用CopyFiles類的Activity

* @param filePath String 相對於Android APK內的assets目錄的文件路徑,如:AIModel.bundle

* @param destPath String 拷貝的目標, 如:/data/data/包名/files/assets/

*/

public static void copyAssetsDir2Phone(Context activity, String filePath, String destPath) {

try {

String[] fileList = activity.getAssets().list(filePath);

if (fileList.length > 0) {//如果是目錄

File file = new File(activity.getFilesDir().getAbsolutePath() + File.separator + destPath + File.separator + filePath);

if (file.exists()) {

deleteAllFiles(file);

}

file.mkdirs();//如果文件夾不存在,則遞歸

for (String fileName : fileList) {

filePath = filePath + File.separator + fileName;

copyAssetsDir2Phone(activity, filePath, destPath);

filePath = filePath.substring(0, filePath.lastIndexOf(File.separator));

Log.i(TAG, filePath);

}

} else {//如果是文件

InputStream inputStream = activity.getAssets().open(filePath);

File file = new File(activity.getFilesDir().getAbsolutePath() + File.separator + destPath + File.separator + filePath);

if (file.exists()) {

boolean delete = file.delete();

}

if (!file.exists() || file.length() == 0) {

FileOutputStream fos = new FileOutputStream(file);

int len = -1;

byte[] buffer = new byte[1024];

while ((len = inputStream.read(buffer)) != -1) {

fos.write(buffer, 0, len);

}

fos.flush();

inputStream.close();

fos.close();

}

}

} catch (IOException e) {

Log.e(TAG, "copy file faild, src:" + filePath + " dest:" + destPath);

e.printStackTrace();

}

}

4.拷貝資源後,在行動裝置上運行時,會存在如下的結構。注意:不同的行動裝置,getFilesDir().getAbsolutePath() 返回的目錄可能不一樣。這裡以華為手機為例,其返回的是:/data/data/im.zego.zegoavatarexample。

5.使用某一功能時,在對應接口中,傳入接口要求的資源的 絕對路徑 即可。

使用步驟

本節介紹如何使用 ZegoAvatar SDK 實現基本的圖像處理功能,API 調用時序如下圖:

1 申請鑒權

ZEGO Avatar 目前使用 在線鑒權 的方式獲取 License 授權文件。

1.1 開通 ZegoAvatar 權限

請先在 ZEGO 控制台 (https://coNSole.zego.im/?source=zhihu&article3) 創建項目,並申請有效的 AppID,詳情請參考 控制台 - 項目管理 (https://doc-zh.zego.im/article/12107?source=zhihu&article3) 中的「項目信息」。

請聯繫 ZEGO 商務人員,提供申請到的 AppID,以及自己項目的 Bundle Id,獲取鑒權需要使用的 AppSign,並開通相關權限。

1.2 獲取參考代碼

請將從 下載 獲取到的示例源碼中的 LicenseHelper 文件夾中的代碼,拷貝到自己的項目下。

修改 ZegoAvatarConfig.h 文件,請使用已獲取的 AppID 和 AppSign 正確填寫,否則示例源碼無法正常運行。

// 鑒權伺服器的地址

static NSString *AVATAR_BASE_URL = @"https://aieffects-api.zego.im?Action=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;

2.在項目中,選擇 「TARGETS > Signing & Capabilities」 菜單,將 「Bundle Identifier」 設置為申請 AppID 時所提供的 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

初始化 AvatarService 之前,請先導入以下相關的頭文件,準備基礎工作。

// 引入 頭文件 #import <ZegoAvatar/ZegoAvatarService.h>

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];

}

3.註冊 onStateChange 回調,接收初始化狀態的相關回調通知。

// avatarService初始化狀態回調

- (void)onStateChange:(ZegoAvatarServiceState)state {

// SDK初始化成功

if (state == ZegoAvatarServiceState_InitSucceed) {

// 初始化虛擬形象

[self initAvatar];

}

}

3 創建虛擬形象

在創建虛擬人物形象時,為了簡化 Character(虛擬人物形象)的初始化、序列化、數據緩存、路徑拼接等功能的接入流程,ZEGO Avatar SDK 提供了 ZegoCharacterHelper 類(開源),幫助開發者快速創建人物虛擬形象,詳情請參考 ZegoCharacterHelper 使用說明 (https://doc-zh.zego.im/article/15196?source=zhihu&article3)。

初始化 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];

//角色上屏

[_characterHelper setCharacterView:_avatarView];

}

通過以上步驟,開發者可以低門檻快速實現一個虛擬形象,為企業進入元宇宙打造基礎設施。從本質來講,不管企業還是個人,我們都需要一個接近完美的虛擬偶像作為代言人形象,希望ZegoAvatar會是您的最佳選擇。

關鍵字: