音视频开发之旅(75)- AI数字人进阶--GeneFace++

news2024/11/17 23:38:16

目录

1.效果展示和玩法场景

2.GeneFace++原理学习

3.数据集准备以及训练的过程

5.遇到的问题与解决方案

6.参考资料

一、效果展示

AI数字人进阶--GeneFace++(1)

AI数字人进阶--GeneFace++(2)

想象一下,一个专为你打造的AI数字人,不仅可以代表你在屏幕上出现,还能带来实实在在的商业价值。之前sadtalker照片说话的应用场景不同,定制的视频数字人的应用场景就不仅仅是娱乐,而可以带来更多价值:自媒体运营,短视频带货,数字人直播等等,现在抖音、视频号中看到的刘润等很多视频都是来自于其数字人。

由于其训练成本比较高,现在一般的玩法是提供模板视频任务,用户输入自己的文字或者语音,使用选择的模板生成对应的视频。也可以允许个人上传视频进行定制,单独收费。

二、GeneFace++原理学习

实现高嘴形对齐(lip-sync)、高视频真实度(video reality)、高系统效率(system efficiency)的虚拟人视频合成。

整体架构如下

图片

  1. 首先,处理输入的语音并提取关键特征,音高和语音

  2. 然后,预测说话时面部的动作,特别是嘴唇和面部表情

  3. 最后,这些预测被转换成视频帧,

  4. 通过一系列图像处理技术确保生成的视频真实和清晰

1. 音频处理

系统首先接收输入的语音,有两个关键部分:

  • 音高编码器(Pitch Encoder):这个部分捕捉语音中的音高变化,因为音高(声音的高低)对理解说话者的情感和意图很重要。

  • HuBERT:HuBERT是Facebook开发的一种自监督学习模型,用于音频表示学习。用于从语音中提取更丰富的特征,如语速、重音、语音的节奏等,与音高信息结合,以预测面部动作。

2. 面部动作预测

音频信息会被用来预测人脸的动作,特别是嘴唇和面部表情。这个步骤包括:

  • 音高感知音频到动作模型(Pitch-Aware Audio2Motion):这部分使用前面提取的音频特征来预测面部关键点的动作,关键点是面部的重要部位,如眼角、嘴角等。

  • Landmark LLE Proj:帮助模型理解不同面部关键点之间的关系,并确保预测的动作自然和准确。

3. 视频合成

系统将预测的面部动作转换为实际的视频帧。这一过程包括以下几个部分:

  • 即时动作到视频模型(Instant Motion2Video):把预测的关键点动作转换成连续的视频帧,形成一个可以播放的视频。

  • 超分辨率处理:为了确保生成的视频质量尽可能高,系统会对视频帧进行超分辨率处理,提升图像的清晰度和细节。

  • Volume Renderer:用于渲染三维数据以产生真实感的二维图像,增强视频的真实性。

三、数据集准备以及训练推理的过程

3.1 训练视频的要求

训练视频的质量直接影响了训练的结果,一般有下面几个重要的要求

1. 训练视频最好3-5分钟,每一帧都要人脸,头部要一直面对镜头,不能太偏;

2. 需要对录制视频进行预处理,降噪、音频重采样为16000HZ,视频裁剪为512*512,帧率25fps;

3. 裁剪后的视频要保证 头部在视频中占据相对较大的区域。

4. 推理的音频尽量和训练的语调保持一致,增加真实感

关于预处理部分,前面写了篇文章,提供了预处理脚本,可以直接使用

3.2 数据处理的脚本(音频特征提取、截帧、抠图、人脸landmark提取以及3dmm生成、将数据打包为npy)

export PYTHONPATH=./export VIDEO_ID=xxxexport CUDA_VISIBLE_DEVICES=0
mkdir -p data/processed/videos/${VIDEO_ID}
#音频特征提取(hubert以及mel)python data_gen/utils/process_audio/extract_hubert.py --video_id=${VIDEO_ID}python data_gen/utils/process_audio/extract_mel_f0.py --video_id=${VIDEO_ID}# 截帧、抠图mkdir -p data/processed/videos/${VIDEO_ID}/gt_imgsffmpeg -i data/raw/videos/${VIDEO_ID}.mp4 -vf fps=25,scale=w=512:h=512 -qmin 1 -q:v 1 -start_number 0 -v quiet data/processed/videos/${VIDEO_ID}/gt_imgs/%08d.jpgpython data_gen/utils/process_video/extract_segment_imgs.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4 --force_single_process 

# 提取2D landmark用于之后Fit 3DMMpython data_gen/utils/process_video/extract_lm2d.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4
# Fit 3DMMpython data_gen/utils/process_video/fit_3dmm_landmark.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4 --reset --debug --id_mode=global
# 将数据打包python data_gen/runs/binarizer_nerf.py --video_id=${VIDEO_ID}

3.3 训练模型

需要分为两步,训练Head NeRF (头部)模型和Torso NeRF(躯干)模型

# 训练 Head NeRF 模型# 模型与tensorboard会被保存在 `checkpoints/<exp_name>`CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config=egs/datasets/videoid/lm3d_radnerf_sr.yaml --exp_name=motion2video_nerf/videoid_head --reset
# 训练 Torso NeRF 模型CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config=egs/datasets/videoid/lm3d_radnerf_torso_sr.yaml --exp_name=motion2video_nerf/videoid_torso --hparams=head_model_dir=checkpoints/motion2video_nerf/videoid_head --reset

如果从头开始训练加上-reset,否则去掉即可实现继续上次step继续训练

训练的过程比较耗时,4090显卡,两个模型都训练完大概需要十几个小时,需要注意训练过程中是否有log报错信息(代码中可能会catch,如果出现错误继续执行,可能存在训练模型异常),数据集的准备十分关键,如果准备不到位,很可能就要来来回回折腾很多次。第四节大家会看到一些由于训练视频数据问题导致的奇葩现象。

3.4 推理

推理就很快了,十几秒的视频生成也就十几秒钟的时间

​​​​​​​

推理脚本. (输入音频支持mp3,会重采样为16k)CUDA_VISIBLE_DEVICES=0  python inference/genefacepp_infer.py --head_ckpt= --torso_ckpt=checkpoints/motion2video_nerf/videoid_torso --drv_aud=data/raw/val_wavs/input.mp3 --out_name output.mp4

四、遇到的问题和解决方案

记录有价值的问题和解决方案,避免踩坑

4.1 工程类错误

(1)Inference ERROR: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!

环境问题,按照readme重新创建venv环境

(2)数据处理环节提取图片时卡住

加上 --force_single_process可以解决

python data_gen/utils/process_video/extract_segment_imgs.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4 --force_single_process

https://github.com/yerfor/GeneFacePlusPlus/issues/98

(3) loss_output['ambient_loss'].item() AttributeError

​​​​​​​

Traceback (most recent call last):  File "tasks/radnerfs/radnerf_sr.py", line 293, in _training_step    current_ambient_loss = loss_output['ambient_loss'].item()AttributeError: 'int' object has no attribute 'item'| WARNING: ERROR calculating ambient loss| WARNING: ERROR calculating ambient loss

修改代码兼容即可

​​​​​​​

try:    current_ambient_loss = loss_output['ambient_loss'].item()except AttributeError as e:    current_ambient_loss = loss_output['ambient_loss']

4.2 效果类问题

(1)推理后的视频,人脸直接糊掉了

图片

原因:人脸占的区域太小了,训练后效果很差,我这个视频原始宽高就比较小 544x900的,裁剪为512x512后,人脸区域就是很小,改为256x256就满足要求,但是需要对齐进行超分到512x512再进行训练

(2)推理后画质降低

可以尝试修改lm3d_radnerf_sr.yaml和lm3d_radnerf_torso_sr.yaml中的lambda_lpips_loss ,例如从 0.001 到 0.003。

https://github.com/yerfor/GeneFacePlusPlus/issues/29

五、参考资料

  1. GeneFace++: Generalized and StableReal-Time 3D Talking Face Generation  https://genefaceplusplus.github.io/

  2. 【AI数字人-论文】GeneFace++ https://blog.csdn.net/weixin_42111770/article/details/136052069
  3. GeneFace++:https://github.com/yerfor/GeneFacePlusPlus/tree/main
  4. GeneFace++保姆式训练教程 https://www.bilibili.com/video/BV1xx421f7PV/?spm_id_from=333.788.recommend_more_video.1&vd_source=03a763fa6cf49b01f658f32592f5a6f3
  5. AI数字人方案、多种解决方案全解析 https://www.bilibili.com/video/BV1KC4y137TT/?p=2&spm_id_from=pageDriver
  6. AI 数字人训练GeneFace++ https://www.bilibili.com/video/BV1LB421z76c/?vd_source=03a763fa6cf49b01f658f32592f5a6f3

感谢你的阅读

接下来我们继续学习输出AIGC相关内容,关注公众号“音视频开发之旅”,回复:“数字人” 获取资料,一起学习成长。

欢迎交流

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis3源码深度解析(十一)MyBatis常用工具类(四)ObjectFactoryProxyFactory

文章目录 前言3.6 ObjectFactory3.7 ProxyFactory3.8 小结 前言 本节研究ObjectFactory和ProxyFactory的基本用法&#xff0c;因为它们在MyBatis的源码中比较常见。这里不深究ObjectFactory和ProxyFactory的源码&#xff0c;而是放到后续章节再展开。 3.6 ObjectFactory Obj…

最优算法100例之05-第一个只出现一次的字符

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置。 题解报…

掌握抽象基础之20个必备原则,看完你还不会,你打我

抽象基础之20个必备原则 1. 面向对象编程&#xff08;OOP&#xff09;中抽象原则背后的基本思想是什么&#xff1f;2.抽象和封装的区别&#xff1f;3.提供一个现实生活中说明抽象的例子4.在编程语言中如何实现抽象&#xff1f;5.定义抽象类6.提供一个抽象类的真实世界场景7.解释…

Composer创建ThinkPHP无法获取最新版本的问题

composer安装TP&#xff08;截止目前最新版本为8.0&#xff09; composer create-project topthink/think tp 一开始直接给我安装成TP6了&#xff0c;原因就是我系统的PHP版本不是8.0以上&#xff0c;所以不支持最新的TP版本&#xff0c;就会默认安装之前稳定的版本。解决这个…

25.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-利用全新的通信结构传递消息

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;24.根据配置文件…

备考2025年AMC8竞赛:吃透2000-2024年600道真题(免费赠送真题)

我们继续来随机看五道AMC8的真题和解析&#xff0c;根据实践经验&#xff0c;对于想了解或者加AMC8美国数学竞赛的孩子来说&#xff0c;吃透AMC8历年真题是备考最科学、最有效的方法之一。 即使不参加AMC8竞赛&#xff0c;吃透了历年真题600道和背后的知识体系&#xff0c;那么…

18. 查看帖子详情

文章目录 一、建立路由二、开发GetPostDetailHandler三、编写logic四、编写dao层五、编译测试运行 一、建立路由 router/route.go v1.GET("/post/:id", controller.GetPostDetailHandler)二、开发GetPostDetailHandler controller/post.go func GetPostDetailHand…

SpringBoot3学习记录(有ssm基础)

目录 一、SpringBoot3 介绍 SpringBoot3 简介 SpringBoot3 快速入门 入门总结 1.为什么依赖不需要写版本 2.Startrer&#xff08;启动器&#xff09;是什么 3.SpringBootApplication 二、SpringBoot3 配置文件 统一配置管理 使用yaml配置文件&#xff08;推荐&#x…

Vue的渲染原理

列表渲染 列表渲染 v-for指令写在循环项上&#xff1a;v-for“(一个参数或者两个参数) in/of 要遍历的数组、对象、字符串、指定次数” 遍历数组时参数分别是数组中元素(可以是一个对象)和元素所在下标(从0开始)遍历对象时参数分别是属性值和属性名遍历字符串时参数分别是单…

基于SpringCache实现数据缓存

SpringCache SpringCache是一个框架实现了基本注解的缓存功能,只需要简单的添加一个EnableCaching 注解就能实现缓存功能 SpringCache框架只是提供了一层抽象,底层可以切换CacheManager接口的不同实现类即使用不同的缓存技术,默认的实现是ConcurrentMapCacheManagerConcurren…

Redisson分布式锁解决方案

官方地址 官网: https://redisson.org github: https://github.com/redisson/redisson 基于setnx实现的分布式锁存在的问题 redisson分布式锁原理 不可重入: 利用hash结构记录线程id和重入次数不可重试: 利用信号量和PubSub功能实现等待、唤醒, 获取锁失败的重试机制超时释放…

监听抖音直播间的评论并实现存储

监听抖音直播间评论&#xff0c;主要是动态监听dom元素的变化&#xff0c;如果评论是图片类型的&#xff0c;获取alt的值 主要采用的是MutationObserver&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver index.js如下所示:function getPL() {…

29网课交单平台源码最新修复全开源版本

去除论文编辑 去除强国接码 修复上级迁移 修复聚合登录 修复支付不回调 优化支付接口兼容码/易支付 优化MySQL表&#xff0c;提高网页加载速度 下载地址&#xff1a;https://pan.xunlei.com/s/VNstLrJaRtbvDyovPQ-CbISOA1?pwd622t#

数字人基础 | 3D手部参数化模型2017-2023

楔子: 2017年年底的泰国曼谷, SIGGRAPH Asia会议上, 来自马普所的 Javier Romero, Dimitrios Tzionas(两人都是 Michael J. Black的学生)发布了事实性的手部参数化模型标准: MANO [1]。 MANO的诞生意味着 Michael J. Black团队在继人体参数化模型 SMPL后, 事实性的将能够表达人…

【正则表达式】正则表达式里使用变量

码 const shuai No My Name Is ShuaiGe.match(new RegExp(shuai, gi)); //↑↑↑↑↑↑↑↑ //等同于 //↓↓↓↓↓↓↓↓ /No/.test(My Name Is ShuaiGe)用作领域 搜索的字符动态改变&#xff0c;例如↓模糊搜索例&#xff1a; 一个文本宽&#xff0c;输入文本模糊搜索用户…

【哈希映射】【 哈希集合】 381. O(1) 时间插入、删除和获取随机元素 - 允许重复

作者推荐 视频算法专题 本文涉及知识点 哈希映射 哈希集合 LeetCode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复 RandomizedCollection 是一种包含数字集合(可能是重复的)的数据结构。它应该支持插入和删除特定元素&#xff0c;以及删除随机元素。 实现 Randomiz…

【漏洞复现】金和OA viewConTemplate.action RCE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

XIAO ESP32S3部署Edge Impulse模型

在上一篇文章中我们介绍了如何使用edge impulse训练一个图片分类模型并导出arduino库文件。在这篇文章中我们将介绍如何在esp32s3中部署这个训练好的图片分类模型。 添加进Arduino库 有两种方法将下载的文件添加进Arduino库。 在Arduino IDE程序中&#xff0c;转到项目选项卡…

php apache 后台超时设置

最近在写一个thinkphp项目的时候&#xff0c;发现Ajax从后端请求数据时间比较长&#xff0c;大概需要45秒左右&#xff0c;但是一旦请求时间超过40s&#xff0c;页面就会超时500了&#xff0c;一开始以为是ajax请求时间不能太长&#xff0c;后来将Ajax请求改为同步且timeout设置…

景联文科技:提供行业垂直大模型训练数据

近年来&#xff0c;以大模型为代表的人工智能技术已成为国家科技实力竞争的焦点。其中垂直大模型作为重要方向&#xff0c;在相关政策引导及市场需求的驱动下&#xff0c;已展现出较强的发展活力。 行业垂直大模型是针对特定行业的需求和场景进行深度定制的。这意味着模型在训练…