EDTalk
🚀 EDTalk:高效解耦的情感说话头像合成
谭帅1,
季斌1,
毕梦晓2,
潘烨1,
1上海交通大学
2网易伏羲人工智能实验室
ECCV 2024 口头报告
🎏 摘要
实现多个面部动作的解耦控制并适应多样化的输入模态,极大地增强了说话头像生成的应用和娱乐性。这需要对面部特征的解耦空间进行深入探索,确保它们a)独立运作而不相互干扰,b)可以保存以与不同模态输入共享 - 这两个方面在现有方法中常常被忽视。为了解决这一问题,本文提出了一种新颖的高效解耦说话头像生成框架(EDTalk)。我们的框架可以根据视频和音频输入,对口型、头部姿态和情感表情进行单独操控。具体来说,我们采用三个轻量级模块将面部动态分解成三个不同的潜在空间,分别代表口型、姿态和表情。每个空间都由一组可学习的基向量来表征,其线性组合定义了特定的动作。为了确保独立性并加速训练,我们在基向量之间强制正交,并设计了一种高效的训练策略,在不依赖外部知识的情况下分配动作责任到每个空间。然后将学习到的基向量存储在相应的库中,实现与音频输入的视觉先验共享。此外,考虑到每个空间的特性,我们提出了音频到动作模块用于音频驱动的说话头像合成。通过实验证明了EDTalk的有效性。
💻 概述
🔥 更新
- 2024.08.12 - 🎉 我们的论文被选为口头报告。
- 2024.08.09 - 💻 添加了针对特定人物微调的训练代码,以奥巴马为例。
- 2024.08.06 - 🙏 我们希望更多人能参与进来,我们会及时处理pull request。目前还有一些任务需要帮助,例如创建colab notebook、改进web UI和翻译工作等。
- 2024.08.04 - 🎉 添加gradio界面。
- 2024.07.31 - 💻 添加可选的人脸超分辨率。
- 2024.07.19 - 💻 发布数据预处理代码和部分训练代码(微调LIA & 口型-姿态解耦 & 音频到口型)。但我现在很忙,没有足够的时间整理所有代码,不过我认为目前的代码对于想要复现EDTalk或其他的人来说可以是一个有用的参考。如果遇到任何问题,欢迎提出issue!
- 2024.07.01 - 💻 推理代码和预训练模型可用。
- 2024.07.01 - 🎉 我们的论文被ECCV 2024接收。
- 2024.04.02 - 🛳️ 本仓库发布。
📅 待办事项
- 发布训练代码。
- 发布推理代码。
- 发布预训练模型。
- 发布Arxiv论文。
🎮 安装
我们基于Python 3.8和Pytorch进行训练和测试。要安装依赖项,请运行:
git clone https://github.com/tanshuai0219/EDTalk.git
cd EDTalk
安装依赖
conda create -n EDTalk python=3.8
conda activate EDTalk
- python包
pip install -r requirements.txt
- Windows系统的python包
pip install -r requirements_windows.txt
感谢nitinmukesh提供Windows 11安装教程,欢迎关注他的频道!
- 启动gradio界面(感谢贡献者:newgenai79!)
python webui_emotions.py
🎬 快速开始
下载checkpoints/huggingface链接并将它们放入./ckpts。
[中文用户]可以通过这个链接下载权重。
EDTalk-A:口型+姿态+表情: 在音频驱动设置下运行演示(EDTalk-A):
为了用户友好,我们提取了表情基中八种常见情感的权重。可以直接指定情感来生成情感说话人脸视频(推荐)
python demo_EDTalk_A_using_predefined_exp_weights.py --source_path 图像路径 --audio_driving_path 音频路径 --pose_driving_path 姿态路径 --exp_type 表情类型 --save_path 保存路径
# 示例:
python demo_EDTalk_A_using_predefined_exp_weights.py --source_path res/results_by_facesr/demo_EDTalk_A.png --audio_driving_path test_data/mouth_source.wav --pose_driving_path test_data/pose_source1.mp4 --exp_type angry --save_path res/demo_EDTalk_A_using_weights.mp4
或者您可以输入一个表情参考(图像/视频)来指示表情。
python demo_EDTalk_A.py --source_path 图像路径 --audio_driving_path 音频路径 --pose_driving_path 姿态路径 --exp_driving_path 表情路径 --save_path 保存路径
# 示例:
python demo_EDTalk_A.py --source_path res/results_by_facesr/demo_EDTalk_A.png --audio_driving_path test_data/mouth_source.wav --pose_driving_path test_data/pose_source1.mp4 --exp_driving_path test_data/expression_source.mp4 --save_path res/demo_EDTalk_A.mp4
结果将保存在save_path中。
所使用的源路径和视频必须先使用脚本crop_image2.py(下载shape_predictor_68_face_landmarks.dat并将其放在./data_preprocess目录中)和crop_video.py进行裁剪。确保每个视频的帧率必须为25 fps
您也可以使用crop_image.py来裁剪图像,但increase_ratio需要仔细设置并多次尝试以获得最佳结果。
EDTalk-A:唇部+姿势,不含表情: 如果您不想改变身份源的表情,请下载EDTalk_lip_pose.pt并将其放入./ckpts目录。
如果您只想改变身份源的唇部动作,请运行
python demo_lip_pose.py --fix_pose --source_path 图像路径 --audio_driving_path 音频路径 --save_path 保存路径
# 示例:
python demo_lip_pose.py --fix_pose --source_path test_data/identity_source.jpg --audio_driving_path test_data/mouth_source.wav --save_path res/demo_lip_pose_fix_pose.mp4
或者您可以通过pose_driving_path在上述基础上额外控制头部姿势
python demo_lip_pose.py --source_path 图像路径 --audio_driving_path 音频路径 --pose_driving_path 姿势路径 --save_path 保存路径
# 示例:
python demo_lip_pose.py --source_path test_data/identity_source.jpg --audio_driving_path test_data/mouth_source.wav --pose_driving_path test_data/pose_source1.mp4 --save_path res/demo_lip_pose_fix_pose.mp4
源图像 | EDTalk | EDTalk + liveprotrait |
---|---|---|
并通过驱动视频控制唇部动作。
python demo_lip_pose_V.py --source_path 图像路径 --audio_driving_path 音频路径 --lip_driving_path 嘴部路径 --pose_driving_path 姿势路径 --save_path 保存路径
# 示例:
python demo_lip_pose_V.py --source_path res/results_by_facesr/demo_lip_pose5.png --audio_driving_path test_data/mouth_source.wav --lip_driving_path test_data/mouth_source.mp4 --pose_driving_path test_data/pose_source1.mp4 --save_path demo_lip_pose_V.mp4
源图像 | demo_lip_pose_V 结果 | + FaceSR |
---|---|---|
改变源视频的唇部动作,运行:
python demo_change_a_video_lip.py --source_path 视频路径 --audio_driving_path 音频路径 --save_path 保存路径
# 示例
python demo_change_a_video_lip.py --source_path test_data/pose_source1.mp4 --audio_driving_path test_data/mouth_source.wav --save_path res/demo_change_a_video_lip.mp4
源图像 | 结果 #1 | 结果 #2 |
---|---|---|
在视频驱动设置下运行演示(EDTalk-V):
python demo_EDTalk_V.py --source_path 图像路径 --lip_driving_path 唇部路径 --audio_driving_path 音频路径 --pose_driving_path 姿势路径 --exp_driving_path 表情路径 --save_path 保存路径
# 示例:
python demo_EDTalk_V.py --source_path test_data/identity_source.jpg --lip_driving_path test_data/mouth_source.mp4 --audio_driving_path test_data/mouth_source.wav --pose_driving_path test_data/pose_source1.mp4 --exp_driving_path test_data/expression_source.mp4 --save_path res/demo_EDTalk_V.mp4
结果将保存在save_path中。
人脸超分辨率(可选)
☺️🙏 感谢Tao Liu的提议~
目的是将分辨率从256提升到512,并解决模糊渲染的问题。
请在此安装额外的环境:
pip install facexlib
pip install tb-nightly -i https://mirrors.aliyun.com/pypi/simple
pip install gfpgan
然后在您的脚本中启用--face_sr
选项。第一次运行将下载gfpgan的权重(您也可以选择先下载gfpgan ckpts并将其放在gfpgan/weights目录中)。
以下是一些示例:
python demo_lip_pose.py --source_path 图像路径 --audio_driving_path 音频路径 --pose_driving_path 姿势路径 --save_path 保存路径 --face_sr
python demo_EDTalk_V.py --source_path 图像路径 --lip_driving_path 唇部路径 --audio_driving_path 音频路径 --pose_driving_path 姿势路径 --exp_driving_path 表情路径 --save_path 保存路径 --face_sr
python demo_EDTalk_A_using_predefined_exp_weights.py --source_path 图像路径 --audio_driving_path 音频路径 --pose_driving_path 姿势路径 --exp_type 表情类型 --save_path 保存路径 --face_sr
源图像 | EDTalk 结果 | EDTalk + FaceSR |
---|---|---|
🎬 针对特定人物进行微调
目前存在一些问题,我会仔细检查。请耐心等待! 注意:我们以奥巴马和我电脑上的路径(/data/ts/xxxxxx)为例,您应该替换成自己的路径:
-
从 AD-Nerf 下载奥巴马的数据并放在 '/data/ts/datasets/person_specific_dataset/AD-NeRF/video/Obama.mp4'
-
裁剪视频并重采样为25帧每秒:
python data_preprocess/crop_video.py --inp /data/ts/datasets/person_specific_dataset/AD-NeRF/video/Obama.mp4 --outp /data/ts/datasets/person_specific_dataset/AD-NeRF/video_crop/Obama.mp4
-
将视频保存为帧:
ffmpeg -i /data/ts/datasets/person_specific_dataset/AD-NeRF/video_crop/Obama.mp4 -r 25 -f image2 /data/ts/datasets/person_specific_dataset/AD-NeRF/video_crop_frame/Obama/%4d.png
-
开始训练:
python train_fine_tune.py --datapath /data/ts/datasets/person_specific_dataset/AD-NeRF/video_crop_frame/Obama --only_fine_tune_dec
将datapath改为您自己的数据路径。only_fine_tune_dec意味着只训练dec模块。根据我的经验,只训练dec可以提高图像质量,所以我们推荐这样做。您也可以将其设置为False,这意味着微调整个模型。您应该经常查看保存的样本(在exp_path/exp_name/checkpoint,在我的情况下,在:/data/ts/checkpoints/EDTalk/fine_tune/Obama/checkpoint),以及时找到最佳模型。
步骤 #0 | 步骤 #100 | 步骤 #200 |
---|---|---|
第一行是源图像,第二行是驱动图像,第三行是生成的结果。
🎬 用于训练的数据预处理
用于训练的数据预处理
**注意**:提供的功能是可用的,但应调整它们的调用方式,例如修改数据路径。如果遇到任何问题,请随时留下您的问题! - 下载MEAD和HDTF数据集: 1) **MEAD**. [下载链接](https://wywu.github.io/projects/MEAD/MEAD.html)。我们只使用*正面*视频并提取音频,按以下方式组织数据:
```text
/dir_path/MEAD_front/
|-- Original_video
| |-- M003#angry#level_1#001.mp4
| |-- M003#angry#level_1#002.mp4
| |-- ...
|-- audio
| |-- M003#angry#level_1#001.wav
| |-- M003#angry#level_1#002.wav
| |-- ...
```
2) HDTF. 下载链接。
我们按以下方式组织数据:
```text
/dir_path/HDTF/
|-- audios
| |-- RD_Radio1_000.wav
| |-- RD_Radio2_000.wav
| |-- ...
|-- original_videos
| |-- RD_Radio1_000.mp4
| |-- RD_Radio2_000.mp4
| |-- ...
```
-
裁剪训练数据集中的视频:
python data_preprocess/data_preprocess_for_train/crop_video_MEAD.py python data_preprocess/data_preprocess_for_train/crop_video_HDTF.py
-
分割视频:由于HDTF中的视频太长,我们将视频和相应的音频分割成5秒的片段:
python data_preprocess/data_preprocess_for_train/split_HDTF_video.py
python data_preprocess/data_preprocess_for_train/split_HDTF_audio.py
-
我们将视频帧保存在lmdb文件中以提高I/O效率:
python data_preprocess/data_preprocess_for_train/prepare_lmdb.py
-
从音频中提取梅尔特征:
python data_preprocess/data_preprocess_for_train/get_mel.py
-
从裁剪的视频中提取关键点:
python data_preprocess/data_preprocess_for_train/extract_lmdk.py
-
使用extract_bbox.py从裁剪的视频中提取边界框用于唇部鉴别器,我们给出了一个使用lmdb的不完整示例:
python data_preprocess/data_preprocess_for_train/extract_bbox.py
-
预处理后,数据应按如下方式组织:
/dir_path/MEAD_front/
|-- Original_video
| |-- M003#angry#level_1#001.mp4
| |-- M003#angry#level_1#002.mp4
| |-- ...
|-- video
| |-- M003#angry#level_1#001.mp4
| |-- M003#angry#level_1#002.mp4
| |-- ...
|-- audio
| |-- M003#angry#level_1#001.wav
| |-- M003#angry#level_1#002.wav
| |-- ...
|-- bbox
| |-- M003#angry#level_1#001.npy
| |-- M003#angry#level_1#002.npy
| |-- ...
|-- landmark
| |-- M003#angry#level_1#001.npy
| |-- M003#angry#level_1#002.npy
| |-- ...
|-- mel
| |-- M003#angry#level_1#001.npy
| |-- M003#angry#level_1#002.npy
| |-- ...
/dir_path/HDTF/
|-- split_5s_video
| |-- RD_Radio1_000#1.mp4
| |-- RD_Radio1_000#2.mp4
| |-- ...
|-- split_5s_audio
| |-- RD_Radio1_000#1.wav
| |-- RD_Radio1_000#2.wav
| |-- ...
|-- bbox
| |-- RD_Radio1_000#1.npy
| |-- RD_Radio1_000#2.npy
| |-- ...
|-- landmark
| |-- RD_Radio1_000#1.npy
| |-- RD_Radio1_000#2.npy
| |-- ...
|-- mel
| |-- RD_Radio1_000#1.npy
| |-- RD_Radio1_000#2.npy
| |-- ...
🎬 开始训练
开始训练
- 预训练编码器 $E$ 和生成器 $G$:- 请参考 [LIA](https://github.com/wyhsirius/LIA) 从头开始训练。
- (可选)如果您想加快收敛速度,可以下载 [LIA](https://github.com/wyhsirius/LIA) 的预训练模型。
- 我们提供了在 MEAD 和 HDTF 数据集上微调模型的训练代码:
```bash
python -m torch.distributed.launch --nproc_per_node=2 --master_port 12345 train/train_E_G.py
```
-
训练口型-姿态解耦模块:
python -m torch.distributed.launch --nproc_per_node=2 --master_port 12344 train/train_Mouth_Pose_decouple.py
-
训练音频到口型模块:
python -m torch.distributed.launch --nproc_per_node=2 --master_port 12344 train/train_audio2mouth.py
🙏 感谢所有贡献者的努力
我们希望有更多人能够参与进来,我们会及时处理拉取请求。目前,仍有一些任务需要帮助,例如创建 colab 笔记本、网页用户界面以及翻译工作等。
👨👩👧👦 其他会说话的头像论文:
[ICCV 23] EMMN: 用于音频驱动情感说话人脸生成的情感运动记忆网络
[AAAI 24] Style2Talker: 具有情感风格和艺术风格的高分辨率说话头像生成
[AAAI 24] 用任何风格说任何话
[CVPR 24] FlowVQTalker: 通过归一化流和量化实现高质量情感说话人脸生成
🎓 引用
@inproceedings{tan2024edtalk,
title = {EDTalk: 情感说话头像合成的高效解耦},
author = {Tan, Shuai and Ji, Bin and Bi, Mengxiao and Pan, Ye},
booktitle = {Proceedings of the European Conference on Computer Vision (ECCV)},
year = {2024}
}
🙏 致谢
部分代码借鉴自以下项目:
论文中的一些图表受到以下项目的启发:
感谢这些优秀的项目。