AI数字人SadTalker实战

news2024/11/23 15:50:06

1.概述

AI数字人在营销和品牌推广中扮演着至关重要的角色,许多企业和个人正积极利用数字技术来打造属于自己的财富。有没有一种简单而免费的方式来创建自己的数字人呢?本篇博客笔者将为大家介绍如何搭建属于自己的AI数字人。

2.内容

2.1 什么是SadTalker?

生成头部说话视频通过人脸图像和语音音频仍然面临着多项挑战,包括不自然的头部运动、扭曲的表情和身份的修改。这些问题主要源于对耦合的二维运动场进行学习。另一方面,明确使用3D信息也可能导致表达僵硬和视频不连贯的问题。

为了应对这些挑战,提出了SadTalker模型。该模型从音频中生成3DMM的3D运动系数(包括头部姿势和表情),并通过隐式调制一种新颖的3D感知面部渲染,生成具有说话动作的头部视频。为了学习真实的运动系数,分别对音频和不同类型的运动系数之间的连接进行了显式建模。具体而言,我引入了ExpNet,通过从音频中提取系数和3D渲染的面部,学习准确的面部表情。

对于头部姿势,设计了PoseVAE,通过有条件的变分自编码器合成不同风格的头部运动。最后,生成的3D运动系数被映射到所提出的面部渲染的无监督3D关键点空间,并合成最终的视频。通过大量实验证明了该方法在运动和视频质量方面的卓越性。

2.2 快速安装

GitHub地址:https://github.com/OpenTalker/SadTalker

论文:https://arxiv.org/pdf/2211.12194.pdf

1.环境准备

git clone https://github.com/OpenTalker/SadTalker.git
cd SadTalker 
conda create -n sadtalker python=3.9
conda activate sadtalker
# install torch 2.2
pip install torch torchvision torchaudio
conda install ffmpeg
pip install -r requirements.txt
pip install dlib # macOS needs to install the original dlib.

2.下载模型

执行如下命令,会自动下载模型:

bash scripts/download_models.sh

3.安装深度学习工具包

pip install tts

4.启动

python app_sadtalker.py

3.表情建模

Audio Encoder采用ResNet为主框架的编码器,整合了Wav2Lip模型的音频编码分支。这是一个预训练的编码器,通过微调后续的全连接层即可完成。Wav2Lip的输入包括单张人脸图片和一段音频,输出为仅包含嘴巴动作的图片序列。生成的表情系数与嘴巴相关,有效减少了其他3D系数(特别是头部姿态)对表情系数的影响。

由于现实中的视频通常在三维环境中拍摄,因此三维信息对于提高生成视频的真实性至关重要。然而,之前的研究很少考虑到三维空间,因为仅仅从一张平面图像中很难获取原始的三维稀疏信息,同时设计高质量的面部渲染器也颇具挑战。受到最近单图像深度三维重建方法的启发,研究人员将预测的三维形变模型(3DMMs)的空间表示作为中间表征。在3DMM中,三维脸部形状S可以被解耦为:

在这里,S代表三维人脸的平均形状,而Uid和Uexp则是LSFM morphable模型中身份和表情的正则。系数α(80维)和β(64维)分别描述个体身份和表情。为了维持不同姿势的差异性,系数r和t分别表示头部旋转和平移。为了实现身份无关的系数生成,仅将运动参数建模为{β, r, t}。

换句话说,我们从输入的音频中独立学习头部姿势ρ=[r, t]和表情系数β,然后使用这些运动系数来隐式调制面部渲染,用于最终的视频合成。这个方法保证了生成的视频在维持头部姿势的差异性的同时,实现了身份无关的系数生成,为最终合成的视频提供了更加自然和逼真的效果。

三维运动系数涵盖了头部姿势和表情,其中头部姿势表示全局运动,而表情则是相对局部的。由于头部姿势与音频的关系相对较弱,而嘴唇的运动与音频高度相关,完全学习所有的系数可能给网络带来巨大的不确定性。

因此,SadTalker采用了PoseVAE和ExpNet两个模块,分别用于生成头部姿势和表情的运动。通过这种方式,网络能够更有效地处理头部姿势和表情之间的关系,避免不必要的不确定性,同时更专注于与音频高度关联的嘴唇运动的生成。

4.头部建模

在训练中,我们采用基于编码器-解码器结构的方法对固定数量的帧进行PoseVAE(头部姿势变分自编码器)训练。编码器和解码器都是两层MLP(多层感知机),接受一个包含连续t帧头部姿势的输入,并将其嵌入到高斯分布中。在解码器中,网络从采样分布中学习生成t帧姿势。

值得注意的是,PoseVAE并不直接生成姿势,而是学习第一帧条件下的姿势残差。这一特性使得该方法在测试中能够在第一帧的条件下生成更长、更稳定、更连续的头部运动。

类似于条件变分自编码器(CVAE),PoseVAE在模型中还引入了相应的音频特征和风格标识,用作节奏感知和身份风格的条件。模型使用KL散度来度量生成运动的分布,同时采用均方损失和对抗性损失来确保生成的质量。这样的设计综合考虑了多个因素,提高了生成视频的运动真实性和质量。

 5.人脸合成

在生成真实的三维运动系数后,研究人员采用了一个精心设计的三维图像动画器来渲染最终的视频。最近提出的图像动画方法,如face-vid2vid,能够隐含地从单一图像中学习3D信息,但该方法需要一个真实的视频作为动作驱动信号。而在本论文中提出的脸部渲染方法,通过3DMM系数来驱动。

为了解决这个问题,研究人员引入了mappingNet,该网络被设计用于学习显式的3DMM运动系数(头部姿势和表情)以及隐式的无监督3D关键点之间的关系。这个创新性的方法使得从生成的三维运动系数到最终视频的渲染过程更加精准和可控,为数字图像动画领域带来了新的突破。

通过使用几个一维卷积层,mappingNet建立了一个模型,类似于PIRenderer,它采用时间系数的时间窗口进行平滑处理。与PIRenderer不同的是,研究人员发现在PIRenderer中,人脸对齐的运动系数会显著影响音频驱动的视频生成的运动自然度。因此,mappingNet仅使用表情和头部姿势的系数。

训练阶段包含两个关键步骤:首先,按照原论文的方法,以自监督的方式训练face-vid2vid。然后,在冻结外观编码器、canonical关键点估计器和图像生成器的所有参数之后,使用ground truth视频的3DMM系数对mappingNet进行微调,以重建的方式进行训练。

在无监督关键点的领域中,使用L1损失进行监督训练,并按照其原始实现方式生成最终的视频。这种方法可以提高生成视频的质量和自然度,尤其是在考虑到人脸对齐运动系数对音频驱动的影响的情况下。

6.预览

本地浏览器访问:http://127.0.0.1:7860/

文章转载自:哥不是小萝莉

原文链接:https://www.cnblogs.com/smartloli/p/18033296

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

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

相关文章

内存卡无法读取?这里有救!

一、遭遇内存卡无法读取的困境 在日常生活和工作中,我们越来越依赖电子设备来存储和传输数据。然而,当遇到内存卡无法读取的问题时,很多人会感到困惑和焦虑。无论是重要的工作文件、珍贵的家庭照片,还是其他个人数据,…

基于springboot+vue的音乐网站(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

C++力扣题目 42--接雨水 84--柱状图中最大的矩形

42. 接雨水 力扣题目链接(opens new window) 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释&#xff…

C++17之折叠表达式

相关文章系列 深入理解可变参数(va_list、std::initializer_list和可变参数模版) 目录 1.介绍 2.应用 2.1.使用折叠表达式 2.2.支持的运算符 2.3.使用折叠处理类型 3.总结 1.介绍 折叠表达式是C17新引进的语法特性。使用折叠表达式可以简化对C11中引入的参数包的处理&…

原型设计工具Axure RP

Axure RP是一款专业的快速原型设计工具。Axure(发音:Ack-sure),代表美国Axure公司;RP则是Rapid Prototyping(快速原型)的缩写。 下载链接:https://www.axure.com/ 下载 可以免费试用…

windows安装onlyoffice8.0

安装erlang 安装Erlang25.3 下载地址 设置环境变量 ERLANG_HOME C:\Program Files\Erlang OTP Path下设置%ERLANG_HOME%\bin 打开cmd输入erl不报错即可 安装rabbitmq rabbitmq和erlang对应的关系 下载地址 执行完exe文件后,找到安装目录下的sbin&am…

H12-821_77

77.如图所示的交换网络,所有交换机都运行了STP协议,当拓扑稳定后,在以下哪台交换机上修改配置BPDU的发送周期,可以影响STD配置BPDU的发送周期? A.STC B.SWD C.SWA D.SWB 答案:C 注释: 在根桥上…

MATLAB环境下基于超高斯全自动组织学图像的盲彩色反卷积方法

图像盲反卷积问题仅根据模糊图像估计清晰图像和模糊核,也是一个欠定问题且求解更加困难。但图像盲反卷积算法更实际,因为许多情况下,模糊核都是未知或部分已知的。求解盲反卷积问题需要为未知量选择适当的先验模型,以得到清晰图像…

二叉树与堆

目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用(表示文件系统的目录树结构) 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树: 2.3 特殊的二叉树: 2.4 二叉树的性质 2.5 二叉树的…

基于springboot+vue的二手图书交易平台(源码+论文)

文章目录 目录 文章目录 前言 一、功能设计 二、功能实现 前台系统功能模块分为 后台系统功能模块分为 三、库表设计 四、论文 前言 在互联网上所有产品的分类信息中,电子类的产品信息无疑是最丰富的,一大批电子资讯类网站从中国互联网诞生初期就开始为…

力扣模板题:回文链表

请牢记检测回文串的模板 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ bool isPalindrome(struct ListNode* head) {int size0;struct ListNode* pointhead;while(point){size;pointpoint->next;}int arr…

每日学习-2月22日

知识点:二叉树 二叉树的性质: 二叉树的存储结构: 顺序存储: 用数组存储,tree[ 0 ]处空缺,以便编号与下标一致对标完全二叉树,按序号存储在相应索引的位置 i的左孩子:2i i的右孩…

代码随想录Leetcode416. 分割等和子集

题目&#xff1a; 代码(首刷看解析 2024年2月23日&#xff1a; class Solution { public:bool canPartition(vector<int>& nums) {/*因为数值 < 100, length < 200 , 数值 < 20000*/vector<int> dp(10001, 0);int sum accumulate(nums.begin(), num…

武汉建筑安全员ABC小题库不存在未雨绸缪“时间够”

武汉建筑安全员ABC小题库不存在未雨绸缪“时间够” 关于武汉三类人员&#xff08;安全员ABC&#xff09;考试小题库&#xff0c;一般都是考试时间出来&#xff0c;准考证下来了&#xff0c;匹配题库&#xff0c;好好看题&#xff08;认真练习即可&#xff09;&#xff0c;一般…

校园微社区微信小程序源码/二手交易/兼职交友微信小程序源码

云开发校园微社区微信小程序开源源码&#xff0c;这是一款云开发校园微社区-二手交易_兼职_交友_项目微信小程序开源源码&#xff0c;可以给你提供快捷方便的校园生活&#xff0c;有很多有趣实用的板块和功能&#xff0c;如&#xff1a;闲置交易、表白交友、疑问互答、任务兼职…

C++ 之LeetCode刷题记录(三十四)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 12. 整数转罗马数字 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xf…

操作系统-复试笔记

http://t.csdnimg.cn/PJLWh 操作系统基础 什么是操作系统&#xff1f; 操作系统&#xff08;Operating System&#xff0c;简称 OS&#xff09;是管理计算机硬件与软件资源的程序&#xff0c;是计算机的基石。操作系统本质上是一个运行在计算机上的软件程序 &#xff0c;用于…

Node.js中的错误处理和日志记录

在Node.js应用程序中&#xff0c;错误处理和日志记录是非常重要的方面。正确的错误处理和日志记录可以帮助我们更好地跟踪问题、排查 bug&#xff0c;并提供更好的用户体验。在本篇博客中&#xff0c;我将为大家介绍在Node.js中如何进行错误处理和日志记录&#xff0c;以及一些…

流式存储音频/视频

目录 流式存储音频/视频 1.1 具有元文件的万维网服务器 1.2 媒体服务器 1.3 实时流式协议 RTSP 使用 RTSP 的媒体服务器的工作过程 流式存储音频/视频 “存储”音频/视频文件不是实时产生的&#xff0c;而是已经录制好的&#xff0c;通常存储在光盘或硬盘中。 传统浏览器…

IO进程线程day8作业

信号灯集二次函数封装 sem.c #include<myhead.h>union semun {int val; /* Value for SETVAL */struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */unsigned short *array; /* Array for GETALL, SETALL */struct seminfo *__buf; /* B…