元宇宙场景技术实践|实现“虚拟人”自由

虚拟形象是虚拟世界的核心资产,也是打造元宇宙社交的数字名片,从虚拟形象为切入点,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?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;
  • 在项目中,选择 “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{// 创建 configZegoServiceConfig *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];

目前,支持调整的脸部维度可以点击链接查看详情:https://doc-zh.zego.im/article/14959


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/43392.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

元宇宙大潮来袭?业内首个虚拟形象实时互动融合 SDK 来了!

元宇宙&#xff0c;火得猝不及防。 短短几个月时间&#xff0c;Minecraft、Roblox 进入了更多人的视野&#xff0c;GREE、英伟达、微软等陆续发布相关产品解决方案&#xff0c;韩国、日本还从国家层面宣布大力布局元宇宙赛道。《头号玩家》描绘的情景似乎明天就能成为现实。 &a…

元宇宙与虚拟现实(二)

前言 前面我们关于元宇宙进行了概念上的阐释&#xff0c;本篇文章继续会探讨一些元宇宙里面脑洞大开的话题&#xff0c;如元宇宙和现实的关系&#xff0c;以及热门话题&#xff0c;关于元宇宙怎么炒房~~ 元宇宙不是什么&#xff1f; 1.元宇宙不等于电子游戏 元宇宙大型多人在…

解读元宇宙:映射现实的虚拟平行世界 关注VR AR 区块链Web3.0机会

元宇宙——理想状态是自发无边际的社会体验 。 公众号&#xff1a;领航员kol 阅读我的原创文章&#xff1a; 微博&#xff1a;牛熊领航员kol 阅读我的原创文章&#xff1a; 元宇宙的英文叫做MetaverseMetaverse&#xff0c;是一个映射现实世界的虚拟平行世界&#xff0c;​通…

当Unity实时3D引擎遇上AI虚实交互,Unity要成为元宇宙时代的新引擎

游戏引擎巨头Unity&#xff0c;还在为蔚来、小鹏、理想等14家车厂提供智能座舱等解决方案&#xff0c;以及为香港机场、北京城建、海尔卡奥斯提供数字孪生方案。实时3D引擎&#xff0c;也将是元宇宙时代的核心支撑。 编辑 | 宋慧 出品 | CSDN AI 领域的年度盛会——2022世界人…

万字长文 | ChatGPT的工作原理(一)

ChatGPT 能够自动生成一些读起来表面上甚至像人写的文字的东西&#xff0c;这非常了不起&#xff0c;而且出乎意料。但它是如何做到的&#xff1f;为什么它能发挥作用&#xff1f;我在这里的目的是大致介绍一下 ChatGPT 内部的情况&#xff0c;然后探讨一下为什么它能很好地生成…

手把手教你最近很火的 微信公众号测试号推送消息

最近有很多小伙伴在尝试做消息推送&#xff0c;今天详细教程它来啦&#xff01;&#xff01;&#xff01; 过程不太复杂&#xff0c;跟着一步一步做就可以实现。 没时间的话&#xff0c;先收藏&#xff0c;等有时间了慢慢学&#xff01; 第一步&#xff1a;注册微信公众号测试…

火狐安装低版本hackbar插件

在火狐安装的最新版hackbar插件无法使用&#xff0c;需要付费的许可证。 可以使用旧版本的HackBar HackBar2.1.3版本下载地址&#xff1a;https://github.com/Mr-xn/hackbar2.1.3 下载最后一个文件。 首先移除之前安装的hackbar&#xff0c;再在浏览器的拓展与主题中手动安装…

火狐浏览器插件汇总(VIP典藏版)

Windows超实用技巧50篇博客&#xff08;VIP典藏版&#xff09; 目录 一、进入搜索页面 二、常用插件推荐 1、Adblock Plus 2、OctoTree 3、油猴子 4、video DownloadHelper 5、Screengrab 一、进入搜索页面 位置&#xff1a;设置-附加组件-扩展-寻找更多扩展 二、常用插件推荐 …

渗透测试人员常用的8种火狐插件

目录 1、Max HacKBar 2、FoxyProxy Standard 3、Wappalyzer 4、Shodan 5、User-Agent Switcher and Manager 6、Firefox Multi-Account Containers 7、HTTP Header Live 8、Vulners Web Scanner 如果文章对你有帮助&#xff0c;欢迎关注、点赞、收藏一键三连支持以下哦…

火狐浏览器设置脚本

第一步&#xff0c;打开火狐浏览器&#xff0c;点击如下位置 第二步&#xff0c;进入扩展和主题。 第三步&#xff0c;在搜索框中搜Tampermonkey。 第四步&#xff0c;下载加入拓展&#xff0c;并自动弹出页面。在用户脚本出搜寻你所需要的脚本。

谷歌与火狐Hackbar插件下载与安装

谷歌与火狐Hackbar插件下载与安装 首先下载Hackbar插件&#xff1a;https://github.com/Mr-xn/hackbar2.1.3 将其中的压缩包拖拽到Chrome的扩展程序。 点击详细信息在下面的“来源”处点击一个链接&#xff1a; 会跳转到给插件在Chrome中安装的文件位置&#xff0c;打开hackbar…

火狐浏览器安装AdGuard

火狐浏览器安装AdGuard扩展 由于一些特殊的原因&#xff0c;在国内无法通过火狐扩展商店直接安装AdGuard&#xff0c;在火狐扩展商店虽然能搜索出来 但是我们点击进入之后就会发现如下界面 那到底应该怎么安装呢&#xff1f;我们可以通过以下方法进行安装&#xff1a; 首先通过…

在线手动为火狐浏览器安装AdGuard扩展

在线手动为火狐浏览器安装AdGuard扩展 当你突然想要为火狐浏览器添加广告拦截扩展时&#xff0c;你可能会出现这样一个问题&#xff0c; 要想解决这个问题&#xff0c;可以尝试按以下操作完成添加 1、通过浏览器打开AdGuard扩展的官方主页https://github.com/AdguardTeam/Adg…

火狐浏览器模拟微信浏览器内核教程

众所周知&#xff0c;微信项目html5界面的开发时间会相对较长&#xff08;为什么这么说就不解释了&#xff09;&#xff0c;以及在微信浏览器内会出现一些无法在web端检测出的问题&#xff0c;笔者有 了模拟微信浏览器的想法&#xff0c;google之后&#xff0c;发现有方法来伪装…

设置火狐浏览器firefox模拟微信浏览器客户端,调试网站

首先&#xff0c;打开firefox的“附加组件”&#xff0c;安装“User Agent Switcher “。 第二、设置User Agent Switcher “&#xff0c;在浏览器右上角找到这个插件如图&#xff1a;&#xff0c;打开。 第三、在首选项里&#xff0c;加入下面的agent代码进去。 Mozilla/5.…

Firefox火狐浏览器手动安装OpenH264插件

1.打开openh264官网&#xff1a;www.openh264.org&#xff0c;按指引跳转到&#xff1a;github.com/cisco/openh264/releases&#xff0c;记住最新的版本号&#xff0c;并按自己电脑的操作系统下载最新版本的dll文件&#xff0c;并解压出来。 2.火狐浏览器打开 about:support …

copilot在Pycharm的应用

2023.3.31更新 使用该软件务必将左侧代码文件全部删除&#xff01; 由于被过多人用来使用chatgpt的能力&#xff0c;而非专注于开发&#xff0c;现在该平台已要求注册使用或者提供api key&#xff01;注册后可以继续使用&#xff0c;后续不确定&#xff01;如果觉得麻烦的可以…

阿里张勇:所有行业都值得用大模型重新做一遍!

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 “2023阿里云峰会”于4月11日在北京国际会议中心隆重召开&#xff0c;本次峰会以" 与实俱进 为创新提速&#xff01;"为主题&#xff0c;阿里巴巴集团董事会主席兼首席执行官张勇、阿里云智能集团首席技术官周靖人…

3dsmax烘焙模型

这里只是单纯使得模型贴图具有光影效果&#xff0c;看起来更真实&#xff0c;记录下步骤 工具&#xff1a;3dsmax2014 原模型 加个目标聚光灯 渲染一下看看啥样的 按键盘上的数字0&#xff0c;打开渲染到纹理窗口&#xff0c;选中要烘焙的模型&#xff0c;在输出选项卡点击添加…

unity 灯光烘焙对比

对于基础光照知识不了解的可以点击 这里 测试一 无烘焙&#xff0c;实时光效果如下&#xff1a; 无GI 有GI 测试二&#xff1a; 实时GI光照烘焙&#xff1a; 烘焙结束后无贴图只有光照信息 &#xff0c;帧率略有提升&#xff0c;如果关掉实时光场景会暗淡很多&#xff0c;…