关于音视频:元宇宙场景技术实践|实现虚拟人自由

39次阅读

共计 8084 个字符,预计需要花费 21 分钟才能阅读完成。

虚构形象是虚拟世界的外围资产,也是打造元宇宙社交的数字名片,从虚构形象为切入点,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。
  
![](https://img-blog.csdnimg.cn/img_convert/4d7aba69e332476d2803a6fcabeee079.png)

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{
    // 创立 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];
}

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

ZEGOAvatar demo 展现

正文完
 0