如何創建自己的虛擬主播(虛擬主播你了解嗎)
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會是您的最佳選擇。
,