【数字人】1、SadTalker | 使用语音驱动单张图片合成视频(CVPR2023)

news2024/12/26 9:24:55

在这里插入图片描述

Sad Talker:使用一张图片和一段语音来生成口型和头、面部视频

论文:SadTalker: Learning Realistic 3D Motion Coefficients for Stylized Audio-Driven Single Image Talking Face Animation

代码:https://github.com/Winfredy/SadTalker

出处:CVPR2023 | 西安交大、腾讯、蚂蚁

时间:2023.03

贡献:

  • 提出了 SadTalker,能够输入一个图片和一段音频来实现 talking head vedio 的生成
  • 将 3DMM 的 motion coefficient 作为中间表达,通过 ExpNet 和 PoseVAE 来分别生成更真实的表情和 head pose,以得到更真实的 3D 系数
  • 使用更真实的 3D 系数来构建 3D-aware face render,得到更真实的 talking vedio

在这里插入图片描述

Talking Head 的模式:

  • Talking head 有两种模式,一种是输入语音+图片,还有一种是输入文本+图片,输入文本+图片就需要一个 TextToSpeech 的部件来将文本转换为语音,整体来说 Talking head 就是用语音驱动每一帧图片的表情(眼睛、嘴巴等)和头部(head motion)运动,并重建人脸以生成视频

SadTalker 的主要部件如下,下图不是绝对严格的流程图,只是一个大概的图示例而已:

请添加图片描述

一、背景

使用语音来驱动一张静态的图片生成动态的视频一直是很有挑战的工作,但其又有很多应用场合,比如数字人的生成或语音会议等。

之前的一些方法主要是聚焦于生成唇部运动模式(lip motion),因为唇部动作和发音的关系是最紧密的,还有一些方法生成 head pose 的的动作。

上述的方法主要通过 landmark 和 latent warping 引入 2D motion fields。但是生成的 vedios 还是不够自然和真实,主要问题:

  • preference pose [17, 51]
  • month blur [30]
  • identity modification [39, 40]
  • distorted face [39, 40, 49]

想要生成一个看起来比较自然的 talking head vedio 还是面临着很多的挑战,主要是由于不同的发音会对应不同的动作,唇部动作(lip movement)和发音的关系是最大的,其次还有头部动作(head poses)和眨眼动作(eye blink)等。

所以,基于脸部 landmark 的方法会产生变形扭曲的脸部结果,因为没有将 head motion 和 expression 完全解耦开来。

本文中,作者的出发点在于,3D facial model 包含了高度解耦的表达,并且可以被用于单独学习每种 motion

本文提出的方法是:SadTalker:Stylized Audio-Driven Talking-head video generation system

具体做法:

  • 将 3DMM(3D Morphable Models)的运动系数看做中间表达,将整个任务划分成两部分
  • 第一部分:作者的主要目的是从语音中生成更加真实的运动系数(如 head pose、lip motion、eye blink),并且每个系数是单独学习的,这样会解耦来降低不确定性
    • 表情:作者设计了一个 audio to express coefficient network
    • head pose:使用了一个 conditional VAE 来建模多样且自然的 head motion
  • 第二部分:生成了 3DMM 系数后,会做从原本的图片建立 3D 人脸,然后再生成最后的视频

训练的时候会分模型训练,在推理的时候是 end-to-end 的模式

二、方法

本文框架如图 2 所示,使用 3D motion coefficient 作为 talking head 生成的中间表达特征

  • 首先,从原图中抽取 coefficients
  • 然后,分别使用 ExpNet 和 PoseVAE 来生成真实的 3DMM motion coefficients
  • 最后,使用 3D-aware face render 来生成 talking head vedio
    在这里插入图片描述

2.1 3D Face Model

3D 信息对提升生成的 vedio 的真实性是很重要的,因为真实的 vedio 是在 3D 环境下采集的

之前的方法很少考虑到 3D 空间,因为从单个图片中获得 3D coefficient 是很困难的,且高质量的 face render 很难设计。

所以本文作者参考了从单张图来重建 3D 的方法 [5],且把预测出的三维模型 3D Morphable Models (3DMMs) 看做中间变量的表达

在 3DMM 中,3D face shape S 被解耦如下:

在这里插入图片描述
在这里插入图片描述

  • S ˉ \bar{S} Sˉ 表示 3D face 的 average shape
  • U i d U_{id} Uid 表示 LSFM morphable model 的 identity orthonormal basis
  • U e x p U_{exp} Uexp 表示 LSFM morphable model 的 expression orthonormal basis
  • α \alpha α β \beta β 分别是 person identity 和 expression

motion 系数: β , r , t \beta, r, t β,r,t

  • head pose: ρ = [ r , t ] \rho=[r,t] ρ=[r,t],r 和 t 分别表示 head rotation 和 translation
  • expression coefficients: β \beta β

2.2 motion 系数如何通过声音来生成

motion 系数包含两部分:head pose 和 expression

  • head pose:是 global motion
  • expression:是相对 local 的

所以,如果一起学习这些参数的话,会引入很多的不确定性,因为 head pose 其实和声音的关系比较弱,lip motion 和声音的关系比较强

  • head pose:使用 PoseVAE 来生成运动系数
  • expression:使用 ExpNet 来生成运动系数

1、ExpNet:

学习一个通用的模型来从声音来产生 expression coefficient 是比较难的,主要原因有两个:

  • audio-to-expression 对于不同的个体来说不是一对一的映射任务
  • 在 expression(表情)中,有很多和 audio 不相关的动作,也会影响预测的准确性
  • ExpNet 的提出就是为了降低这些不确定性

ExpNet 是怎么做的:

  • 通过第一帧的 expression coefficient β 0 \beta_0 β0 来将 expression motion 和 specific person 进行关联
  • 为了降低在说话过程中其他面部部位的影响,作者只使用 lip motion coefficient 作为 target coefficient。
  • 其他不是很重要的面部动作(如眨眼)会使用额外的 landmark loss 来训练

在这里插入图片描述

如图 3 所示:

  • 作者从 audio window a { 1 , . . . , t } a_{\{1,...,t\}} a{1,...,t} 中生成 t 帧 expression coefficient,每帧的 audio 特征是 0.2s mel-spectrogram
  • 首先,使用audio encoder(ResNet-based, P h i A Phi_A PhiA)将 audio feature 编码到隐空间
  • 然后,使用一个线性层(mapping, P h i M Phi_M PhiM)来解码出 expression coefficient,同时会在 Mapping 中引入 β 0 \beta_0 β0 来降低不确定性,此外还会引入一个眨眼睛控制信号 z b l i n k ∈ [ 0 , 1 ] z_{blink} \in [0,1] zblink[0,1] 和对应的 eye landmark loss 来生成控制眨眼睛的信号

整个 ExpNet 的结构可以写成如下的形式:

在这里插入图片描述

loss 函数:

  • 首先,使用 L d i s t i l l L_{distill} Ldistill 来衡量 lip expression coefficient R e R_e Re 和生成的 β { 1 , . . . , t } \beta_{\{1,...,t\}} β{1,...,t} 的不同。这里的 R e R_e Re 是将第一帧 I 0 I_0 I0 和 audio window a { 1 , . . . , t } a_{\{1,...,t\}} a{1,...,t} 输入锁住的 wav2lip 中得到的,这样主要是为了降低 pose 变化和面部其他部位带来的影响
  • 然后,还使用了 differentiable 3D face render R d R_d Rd 来计算额外的 loss,如图 3 ,计算 landmark loss 来衡量 eye blink 和整个面部的准确性,同时,还使用了一个训练好的 lip reading network

2、PoseVAE

如图 4 所示,这里使用了一个 VAE based 模型来学习更真实的 head movement ρ ∈ R 6 \rho \in R^6 ρR6

训练时, pose VAE 在固定 n 帧上使用 encoder-decoder 的结构进行训练

encoder 和 decoder 都是两层 MLP 结构,输入包含连续 t 帧 head pose ,且假设其服从高斯分布。

decoder 中,网络学习的目标是从分布中通过采样来生成 t 帧 pose ,但不是直接生成 pose,而是学习和第一帧 pose ρ 0 \rho_0 ρ0 的残差,这样能保证生成的 pose 更连续、稳定、一致,所以也叫 conditional VAE,这里的 conditional 就是第一帧的 head pose。

此外,还将每个声音的特征 a { 1 , . . . , t } a_{\{1,...,t\}} a{1,...,t} 和 style identity Z s t y l e Z_{style} Zstyle 作为条件来作为 identity style。

KL 散度用于衡量生成的 motion

MSE 和 GAN loss 用于保证生成的质量
在这里插入图片描述

2.3 3D-aware Face Render

生成了 3D motion coefficient 后,需要通过面部渲染来得到最后的 3D-aware image animator

作者受启发于 face-vid2vid[42],这个方法能够实现从单张图中学习隐含的 3D 信息。

可以使用 3DMM coefficient 来驱动 face render,如图 5 所示

所以,本文在此处提出了 mappingNet 来学习 3DMM motion coefficient (head pose 和 expression)和隐式无监督 3D keypoints 的关系。

训练分为两步:

  • 第一步:如原始论文中那样使用自监督模式来训练 face-vid2vid
  • 第二步:冻结训练好的 appearance encoder,canonical keypoints estimator,image generator 进行 tuning。然后,以重建的方式在 gt 视频的 3DMM 系数上训练 mapping net。使用 L1 损失和最终生成的视频按照其原始实现在无监督关键点领域进行监督。

三、效果

3.1 数据集

训练数据集:

  • 使用 VoxCeleb 数据集来训练,包括超过 10w 的 vedios(1251 subjects)
  • 对输入视频 resize 到 256x256,预处理后,会用于训练 FaceRender。由于 VoxCeleb 中的一些视频和音频是没有对齐的,所以作者选了 1890 个对齐的视频和音频(46 subjects)来训练 PoseVAE 和 ExpNet,输入的音频被下采样到 16kHz,并且处理的和 Wav2lip 的方式一样

测试数据集:

  • 从 HDTF 中选择了 346 个视频的前 8s 的视频(共约 7w 帧)
  • 视频也同样被 resize 为 256x256,也是使用每个视频的第一帧作为参考图像来生成视频

3.2 训练细节

训练:

  • ExpNet, PoseVAE 和 FaceRender 都是分开训练的,都使用的 Adam 优化器,学习率分别为 2 e − 5 2e^{-5} 2e5 1 e − 4 1e^{-4} 1e4 2 e − 4 2e^{-4} 2e4
  • 3DMM 参数是从训练好的 3D 人脸重建方法 [5] 中得到的
  • ExpNet:使用连续的 5 帧来学习
  • PoseVAE:使用连续 32 帧来学习
  • FaceRender:使用 5 个连续帧的系数来一帧一帧生成的

推理:端到端的推理

3.3 测评指标

  • FID: Frechet Inception Distance,衡量生成帧的写实性
  • CPBD: cumulative probability blur detection,衡量生成帧的分辨率
  • CSIM:cosine similarity,衡量对每个个体特点的保留度,也就是对比 source image 和 生成的帧的相似性,使用的 ArcFace 提取每个图片的 embedding 来计算余弦相似度来衡量
  • LSE-D(distance score) 和 LSE-C(confidence score):,衡量 lip 同步性和 mouth shape,主要是从 wav2lip 得到的 mouth shape 的不同
  • head motions:使用 Hopenet 计算得到的生成帧的 head motion embedding 的标准差
  • Beat Align Score:用于计算音频和生成的 head motion 的对齐

3.4 和 SOTA 的对比

和多种不同的方法类别进行了对比:

  • talking head video generation SOTA:MakeItTalk、Audio2Head、
  • audio to expression generations:Wav2Lip、PC-AVS

如表 1 所示,本文提出的方法在视频质量、头部动作多样性上都表现的更好,且在 lip synchronization(唇部同步性)上和其他 talking head generation methods 都有相当的效果

在这里插入图片描述

如图 6 所示,作者在视觉上展示了唇部同步性的效果,本文的方法在视觉观察上和真值的同步性最好,Wav2Lip 的下半张脸被模糊了,PC-AVS 和 Audio2Head 能艰难的维持面部个体特征,且 Audio2Head 只会产生正面的脸,MakeItTalk 和 Audio2Head 由于使用的 2D warping 所以脸部会扭曲。

在这里插入图片描述

作者还做了一个 user studies 来让 20 位人员来对不同方法生成的 20 个视频进行评选,让这些人员根据视频锐度、唇部同步性、头部动作多样性和自然性、整体的质量来对这些视频进行评分,38% 的人认为本文的方法的唇部同步性比其他方法好

在这里插入图片描述

3.5 消融实验

1、ExpNet 的消融实验

如图 7 和表 3 所示,联合学习 motion coefficient 很难生成看起来真实的 talking head vedios

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2、PoseVAE 的消融实验

在这里插入图片描述

3、FaceRender 的消融实验

在这里插入图片描述

3.6 局限性

尽管本文方法能够使用单个图像和语音来生成较为真实的视频,但也有一些局限性

由于 3DMM 不能建模眼睛和牙齿的变化,所以 FaceRender 中的 mappingNet 不能合成看起来真实的牙齿,但这个局限性可以通过 blind face restoration networks[43] 来提升,如图 10 所示

另外一个局限性是本文的方法只考虑了 lip motion 和 eye blinking,没有考虑其他面部表情,如情绪和眼神看的方向,所以生成的视频的人物的表情是固定的,会降低一定的真实性

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

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

相关文章

Linux命令200例:dip用于用户与远程主机建立通信连接

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师&#xff0…

Stable DIffusion 炫酷应用 | AI嵌入艺术字+光影光效

目录 1 生成AI艺术字基本流程 1.1 生成黑白图 1.2 启用ControlNet 参数设置 1.3 选择大模型 写提示词 2 不同效果组合 2.1 更改提示词 2.2 更改ControlNet 2.2.1 更改模型或者预处理器 2.2.2 更改参数 3. 其他应用 3.1 AI光影字 本节需要用到ControlNet,可…

6.前端·新建子模块与开发(常规开发)

文章目录 学习资料常规开发创建组件与脚本菜单创建-新增自定义图标菜单创建-栏目创建 学习资料 https://www.bilibili.com/video/BV13g411Y7GS?p12&vd_sourceed09a620bf87401694f763818a31c91e 常规开发 创建组件与脚本 首先新建前端的目录结构,属于自己业…

CTF 全讲解:[SWPUCTF 2022 新生赛]webdog1__start

文章目录 参考环境题目learning.php信息收集isset()GET 请求查询字符串全局变量 $_GET MD5 绕过MD5韧性脆弱性 md5()弱比较隐式类型转换字符串连接数学运算布尔判断 相等运算符 MD5 绕过科学计数法前缀 0E 与 0e绕过 start.php信息收集头部检索 f14g.php信息收集 探秘 F1l1l1l1…

Springboot 实践(18)Nacos配置中心参数自动刷新测试

前文讲解了Nacos 2.2.3配置中心的服务端的下载安装,和springboot整合nacos的客户端。Springboot整合nacos关键在于使用的jar版本要匹配,文中使用版本如下: ☆ springboot版本: 2.1.5.RELEASE ☆ spring cloud版本 Greenwich.RELEASE ☆ sp…

Python 算数运算符

视频版教程 Python3零基础7天入门实战视频教程 Python支持所有的基本算术运算符,这些算术运算符用于执行基本的数学运算,如加、减、乘、除和求余等。下面是7个基本的算术运算符。 以下,假设变量a为10,变量b为21: 实…

OpenCV之YOLOv3目标检测

💂 个人主页:风间琉璃🤟 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 目录 前言 一、预处理 1.获取分类名 2.获取输出层名称 3.图像尺度变换 二…

【JavaSE笔记】初识Java

一、前言 Java是一种非常优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。 本文将通过一个简单的Java程序,介绍Java的一些基础内容。 二、Java基本结构 1、简单的Java程序 从最简单的一个Java程序开始逐渐了解Java语言。 以下是一段…

数学建模——微分方程介绍

一、基础知识 1、一阶微分方程 称为一阶微分方程。y(x0)y0为定解条件。 其常规求解方法: (1)变量分离 再两边积分就可以求出通解。 (2)一阶线性求解公式 通解公式: 有些一阶微分方程需要通过整体代换…

echarts的折线图,在点击图例后,提示出现变化,不报错。tooltip的formatter怎么写

在点击图例的年后,提示框会相应的变化,多选和单选都会响应变化。tooptip的重度在formatter tooltip:{show:true,trigger:"axis",alwaysShowContent:true,triggerOn:"mousemove",textStyle:{color:"#fff"},backgroundColor…

结构体-时间的计算

任务描述 本关任务需要你编写函数计算一个时间之前“xx小时xx分xx秒”的时间是多少。 以24小时制的格式记录当前时间,譬如“09:19:52”,表示上午9点19分52秒,则“1小时20分30秒”前的时间应该是“同一天”的“07:59:22”。 提示:…

Scapy 解析 pcap 文件从HTTP流量中提取图片

Scapy 解析 pcap 文件从HTTP流量中提取图片 前言一、网络环境示例二、嗅探流量示例三、pcap 文件处理最后参考 ​ 作者:高玉涵 ​ 时间:2023.9.17 10:25 ​ 环境:Linux kali 5.15.0-kali3-amd64,Python 3.11.4,scapy…

解决Springboot使用Junit测试时对数据库的修改无效

现象 在使用Junit做单元测试的过程中,比如对mybatis的dao进行单元测试,发现对数据库的select操作正常,可以获取数据,但insert、update、delete操作即使运行不报错,仍然不能不能对数据产生修改和插入。 原因和解决 原…

d3dx9_42.dll丢失修复指南,如何修复丢失的d3dx9_42.dll文件

d3dx9_42.dll是DirectX 9的一个动态链接库文件,它是许多游戏和软件的必需组件。如果缺少这个文件,可能会导致程序无法正常运行。本文将详细讲解d3dx9_42.dll的作用以及丢失的原因,并提供5种修复方法。 一、d3dx9_42.dll的作用 1. d3dx9_42.d…

IDEA创建完Maven工程后,右下角一直显示正在下载Maven插件

原因: 这是由于新建的Maven工程,IDEA会用它内置的默认的Maven版本,使用国外的网站下载Maven所需的插件,速度很慢 。 解决方式: 每次创建 Project 后都需要设置 Maven 家目录位置(就是我们自己下载的Mav…

操作系统学习笔记-精简复习版

文章目录 操作系统概述1、操作系统2、主要功能3、用户态和内核态4、系统调用 进程管理1、进程和线程2、引入线程的好处3、线程间同步4、进程控制块 PCB5、进程的状态6、进程的通信方式7、进程的调度算法8、僵尸进程&孤儿进程9、死锁 内存管理1、内存碎片2、内存管理3、虚拟…

2023面试知识点一

1、新生代和老年代的比例 默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) 1/3 的堆空间大小。老年代 ( Old ) 2/3 的堆空间大小。其中,新生代 ( …

WebGoat搭建和Yakit学习

环境搭建 jdk版本:openjdk version "17.0.5“ WebGoat版本:webgoat-server-8.1.0.jar 环境不同有很大可能不能搭建成功 运行命令:java -jar webgoat-server-8.1.0.jar --server.port8888 --server.address192.168.142.131 搭建完成后…

SOLIDWORKS Composer位置关键帧的使用

SOLIDWORKS Composer是专业的SOLIDWORKS及3D文件处理的动画制作软件,作为SOLIDWORKS 产品线下的一个明星存在。 SOLIDWORKS Composer几乎可以处理任何SOLIDWORKS的模型文件并将之转化成可以动作的机械动画,可以引用在企业的网站、产品说明书以及工作指导…

卡尔曼滤波(Kalman Filter)原理浅析-数学理论推导-1

目录 前言数学理论推导1. 递归算法2. 数学基础结语参考 前言 最近项目需求涉及到目标跟踪部分,准备从 DeepSORT 多目标跟踪算法入手。DeepSORT 中涉及的内容有点多,以前也就对其进行了简单的了解,但是真正去做发现总是存在这样或者那样的困惑…