SyncTalk算法介绍
SyncTalk合成同步的头部说话视频,采用三平面哈希表示来保持主体身份。它可以生成同步的嘴唇动作、面部表情和稳定的头部姿势,并恢复头发细节以创建高分辨率视频。
部署
在Linux中部署该项目,在 Ubuntu 18.04、Pytorch 1.12.1 和 CUDA 11.3 上测试。
git clone https://github.com/ZiqiaoPeng/SyncTalk.git
cd SyncTalk
安装依赖项
conda 创建-n synctalk python == 3.8.8
conda 激活 synctalk
pip安装torch == 1.12.1+cu113 torchvision == 0.13.1+cu113 torchaudio == 0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113
pip安装 -r requirements.txt
pip安装 --no-index --no-cache-dir pytorch3d -f https://dl.fbaipublicfiles.com/pytorch3d/packaging/wheels/py38_cu113_pyt1121/download.html
pip安装tensorflow-gpu == 2.8.1
pip安装./freqencoder
pip安装./shencoder
pip安装./gridencoder
pip安装./raymarching
如果在安装PyTorch3D时遇到问题,可以使用以下命令进行安装:
python./scripts/install_pytorch3d.py
数据准备
预训练模型
请将May.zip放在数据文件夹中,将trial may.zip放在模型文件夹中,然后解压它们。
[新] 处理您的视频
⦁ 准备人脸解析模型。
wget https://github.com/YudongGuo/AD-NeRF/blob/master/data_util/face_parsing/79999_iter.pth?raw = true -O data_utils/face_parsing/79999_iter.pth
⦁ 准备 3DMM 模型以进行头部姿势估计。
wget https://github.com/YudongGuo/AD-NeRF/blob/master/data_util/face_tracking/3DMM/exp_info.npy?raw = true -O data_utils/face_tracking/3DMM/exp_info.npy
wget https://github.com/YudongGuo/AD-NeRF/blob/master/data_util/face_tracking/3DMM/keys_info.npy?raw = true
-O data_utils/face_tracking/3DMM/keys_info.npy wget https://github.com/YudongGuo/AD-NeRF/blob/master/data_util/face_tracking/3DMM/sub_mesh.obj?raw = true
-O data_utils/face_tracking/3DMM/sub_mesh.obj wget https://github.com/YudongGuo/AD-NeRF/blob/master/data_util/face_tracking/3DMM/topology_info.npy?raw = true -O
⦁ 从巴塞尔人脸模型 2009下载 3DMM 模型:
# 1. 将 01_MorphableModel.mat 复制到 data_util/face_tracking/3DMM/
# 2.
cd data_utils/face_tracking
python convert_BFM.py
⦁ 将您的视频放在data/<ID>/<ID>.mp4下,然后运行以下命令来处理视频。
[注意]视频必须为 25FPS,所有帧都包含说话的人。分辨率应约为 512x512,持续时间约为 4-5 分钟。
python data_utils/process.py data/<ID>/<ID>.mp4 --asr ave
您可以选择使用 AVE、DeepSpeech 或 Hubert。处理后的视频将保存在数据文件夹中。
⦁ [可选] 获取眨眼的 AU45
在OpenFace Feature Extraction中运行,重命名并将输出 CSV 文件移动到 data/<ID>/au.csv
【注】由于EmoTalk的blendshape捕获不开源,这里的预处理代码用mediapipe的blendshape捕获替换。但根据一些反馈,它效果不佳,您可以选择用AU45替换它。如果您想与SyncTalk进行比较,可以在这里获得一些使用EmoTalk捕获的结果以及来自GeneFace的视频。
运行评估代码
python main.py 数据/May --workspace模型/trial_may -O --test --asr_model ave
python main.py 数据/May --workspace模型/trial_may -O --test --asr_model ave --portrait
“ave”指的是我们的视听编码器,“portrait”表示把生成的人脸粘贴回原图上,代表更高的质量。
如果运行正确,你会得到以下结果。
SettingPSNRLPIPSLMD | SettingPSNRLPIPSLMD | SettingPSNRLPIPSLMD | SettingPSNRLPIPSLMD |
SyncTalk(w/o Portrait) | 32.201 | 0.0394 | 2.822 |
SyncTalk(Portrait) | 37.644 | 0.0117 | 2.825 |
结果是针对单个训练项目的;本文报告的是多个主题的平均结果。
使用目标音频进行推理
python main.py 数据/May --workspace模型/trial_may -O --test --test_train --asr_model ave --portrait --aud ./demo/test.wav
请使用“.wav”扩展名的文件进行推理,推理结果会保存在“model/trial_may/results/”中。如果不使用Audio Visual Encoder,将wav替换为npy文件路径。
⦁ DeepSpeech
python data_utils/deepspeech_features/extract_ds_features.py --input data/<name>.wav # 保存到 data/<name>.npy
⦁ HuBERT
# 借鉴自 GeneFace。英语预训练。
data_utils/hubert.py --wav data/<name>.wav # 保存到 data/<name>_hu.npy
# 默认情况下,我们会动态从磁盘加载数据。
# 我们还可以将所有数据预加载到 CPU/GPU 以加快训练速度,但这对于大型数据集来说非常耗费内存。
# `--preload 0`: 从磁盘加载(默认,速度较慢)。
# `--preload 1`: 加载到 CPU(稍慢)
# `--preload 2`: 加载到 GPU(快速)
python main.py data/May --workspace model/trial_may -O --iters 60000 --asr_model avepython
main.py data/May --workspace model/trial_may -O --iters 100000 --finetune_lips --patch_size 64 --asr_model ave
# 或者你可以使用脚本来训练
sh ./scripts/train_may.sh
【提示】音频视觉编码器(AVE)适用于口型同步准确、唇部动作幅度较大的人物,如 May 和 Shaheen。在推理阶段使用 AVE 可以实现更准确的口型同步。如果您的训练结果显示唇部抖动,请尝试使用 deepspeech 或 hubert 模型作为音频特征编码器。
# 使用 deepspeech 模型
python main.py data/May --workspace model/trial_may -O --iters 60000 --asr_model deepspeech
python main.py data/May --workspace model/trial_may -O --iters 100000 --finetune_lips --patch_size 64 --asr_model deepspeech
# 使用 hubert 模型
python main.py data/May --workspace model/trial_may -O --iters 60000 --asr_model hubert
python main.py data/May --workspace model/trial_may -O --iters 100000 --finetune_lips --patch_size 64 --asr_model hubert
如果您想使用OpenFace au45作为眼睛参数,请在命令行中添加“--au45”。
# 使用 OpenFace AU45
python main.py data/May --workspace model/trial_may -O --iters 60000 --asr_model ave --au45
python main.py data/May --workspace model/trial_may -O --iters 100000 --finetune_lips --patch_size 64 --asr_model ave --au45
测试
python main.py 数据/May --workspace模型/trial_may -O --test --asr_model ave --portrait
训练和测试躯干
如果你的人物只训练了头部,出现了双下巴问题,你可以引入躯干训练。通过训练躯干,可以解决这个问题,但你不能使用“--portrait”模式。如果你添加了“--portrait”,躯干模型将失效!
# 训练
# <head>.pth 应为 trial_may 中的最新检查点
python main.py data/May/ --workspace model/trial_may_torso/ -O --torso --head_ckpt < head > .pth --iters 150000 --asr_model ave
# 例如
python main.py data/May/ --workspace model/trial_may_torso/ -O --torso --head_ckpt model/trial_may/ngp_ep0019.pth --iters 150000 --asr_model ave
# 测试
python main.py data/May --workspace model/trial_may_torso -O --torso --test --asr_model ave # 不支持 --portrait
# 使用目标音频进行推理
python main.py data/May --workspace model/trial_may_torso -O --torso --test --test_train --asr_model ave --aud ./demo/test.wav # 不支持 --portrait
如果你对数字人感兴趣,欢迎关注后台私信,数字人,即可获得数字人工具