首页 > 其他分享 >半天搞定实时互动AI专属虚拟人

半天搞定实时互动AI专属虚拟人

时间:2023-05-27 10:31:46浏览次数:48  
标签:初始化 搞定 assets filePath AI 虚拟人 虚拟 权限 SDK

概述

即构虚拟形象引擎(Zego Avatar)支持自定义管理人物的虚拟形象,通过默认的虚拟形象或者自定义生成的专有虚拟形象,以表情随动、声音驱动等方式与真人实时互动,可广泛应用于语聊直播、社交互动、在线培训等多种场景中。

半天搞定实时互动AI专属虚拟人_Avatar

即构虚拟形象引擎(Zego Avatar)自定义人物虚拟形象


集成 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。

  1. 请前往 下载
  2. 解压 SDK 压缩包,将 ZegoAvatar 的制品包中的 ZegoAvatar.aar 拷贝至自己的项目目录下,如 “app/libs”。
  3. 半天搞定实时互动AI专属虚拟人_数智人_02

  4. 添加 SDK 引用。进入到 “app” 目录,打开 “build.gradle” 文件,在 “dependencies” 节点引入 “libs” 下所有的 jar。

半天搞定实时互动AI专属虚拟人_元宇宙_03

implementation fileTree(dir: 'libs', include: ['*.jar', "*.aar"]) //通配引入

3 设置权限

根据实际应用需要,设置应用所需权限。

进入 “app/src/main” 目录,打开 “AndroidManifest.xml” 文件,添加权限。

<!-- SDK 必须使用的权限 -->

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

<!-- App 需要使用的部分权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

因为 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);
    }
}


必要性

权限

权限说明

申请原因

必要权限

CAMERA

访问相机权限。

通过摄像头画面推理面部表情时,需要使用该权限。

RECORD_AUDIO

录制音频权限。

通过声音波动推理面部表情时,需要使用该权限。

WRITE_EXTERNAL_STORAGE

内置 SDK 写权限。

SDK 会将日志和相关配置文件保存在内置 SDK 内。需要保存截图或录制的视频时,也需要使用该权限。

非必要权限

INTERNET

访问网络权限。

SDK 鉴权获取时,需要使用该权限。

READ_EXTERNAL_STORAGE

文件读取权限。

SDK 需要读取资源包时,需要使用该权限。

4 防止混淆代码

在 “proguard-rules.pro” 文件中,为 SDK 添加 -keep 类的配置,防止混淆 SDK 公共类名称。

-keep class **.zego.**{*;}


导入资源

使用 Avatar 提供的各项 AI 能力之前,需要导入相应的资源包,请前往 下载

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

(推荐)动态下载

资源名称

说明

资源大小

是否支持

动态下载

建议下载时机

AIModel.bundle

Avatar 的 AI 模型资源。当使用表情随动、声音随动、AI 捏脸等能力时,必须先将该资源的绝对路径设置给 Avatar SDK。

  • 表情随动:8.2 MB
  • 声音随动:2.4 MB
  • AI 捏脸:12.4 MB

必须在 ZegoAvatarService 初始化前完成下载。

base.bundle

美术资源,包含基础 3D 人物模型资源、资源映射表、人物模型默认外形等。

  • Android: 13 MB
  • iOS: 14.4 MB

必须在创建 ZegoCharacterHelper 前完成下载。

Packages

美妆、挂件、装饰等资源。

每个资源 200 KB ~ 1 MB 不等,跟资源复杂度相关。

建议在需要使用相关资源时再去下载,不使用时可不下载,减少对本地存储空间的占用。

Packages 中包含了部分美术资源,开发者如有需要,请联系 ZEGO 商务人员,获取所有的美术资源。

从本地添加

  1. 请前往 下载
  2. 解压获取到的资源包,找到 “assets” 文件夹,拷贝到自己创建项目的 “assets” 文件夹下

半天搞定实时互动AI专属虚拟人_虚拟形象_04

半天搞定实时互动AI专属虚拟人_数字人_05


  1. 运行项目时,将 “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

半天搞定实时互动AI专属虚拟人_数智人_06

5.使用某一功能时,在对应接口中,传入接口要求的资源的 绝对路径 即可。

使用步骤

本节介绍如何使用 ZegoAvatar SDK 实现基本的图像处理功能,API 调用时序如下图:

半天搞定实时互动AI专属虚拟人_数字人_07


1 申请鉴权

ZEGO Avatar 目前使用 在线鉴权 的方式获取 License 授权文件。

1.1 开通 ZegoAvatar 权限

  1. 请先在 ZEGO 控制台 创建项目,并申请有效的 AppID,详情请参考 控制台 - 项目管理
  2. 请联系 ZEGO 商务人员,提供申请到的 AppID,以及自己项目的 Bundle Id,获取鉴权需要使用的 AppSign,并开通相关权限。

1.2 获取参考代码

请将从 下载 获取到的示例源码中的 LicenseHelper 文件夹中的代码,拷贝到自己的项目下。

半天搞定实时互动AI专属虚拟人_数智人_08


  1. 修改 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。

半天搞定实时互动AI专属虚拟人_Avatar_09

1.3 安装依赖库

  1. 打开终端,进入项目根目录,执行 pod 'YTKNetwork',引入依赖库。
  2. 执行 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

  1. 初始化 AvatarService 之前,请先导入以下相关的头文件,准备基础工作。
// 引入 头文件
#import <ZegoAvatar/ZegoAvatarService.h>

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 使用说明

初始化 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];
}

虚拟直播场景为元宇宙社交娱乐模式下的全新直播方式,虚拟形象替代真人出镜,打造不一样的直播体验,支持表情随动、手势识别触发特效等多种玩法;同时场景支持多位虚拟形象视频连麦互动,更容易吸引用户参与连麦互动,提升用户的消费意愿及粘性。获取更多https://doc-zh.zego.im/article/15661


标签:初始化,搞定,assets,filePath,AI,虚拟人,虚拟,权限,SDK
From: https://blog.51cto.com/u_15870111/6353904

相关文章

  • ChatGPT之后,AIGC如何革新数字内容创作
    内容生产,特别是创意工作,一向被认为是人类的专属和智能的体现。牛津大学计算机学院院长迈克尔·伍尔德里奇2019年写作的《人工智能全传》一书中,“撰写有趣的故事”被列为人工智能“远未实现”的任务之一。如今,AI正大步迈入数字内容生产领域。AIGC(AIGeneratedContent)不仅在写......
  • Docker CLI docker container commit常用命令
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。Docker是内核虚拟化,不使用Hypervisor是不完全虚拟化,依赖内核的特性实现资源隔离。本文主要介绍DockerCLI中d......
  • 746. Min Cost Climbing Stairs刷题笔记
    题目描述出bug的时候输出打印dp就行classSolution:defminCostClimbingStairs(self,cost:List[int])->int:n=len(cost)+1ifn<=3:returnmin(cost[0],cost[1])dp=[0]*ncost.append(0)foriinrange(2......
  • 70. Climbing Stairs刷题笔记
    问题描述该题考察的是动态规划classSolution:defclimbStairs(self,n:int)->int:dp=[0]*nifn==1:return1dp[0]=1dp[1]=2foriinrange(2,n):dp[i]=dp[i-1]+dp[i-2]ret......
  • java中的BIO NIO AIO有什么区别?
    BIO、NIO和AIO都是Java中用于处理网络编程的技术,它们的主要区别如下:BIO:BIO(BlockingIO)阻塞式IO,指I/O的读写操作是阻塞的。当读写操作发生时,线程被阻塞,一直等到I/O完成才返回。BIO是Java最早的网络编程API,也是最常用的API。BIO的实现简单,易于理解和使用,但是由于阻塞......
  • 远距离数据采集,来一个远程 IO模块搞定!
    远程IO模块主要用于工业现场采集模拟信号和数字信号,而且还可以输出模拟信号和数字信号来控制设备。可以扩展PLC、采集仪器仪表等数据处理设备的输入和输出口,比如一个PLC只有有10个模拟输入接口,但是现场需要采集30个模拟量,就需要加入远程IO扩展。还有,由于设备和主控PLC或工控机可能......
  • 用好Prompt 可以让AI更智能
    很多人使用AI时不知道怎么提问,问的问题可能不是想要的,那么下面我整出几个例子场景使用Prompt的小技巧进行提问作为广告商预设Prompt我想让你充当广告商。您将创建一个活动来推广您选择的产品或服务。您将选择目标受众,制定关键信息和口号,选择宣传媒体渠道,并决定实现目标所需的任......
  • Coremail与中科曙光达成战略合作 紧抓数字经济大机遇
    5月12日,广东盈世计算机科技有限公司(以下简称:Coremail)与曙光信息产业股份有限公司(以下简称:中科曙光)正式签约合作协议、达成战略合作伙伴关系。Coremail技术副总裁林延中、中科曙光副总裁郭莹等领导出席签约活动,并就未来合作进行了深入探讨。双方将在计算、存储、安全、数据中心等领......
  • airoha芯片
    airoha芯片是什么?不知小伙伴们来看看小编今天的分享吧!airoha是络达芯片,Airoha络达科技成立于2001年,是业界领先的IC设计领先的制造商第一家致力于开发无线通信的高度集成电路,为客户提供高性能、低成本的射频和混合信号集成电路组件,以及蓝牙无线通信芯片,积累了丰富的无线通信射频......
  • 解决:idea执行main方法都要build的情况
    开发代码中,很多时候我们为了验证一小段代码逻辑会直接写个main方法去执行,看看运行结果,最近发现idea跑个main方法都要执行compileJava和build,连最普通的打印hellworld都需要下载maven虽然最终打印出来了,但是也经历了一次build过程。。。 解决方案:请移步:http://124.222.12......