新四季網

如何創建自己的虛擬主播(虛擬主播你了解嗎)

2023-07-18 13:58:01

什麼是虛擬主播?

百度百科的定義:虛擬主播是指使用虛擬形象在視頻網站上進行投稿活動的主播。虛擬主播以原創的虛擬人格設定、形象在視頻網站、社交平臺上進行活動。形象多以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」 文件,添加權限。

因為 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

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會是您的最佳選擇。

,
同类文章
 陳冠希被曝當爸爸 老婆維密超模露點照觀看

陳冠希被曝當爸爸 老婆維密超模露點照觀看

6月12日,有網友曬出陳冠希和秦舒培為女兒舉辦百日宴的照片,陳冠希抱著女兒盡顯父愛,身旁站著秦舒培和家人。網友還曝陳冠希女兒名字是Alaia,此前秦舒培曾多次被傳懷孕及在美國生產。去年陳冠希秦舒培曾同逛嬰兒用品店;今年1月有網友偶遇秦舒培,稱其肚子凸起;今年4月有爆料稱秦舒培已誕下女兒。秦舒培是90
 日本十八禁的工口遊戲 電車之狼尾行系列你喜歡哪個?

日本十八禁的工口遊戲 電車之狼尾行系列你喜歡哪個?

工口遊戲,很多人應該都聽說過,工口遊戲其實就是日本遊戲產業裡面一些尺度較大的遊戲,我們也都了解日本的遊戲行業是很發達的,其中自然也少不了一些涉及大尺度的色情遊戲,工口遊戲就是這個一個類別的,下面讓我們來盤點幾個日本十八禁的工口遊戲。日本十八禁的工口遊戲:一、性感沙灘那個被碧撥蕩漾清可見底的海水圍繞的
 韓國十大被禁播的女團MV 尺度太大令人慾罷不能(視頻)

韓國十大被禁播的女團MV 尺度太大令人慾罷不能(視頻)

韓國的女團是一直是以性感而聞名,不僅在韓國有一大批的粉絲,就連中國和歐美國家也有一大票的粉絲,小編自然也是韓國女團粉絲大軍中的一員,看過韓國女團MV的人都知道,一向尺度是非常大的,各種誘惑性的東西看得欲罷不能,然而也正是因為尺度太大而遭到禁播,下面就讓我們一起去看看那些被禁播的MV。一、Stella
 莫菁門事件始末 因愛生恨散布大量豔照

莫菁門事件始末 因愛生恨散布大量豔照

莫菁門事件是發生在2010年廣西柳州的一次「豔照門事件」,那時候時下流行各種門事件,而廣西柳州莫菁門事件之所以能引起網絡上極大的討論,就是因為網友認為發帖者的行為已經超越了道德底線,莫菁門事件中究竟有什麼愛恨情仇呢?莫菁門事件:莫菁,女,廣西柳州人。2010年11月,一名柳州女子的不雅「豔照」在網際
 陳法蓉萬人騎是什麼意思?她演過哪些三級片?

陳法蓉萬人騎是什麼意思?她演過哪些三級片?

陳法蓉是香港著名的女藝人之一,曾經還獲得1989年香港小姐的冠軍,可以說是一位老牌的港姐代表,曾經也有演過三級片,網上曾經有一種對於她的說法是「萬人騎」,說的就是她的感情經歷十分豐富,交往過很多任的男朋友,最後都沒有一個好的結果。陳法蓉介紹:陳法蓉,1967年10月28日出生於香港,祖籍江蘇宿遷,中
 蔣英與李雙江婚外情?關係曖昧是真的嗎?

蔣英與李雙江婚外情?關係曖昧是真的嗎?

蔣英是中國最傑出的女聲樂家,中國航天之父錢學森的夫人,武俠小說大師金庸的表姐,大詩人徐志摩的表妹,看到這麼多人的名字你一定會驚嘆,而在網上曾有流傳蔣英與李雙江的婚外情事件也是引起不小的轟動,蔣英與李雙江是真的嗎,讓我們一起去揭秘事情的真相。蔣英簡介:蔣英生於1919年9月7日,浙江海寧人,中國最傑出
 《狼心狗肺》《你的淺笑》誰曲子更密鑼緊鼓

《狼心狗肺》《你的淺笑》誰曲子更密鑼緊鼓

港島妹妹和梵谷先生:天津嘉年華梁龍說:這不都坐著呢嗎我們說:坐下,牛逼安保說:菠菜賤賣。2019年10月28日 (114)|lululu0726:搖滾是音樂 聽音樂不聽音樂光聽歌詞?前戲不重要麼各位?2020年11月16日 (51)|死在柯本槍下:前面叨咕的是不是:上班了上班了他媽媽沒話說?2021
 柯凡錄音門事件 因侮辱詹姆斯而遭到封殺?

柯凡錄音門事件 因侮辱詹姆斯而遭到封殺?

柯凡,中國籃球解說員,看過NBA的朋友肯定對於他不會太陌生,柯凡搭檔過很多著名的體育解說員,但是因為在2015-2016NBA總決賽期間曝出的錄音門事件中侮辱了詹姆斯被球迷口誅筆伐,柯凡也因此被暫時停止工作反省,柯凡究竟有沒有被封殺呢?柯凡簡介:柯凡,男,北京市人,1986年3月29日出生。籃球解說
 病態三部曲背後虐心的故事 打回原形/防不勝防/十面埋伏

病態三部曲背後虐心的故事 打回原形/防不勝防/十面埋伏

黃偉文是香港樂壇著名的作詞人,他給很多音樂人都寫過歌詞也都是耳熟能詳,比如說《可惜我是水瓶座》《浮誇》《下一站天后》《喜帖街》等等,他的歌能讓人產生非常多的共鳴,在病態三部曲中更是引起無數人對於愛情的遺憾,他的病態三部曲分別是哪三首呢?病態三部曲:《打回原形》《打回原形》講愛之卑微。在愛情裡面,人難
 《愛你這樣傻》與《你從未說過愛我》哪首變幻莫測

《愛你這樣傻》與《你從未說過愛我》哪首變幻莫測

南極不季寞:90後聽這種歌的還有幾個2015年9月20日 (6017)|Ea-bon:真系好聽無得頂啊,睇下幾多人卑贊!!12015年12月2日 (2092)|麥芽先生:唱歌的也傻聽歌的也傻2015年3月27日 (867)|六級詞彙小能手:22歲的阿姨沒有談過戀愛但是喜歡著一個人。2017年10月1