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

目录

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相关内容,关注公众号“音视频开发之旅”,回复:“数字人” 获取资料,一起学习成长。

欢迎交流

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DVWA 靶场搭建

文章目录 1 DVWA 简介2 DVWA 安装 1 DVWA 简介 DVWA&#xff08;Damn Vulnerable Web App&#xff09;是一个基于 “PHP MySQL” 搭建的Web应用程序&#xff0c;皆在为安全专业人员测试自己的专业技能和工具提供合法的环境&#xff0c;帮助Web开发者更好地理解Web应用安全防范…

fs模块 文件写入 之 异步写入与同步写入

一、fs模块介绍&#xff1a; fs&#xff08;file system&#xff09;模块是nodejs提供的用于访问本地文件系统的功能模块&#xff0c;它使得运行于nodejs环境下的JavaScript具备直接读写本地文件的能力。 fs模块是nodejs的核心模块之一&#xff0c;只要安装了nodejs&#xff…

华为配置OSPF的Stub区域示例

配置OSPF的Stub区域示例 组网图形 图1 配置OSPF Stub区域组网图 Stub区域简介配置注意事项组网需求配置思路操作步骤配置文件 Stub区域简介 Stub区域的ABR不传播它们接收到的自治系统外部路由&#xff0c;在Stub区域中路由器的路由表规模以及路由信息传递的数量都会大大减少…

【C++】string进一步介绍

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 迭代器2.1 反向迭代器2.2 const对象迭代器 3. Capacity3.1 size和length3.2 max_size3.3 capacity3.4 clear3.5 shrink_to_fit &#xff08;了解即可&#xff09;3.6 reserve3.7 resize 4. Element access4…

一台服务器部署两个独立的mysql实例

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

STM32平替GD32有多方便

众所周知, GD32一直模仿STM32,从未被超越。 我最近公司使用的GD32E230C6T6 这款芯片有48个引脚。 属于小容量的芯片。 我有一个用STM32写的代码,之前是用的 STM32F103CB 这款芯片是中容量的。 不过在keil中,只需要这两步,就能使用原来的逻辑,几乎不用修改代码。 1. …

【Swing】Java Swing实现省市区选择编辑器

【Swing】Java Swing实现省市区选择编辑器 1.需求描述2.需求实现3.效果展示 系统&#xff1a;Win10 JDK&#xff1a;1.8.0_351 IDEA&#xff1a;2022.3.3 1.需求描述 在公司的一个 Swing 的项目上需要实现一个选择省市区的编辑器&#xff0c;这还是第一次做这种编辑器&#xf…

【数据结构】二叉树OJ题目

965. 单值二叉树 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;[1,1,1,1,1,null,1] 输出&#xff1a;true示例 2&#x…

考研复试C语言篇

第一章 概述 1.1什么是程序 为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的合集。 1.4C语言的特点 代码级别的跨平台&#xff1a;由于标准的存在&#xff0c;使得几乎同样的C代码可用于多种操作系统&#xff0c;也适用于多种机型。使允许直接访问物理地址…

Java基础 - 9 - 集合进阶(一)

集合是一种容器&#xff0c;用来装数据的&#xff0c;类似于数组&#xff0c;但集合的大小可变&#xff0c;开发中非常常用 为了满足不同的业务场景需求&#xff0c;Java除了ArrayList还提供了很多不同特点的集合给我们选择 一. 集合的体系结构 集合可以分为两类&#xff1a;…

案例--某站视频爬取

众所周知&#xff0c;某站的视频是&#xff1a; 由视频和音频分开的。 所以我们进行获取&#xff0c;需要分别获得它的音频和视频数据&#xff0c;然后进行音视频合并。 这么多年了&#xff0c;某站还是老样子&#xff0c;只要加个防盗链就能绕过。&#xff08;防止403&#xf…

Git之版本回退

文章转载于&#xff1a;https://www.jianshu.com/p/3020740561a8 以前&#xff0c;如果是要去除某一块功能&#xff0c;我都是选择性删除&#xff0c;选择性注释&#xff0c;然后前后逻辑各种查看&#xff0c;各种比较。每一次&#xff0c;改完这些我总感觉心好累啊&#xff01…

Prompt进阶3:LangGPT(构建高性能质量Prompt策略和技巧2)--稳定高质量文案生成器

Prompt进阶3:LangGPT(构建高性能质量Prompt策略和技巧2)–稳定高质量文案生成器 1.LangGPT介绍 现有 Prompt 创建方法有如下缺点&#xff1a; 缺乏系统性&#xff1a;大多是细碎的规则&#xff0c;技巧&#xff0c;严重依赖个人经验缺乏灵活性&#xff1a;对他人分享的优质 …

数据结构 day2

1:思维导图 2&#xff1a;计算结构体大小 3&#xff1a;大小端存储 &#xff08;1&#xff09;&#xff1a;数据溢出 1 #include <stdio.h>2 #include <string.h>3 #include <stdlib.h>4 int main(int argc, const char *argv[])5 {6 short a 0x1234;…

STM32输入捕获频率和占空比proteus仿真失败

这次用了两天的时间来验证这个功能&#xff0c;虽然实验没有成功&#xff0c;但是也要记录一下&#xff0c;后面能解决了&#xff0c;回来再写上解决的办法&#xff1a; 这个程序最后的实验结果是读取到的CCR1和CCR2的值都是0&#xff0c;所以没有办法算出来频率和占空比。 还…

FPGA - 单总线协议(one-wire)

1&#xff0c;简介 单总线&#xff08;one-wire&#xff09;是美国 DALLAS 公司推出的外围串行扩展总线技术&#xff0c;与 SPI、I2C 等串行数据通信方式不同&#xff0c;它采用单根信号线&#xff0c;既传输时钟又传输数据&#xff0c;而且数据传输是双向的。它具有节省 I/O口…

数据结构中的平衡搜索树 --- 红黑树 (如何旋转与变色)

目录 红黑树的概念 红黑树的性质 红黑树节点的定义 红黑树的插入 1. 按照二叉搜索的树规则插入新节点 2. 检测新节点插入后&#xff0c;红黑树的性质是否造到破坏 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的农作物害虫检测系统(深度学习模型+UI界面+训练数据集)

摘要&#xff1a;开发农作物害虫检测系统对于提高农业生产效率和作物产量具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个农作物害虫检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0…

Linux——多线程

目录 线程概念 线程控制 线程创建 进程 vs 线程 线程异常 线程等待 线程终止 pthread_cancel 进程替换 线程分离 线程互斥 mutex mutex接口 mutex的理解 互斥锁的实现 可重入和线程安全 死锁 什么是死锁 死锁产生的必要条件 避免死锁 线程同步 概念 条件…

论坛管理系统|基于Spring Boot+ Mysql+Java+B/S架构的论坛管理系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 目录 前台功能效果图 管理员功能登录前台功能效果图 用户功能模块 系统功能设计 数据库E-R图设计 l…