背景
由于业务需要,近期调研了如何使用开源工具快速的实现一个虚拟人,这个虚拟人来自于一个图片,我们需要做的是要让这个图片动起来,且图中人物的口型能够跟对应的语音对应上。为此,我了解几个开源的工具或模型,最终选择使用SadTalker来实现该功能。
本文是对SadTalker的使用以及其用到的基础模型做一总结。希望能够对想要实现该功能的同学有所帮助。
要达成的目标
需要有个开源工具,能够实现如下的输入输出,效果要尽可能的好,并且方便我们将该服务本地化。
输入:一段文字脚本、一个音色模型、一张人物图片
输出:一个视频,该视频中的人物能够开口说话,并且用指定的音色说出文字脚本的内容
SadTalker相关信息
Github地址:https://github.com/OpenTalker/SadTalker
hugging face地址:https://huggingface.co/spaces/vinthony/SadTalker
SadTalker的使用
关于SadTalker的使用,其官方文档已经写的比较全面了,这里不再赘述。只提一下其中一些参数的使用要点。
- 如果要用preprocess的full参数,则一定要加上–still参数,不然效果会很糟糕。
- free-view Mode参数可以用于控制头像的转动,其中参数的详细含义如下:
input_yaw
、input_pitch
和 input_roll
通常用于描述物体或相机在三维空间中的旋转角度,也被称为欧拉角或俯仰、偏航和翻滚角。
input_yaw
表示绕垂直于地面的轴旋转的角度,也称为偏航角。通常以正北方向为0度,顺时针方向为正方向,逆时针方向为负方向。input_pitch
表示绕水平轴旋转的角度,也称为俯仰角。通常以水平面为0度,向上旋转为正方向,向下旋转为负方向。input_roll
表示绕前后轴旋转的角度,也称为翻滚角。通常以垂直于水平面的轴为0度,向右旋转为正方向,向左旋转为负方向。
- 就我目前来看,如果我们需要头部动起来,那么还是不设置旋转参数的效果更好。
SadTalker使用到的模型
模型介绍
shape_predictor_68_face_landmarks.dat
shape_predictor_68_face_landmarks.dat是一个基于dlib库的人脸关键点检测模型文件,可以用于检测人脸的68个关键点,包括眼睛、眉毛、鼻子、嘴巴等部位的位置信息。这个模型文件在很多人脸识别、表情识别、人脸姿态估计等领域都有广泛的应用。(基于随机森林的回归算法)
Deep3DFaceReconstruction
**Deep3DFaceReconstruction**是一种基于深度学习的人脸三维重建技术。它通过利用深度学习算法对人脸图像进行分析和处理,从而实现对人脸的三维重建。这种技术可以广泛应用于计算机视觉、虚拟现实、增强现实等领域,为人们带来更加逼真的视觉体验。
Deep3DFaceReconstruction的核心技术是利用深度学习算法对人脸图像进行分析和处理,从而提取出人脸的三维信息。具体来说,它通过对大量的人脸图像进行训练,学习到了一种高效的特征提取方法,可以快速准确地提取出人脸的关键特征,包括面部轮廓、眼睛、鼻子、嘴巴等。然后,它通过对这些特征进行三维重建,从而得到了一个高度逼真的人脸三维模型。
Deep3DFaceReconstruction具有许多优点,例如可以实现快速高效的三维重建、可以处理不同角度和光照条件下的人脸图像、可以处理不同种族和性别的人脸图像等。此外,它还可以应用于人脸识别、人脸动画、人脸表情识别等领域,具有广泛的应用前景。
auido2pose_00140-model.pth
auido2pose_00140-model.pth是一个训练好的PyTorch模型文件,用于音频到人体姿态的转换。该模型可以根据输入的音频数据,预测出对应的人体姿态信息。在这个文件中,auido2pose_00140-model.pth表示训练过程中的第140个epoch。在每个epoch中,模型会对训练数据进行一次完整的训练,以更新模型参数。通常情况下,训练的epoch次数越多,模型的预测效果会越好,但是也会增加训练时间和计算资源的开销。该模型文件可以被应用于很多领域,如虚拟现实、运动分析、人体姿态识别等。(PoseVAE模型,基于transformer模型的)
auido2exp_00300-model.pth
auido2exp_00300-model.pth是一个训练好的模型文件,用于将音频数据转换为对应的面部表情。该模型通过分析音频数据和面部表情数据之间的关系,可以预测出对应的面部表情信息。auido2exp_00300-model.pth可以被应用于很多领域,如虚拟现实、面部表情识别、情感分析等。通过分析音频数据和面部表情数据之间的关系,该模型可以实现对面部表情的快速、准确的预测。(ExpNet模型,基于transformer模型的)
wav2lip.pth
wav2lip.pth是一个基于深度学习的语音和口型同步技术的模型文件,可以将音频和视频中的语音和口型同步,生成逼真的合成视频。该模型使用了深度学习中的卷积神经网络和循环神经网络等技术,实现了对音频和视频的特征提取和匹配。wav2lip.pth可以被应用于很多领域,如虚拟现实、视频编辑、电影制作等。通过将音频和视频进行同步,可以实现更加逼真的人机交互和视频合成效果,提高用户体验。(基于循环神经网络)
mapping_00109-model.pth.tar
mapping_00109-model.pth.tar的作用是将输入音频中学习到的逼真的3D运动系数转换为对应的基础向量,从而生成一个逼真的3D人脸。具体来说,mappingNet模型学习从显式的3DMM运动系数(头部姿态和表情)到隐式的基础向量之间的关系,并将这个关系应用于输入音频中学习到的逼真的3D运动系数,从而生成对应的基础向量。最后,这个基础向量与3DMM模型中的基础向量相结合,生成一个逼真的3D人脸。(基于GAN神经网络)
facevid2vid_00189-model.pth.tar
facevid2vid_00189-model.pth.tar是一个基于深度学习的人脸动作转换模型,可以将输入的人脸视频转换成指定动作的人脸视频。简单来说,可以将上述3D模型视频转为穿了图片皮肤的视频。(基于GAN神经网络)
GFPGANv1.4.pth
GFPGANv1.4.pth是一种图像超分辨率重建模型,用于将低分辨率图像(LR)提升至高分辨率图像(HR)。它是由腾讯优图实验室提出的一种基于生成对抗网络(GAN)的方法,可以在不失真的情况下提高图像质量。GFPGANv1.4.pth是该模型的一个预训练权重文件,可以用于对新的低分辨率图像进行重建。该模型可以应用于许多领域,如数字娱乐、医学影像、安防监控等。(基于GAN神经网络)
处理流程中的相关模型
- 对原始图片进行裁剪,这一步用到shape_predictor_68_face_landmarks.dat算法模型识别出人脸,并使用CV2进行裁剪处理。
- 将原始图片中的人脸识别成一个3D人脸模型系数,并存储在mat格式的文件中。
- 3DMM提出给定视频中的眨眼动作。(将视频中的人脸识别成一个3D人脸模型系数,并存储在mat格式的文件中。)
- 3DMM提出给定视频中的姿势动作。(将视频中的人脸识别成一个3D人脸模型系数,并存储在mat格式的文件中。)
- 从音频中提取出姿势、表情以及唇形,并存储在mat格式的文件中。
- 使用上述系数渲染出一个3D人脸模型,并用ffmpeg命令将音频与视频做结合。
- 将视频与图片做结合。
- 效果增强,使视频变得更加清晰。
模型处理的时延测试
音频时长:10秒
处理总时间:366054毫秒(6分钟)
模型处理时间总占比:97.20%
测试机器配置:半张NVIDIA Tesla T4显卡、显存:8GB
处理过程 | 模型 | 处理时间(单位:毫秒) | 处理时间占比 |
---|---|---|---|
图片的预处理 | shape_predictor_68_face_landmarks.dat | ||
epoch_20.pth | 9296 | 2.54% | |
眨眼视频的处理 | shape_predictor_68_face_landmarks.dat | ||
epoch_20.pth | 40948 | 11.19% | |
姿势视频的处理 | shape_predictor_68_face_landmarks.dat | ||
epoch_20.pth | 30044 | 8.21% | |
音频提出系数 | auido2exp_00300-model.pth | ||
auido2pose_00140-model.pth | |||
wav2lip.pth | 1094 | 0.30% | |
3D人脸模型渲染 | mapping_00109-model.pth.tar | 122312 | 33.41% |
视频与图片做结合 | facevid2vid_00189-model.pth.tar | 6646 | 1.82% |
效果增强 | gfpgan | 145449 | 39.73% |
可以看到,模型处理过程中,最耗时的是3D人脸模型渲染以及效果增强,两者耗时占比超70%。
SadTalker的部署与服务
SadTalker的项目代码是用Python编写的,我们可以用FastAPI很快速的把它改造为能够通过HTTP对外提供服务的方式,并且在服务器中用uvicorn启动该服务。这样就可以在自己的本地环境中稳定的提供服务了,在有代码变更的情况下,也无需手动重启服务。
我们的服务还与腾讯云COS存储打通了,语音和图片从COS中读取,并且将处理成功的视频文件写入到COS中,并将链接地址返回。
总结
本文是对SadTalker的使用以及其用到的基础模型做了一下总结,其中包括了模型的介绍以及各模型处理时长的试验结果,但并没有涉及到模型的原理以及优化细节。对于针对于业务的优化,可以后续视情况来续写分享。
参考资料
SadTalker Github地址:https://github.com/OpenTalker/SadTalker
SadTalker hugging face地址:https://huggingface.co/spaces/vinthony/SadTalker
SadTalker最佳实践:https://github.com/OpenTalker/SadTalker/blob/main/docs/best_practice.md