网易首页 > 网易号 > 正文 申请入驻

虚拟主播你了解吗?带你认识虚拟主播形象制作的整体流程

0
分享至

什么是虚拟主播?

百度百科的定义:虚拟主播是指使用虚拟形象在视频网站上进行投稿活动的主播。虚拟主播以原创的虚拟人格设定、形象在视频网站、社交平台上进行活动。形象多以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。

请前往 下载 页面,获取最新版本的 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:glEsVersion="0x00020000"

android:required="true" />

因为 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 能力之前,需要导入相应的资源包,请前往 下载 页面,获取下列资源包。

开发者可以通过 动态下载 或 从本地添加 两种方式,导入资源包。

(推荐)动态下载

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 控制台 创建项目,并申请有效的 AppID,详情请参考 控制台 - 项目管理 中的“项目信息”。

请联系 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会是您的最佳选择。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
破船实在撑不住了!菲律宾补给失败后,向红十字会请求援助

破船实在撑不住了!菲律宾补给失败后,向红十字会请求援助

鹅毛的大雪
2024-06-19 14:53:04
美媒不满巴斯错过布朗塔图姆:19不换AD也可夺冠 詹塔布可创王朝

美媒不满巴斯错过布朗塔图姆:19不换AD也可夺冠 詹塔布可创王朝

颜小白的篮球梦
2024-06-19 21:02:09
菲军士兵的断指没接上!菲媒想让美军出兵,美:不要轻举妄动

菲军士兵的断指没接上!菲媒想让美军出兵,美:不要轻举妄动

说天说地说实事
2024-06-19 18:25:56
从现在到入伏,建议:这3种食物常给家人吃,赶走暑气,安稳度夏

从现在到入伏,建议:这3种食物常给家人吃,赶走暑气,安稳度夏

花小厨
2024-06-17 09:46:34
富士康转移到印度,结果河南这边举步维艰,说明了什么?

富士康转移到印度,结果河南这边举步维艰,说明了什么?

创作者朱海平
2024-06-17 12:03:15
38岁博尔特现状:与1米55女友生了3孩子,每年领400万美元至终身

38岁博尔特现状:与1米55女友生了3孩子,每年领400万美元至终身

十点街球体育
2024-06-17 17:25:31
2胜出线极端情况下,德国6分小组第3也必是最好的4个小组第3

2胜出线极端情况下,德国6分小组第3也必是最好的4个小组第3

直播吧
2024-06-20 02:05:27
是骡子是马拉出来遛遛:天才中专生姜萍被疑作弊,数学月考仅85分

是骡子是马拉出来遛遛:天才中专生姜萍被疑作弊,数学月考仅85分

瑜说还休
2024-06-17 12:19:02
三上悠亚回忆首部作品,解密作为女优出道的目的。

三上悠亚回忆首部作品,解密作为女优出道的目的。

楚门记
2024-06-18 14:54:33
阿根廷5月贸易盈余26.56亿美元

阿根廷5月贸易盈余26.56亿美元

每日经济新闻
2024-06-20 05:37:07
北京这一夜,人情世故、江湖地位,都在这张合照上体现得淋漓尽致

北京这一夜,人情世故、江湖地位,都在这张合照上体现得淋漓尽致

爱文历史
2024-06-19 16:28:25
女子走亲戚被弟弟缠着要抱抱,网友看到照片懵了:妥妥的明星胚子

女子走亲戚被弟弟缠着要抱抱,网友看到照片懵了:妥妥的明星胚子

三叶秋文局
2024-06-17 18:31:00
好久不见!45岁中国女排传奇队长冯坤参加奥运抽签仪式

好久不见!45岁中国女排传奇队长冯坤参加奥运抽签仪式

直播吧
2024-06-19 19:30:07
沈阳公务车无牌逆行致人死亡,交警不出具事故书!肇事者身份被扒

沈阳公务车无牌逆行致人死亡,交警不出具事故书!肇事者身份被扒

有趣的火烈鸟
2024-06-19 18:34:00
女孩子为什么喜欢被打屁股?她的快乐你想象不到

女孩子为什么喜欢被打屁股?她的快乐你想象不到

南风山
2024-06-18 01:45:02
韩媒:中国游客不文明行为成为过去

韩媒:中国游客不文明行为成为过去

环球时报国际
2024-06-19 08:44:46
意外!申花刚在中超丢掉榜首位置,两大主力就主动撂挑子官宣离队

意外!申花刚在中超丢掉榜首位置,两大主力就主动撂挑子官宣离队

评球论事
2024-06-19 21:16:10
厄瓜多尔取消对中国游客免签,外交部回应

厄瓜多尔取消对中国游客免签,外交部回应

华人生活网
2024-06-19 05:22:00
刚刚!俄罗斯遭遇屈辱叛变,盟友军援乌克兰,俄方已不抱任何期望

刚刚!俄罗斯遭遇屈辱叛变,盟友军援乌克兰,俄方已不抱任何期望

新财迷
2024-06-17 09:51:28
终于盈利了!中国铁路2023年收入1.24万亿,实现净利润33亿!

终于盈利了!中国铁路2023年收入1.24万亿,实现净利润33亿!

慎独赢
2024-06-19 14:30:55
2024-06-20 10:06:44
科技洞鉴
科技洞鉴
最新鲜、最有趣 科技资讯
108文章数 100895关注度
往期回顾 全部

科技要闻

美国AI圈震动! “OpenAI宫斗”核心人物苏茨克维官宣创业

头条要闻

美媒:真主党有十几万枚炮弹 或3天摧毁以基础设施

头条要闻

美媒:真主党有十几万枚炮弹 或3天摧毁以基础设施

体育要闻

绿军的真老大,开始备战下赛季了

娱乐要闻

黄一鸣“杀疯了” 直播间卖大葱养孩子

财经要闻

茅台大跌,谁的锅?

汽车要闻

双肾格栅变化大/内饰焕新 新一代宝马X3官图发布

态度原创

本地
家居
数码
艺术
军事航空

本地新闻

中式沙拉宇宙的天花板,它必须有姓名

家居要闻

自然开放 实现灵动可变空间

数码要闻

罗斯・杨称苹果今年第四季度推出 14/16 英寸 M4 MacBook Pro

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

军事要闻

以色列涉嫌在加沙使用重型炸弹 或多次违反战争法

无障碍浏览 进入关怀版