草庐IT

SadTalker(CVPR2023)-音频驱动视频生成

‘Atlas’ 2024-03-26 原文

文章目录


论文: 《SadTalker: Learning Realistic 3D Motion Coefficients for Stylized Audio-Driven Single Image Talking Face Animation》
github: https://github.com/Winfredy/SadTalker
演示效果: https://www.bilibili.com/video/BV1fX4y1675W

摘要

利用一张面部图片及一段音频让其变为一段讲话的视频仍然存在许多挑战:头部运动不自然、表情混乱、人物外表发生变化。作者认为这主要是由于耦合2D运动场导致,但是使用3D信息有的方法也会出现表达混乱、视频不连贯问题。
因此作者提出SadTalker,生成3DMM的三维(头部姿势、表情)系数,利用三维面部渲染器进行视频生成。为了学习逼真的运动场系数,作者建模音频与不同类别运动场系数之间联系。作者提出ExpNet,蒸馏运动场系数与三维渲染人脸学习准确面部表情对于头部姿势,作者设计PoseVAE生成不同风格头部动画。最终生成的三维运动场系数映射至面部渲染器的三维关键点空间进行生成视频。

算法

如图2,作者使用3D运动系数作为中间结果用于头部讲话视频生成。首先从原始图片提取相关系数,利用ExpNet及PoseVAE分别生成3DMM运动系数,最后利用三维面部渲染器生成视频。

3.1. Preliminary of 3D Face Model 3D

在3DMM中,三维面部shape S可解耦为式1,

其中 S ‾ \overline S S表示3D人脸平均shape, U i d U_{id} Uid表示形状正交基, U e x p U_{exp} Uexp表示表达正交基,α、β为相关系数。为保留姿态变化,系数r、t分别表示头部旋转及变换;为了使得参数与人体解耦,作者利用音频仅建模参数 β , r , t {β, r, t} β,r,t,其中头部姿势参数 ρ = [ r , t ] ρ = [r, t] ρ=[r,t],这些参数用于调制面部渲染器生成最终视频。

3.2. Motion Coefficients Generation through Audio

**头部姿势是全局姿态而表情是局部相关,因此一起学习将导致巨大不确定,音频与头部姿态弱相关而与嘴唇变换强相关,**因此作者使用PoseVAE生成头部姿态相关系数,ExpNet生成表情相关系数。

ExpNet

通过音频生成准确表情相关参数有两个难点:
1、不同人体音频到表情有不同表现;
2、表情中有些与音频无关动作,这影响预测准确性;

ExpNet用于降低这些不确定性,对于个人特性问题,通过第一帧表情系数 β 0 β_0 β0建立表情与特定人体关联;为了减少其他面部表情权重,作者使用Wav2Lip生成的嘴唇运动系数作为target,其他微表情通过额外关键点损失约束。

如图3,对于一段音频,生成t帧表情系数,每一帧音频为0.2s梅尔频谱。训练时基于ResNet的音频编码器 Φ A Φ_A ΦA将其映射到隐空间,线性层作为映射网络 Φ M Φ_M ΦM解码表情系数,其引入参考表情 β 0 β_0 β0用于减少个人特征不确定性,训练时仅使用唇部作为真值,因此作者引入眨眼控制信号 Z b l i n k Z_{blink} Zblink及对应眼部关键点损失用于控制生成眨眼,如式2,

对于损失函数,首先使用 L d i s t i l l L_{distill} Ldistill评估唇部表情系数 R e ( W a v 2 L i p ( I 0 , a { 1 , . . . , t } ) ) R_e(Wav2Lip(I_0, a_{\{1,...,t\}})) Re(Wav2Lip(I0,a{1,...,t}))与生成的 β { 1 , . . . , t } β_{\{1,...,t\}} β{1,...,t}之间差异,Wav2Lip使用第一帧生成唇部同步视频,这降低了姿态变量及唇部以外面部表情影响,除此之外,作者使用可微的3D面部渲染器 R d R_d Rd计算额外的感知损失,如图3,计算关键点损失 L l k s L_{lks} Llks用于衡量眨眼范围及整个表情准确率,实时唇部读取损失 L r e a d L_{read} Lread使用预训练的唇部读取网络 Φ r e a d e r Φ_{reader} Φreader,用于保证唇部质量。

PoseVAE

如图4,一个基于VAE的模型PoseVAE用于学习逼真的有个人风格的头部运动 ρ ∈ R 6 ρ ∈ R^6 ρR6,PoseVAE基于n帧训练,编码器与解码器输入包括t帧头部姿势,embed为高斯分布,解码器网络根据采样到的分布学习生成t帧姿态。作者没有直接生成姿势,而是学习与第一帧姿势 ρ 0 ρ_0 ρ0之间残差,这使得本方法在测试阶段基于首帧可以生成更长、更稳定、更连续头部运动。依据CVAE,增加对应音频特征 a { 1 , . . . , t } a_{\{1,...,t\} } a{1,...,t}及风格 Z s t y l e Z_{style} Zstyle作为条件,使得模型关注节奏及个人风格。 L k l L_{kl} Lkl用于衡量生成运动的分布, L m s e L_{mse} Lmse L G A N L_{GAN} LGAN用于确保生成质量。

3.3. 3D-aware Face Render

face-vid2vid需要真实视频作为驱动信号,本文提出的面部渲染器利用3DMM参数进行驱动,如图5,作者利用映射网络学习3DMM运动系数与无监督3D关键点之间关系。

训练过程分两步:第一步自监督训练face-vid2vid;第二步frozen外观编码器、关键点估计、图像生成模块参数进行finetuning,而后通过重构的方式训练映射网络,在关键点空间使用 L 1 l o s s L_1 loss L1loss约束。

实验

SOTA实验

如表1,本文提出方法与其他方法相比具有更高视频质量以及头部姿势多样性。

图6作者展示可视化结果,作者提出方法与原始视频视觉上非常相似,同时正如所期望的具有不用的头部姿势。Wav2Lip产生模糊半脸,PC-AVS和Audio2Head没能保留个体特性,MakeItTalk和Audio2Head由于使用二维warp,因此生成扭曲的面部视频。

作者生成20段不同年龄、姿势、表情视频,20个用户选择质量最佳视频,结果如表2,38%用户认为本文所提方法在唇部同步方面效果最佳;

消融实验

ExpNet


如表3、图7表明学习所有运动系数难以生成逼真视频,初始表情 β 0 β_0 β0,唇部读取损失 L r e a d L_{read} Lread,仅使用唇部系数非常重要,如图8所示;

PoseVAE

如表4,基线Speech2Gesture效果比较差。

Face Render

如图9,第一行作者提出面部渲染器展示更好的表情重建质量,第二行使用面部对齐系数将生成不逼真头部对齐视频。

限制

3DMM无法建模眼睛及牙齿,映射网络难以合成逼真牙齿,这可以通过面部重构网络改进,如图10;
同时作者仅关注嘴唇及眼睛部分表情,对于情感及视线方向不关心,从而降低逼真度.

结论

作者利用3DMM运动系数作为中间表征,学习其与视频之间关系。利用ExpNet、PoseVAE学习逼真表情及多样头部姿势,3D面部渲染器用于建模3DMM系数与真实视频之间关系。本文所提方法也可用于其他方向:个性化二维视觉配音,二维卡通动画、三维面部动画、基于NeRF的四维讲话头部生成。

有关SadTalker(CVPR2023)-音频驱动视频生成的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  3. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  4. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  5. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  6. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

  7. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  8. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

随机推荐