基于VideoReTalking+GFPGAN的AI数字人
VideoReTalking 是一个新颖的系统,用于根据输入音频编辑真实世界中的说话头部视频,生成具有不同情感的高质量和唇部同步的输出视频。
该系统将此目标分解为三个顺序任务:
- 具有规范表情的人脸视频生成;
- 音频驱动的唇部同步;
- 用于提高照片真实感的人脸增强。
wav2lip和VideoReTalking超分后效果对比
文章目录
- 基本原理
- 准备工作
-
- 创建虚拟环境
- 激活虚拟环境
- pip安装匹配版本
- 模型预测对口型
-
- 必要的数据准备
- 命令行预测
- 参数解释
- 其他使用方法
- WebUI预测
基本原理
- 人脸视频生成:使用表情编辑网络修改每一帧的表情,使其与相同的表情模板相匹配,从而生成具有规范表情的视频。
- 音频驱动的唇部同步:将该视频与给定的音频一起输入唇部同步网络,生成唇部同步视频。
- 人脸增强:通过身份感知的人脸增强网络和后处理来提高合成人脸的照片真实感。
所有这些步骤都使用基于ML和DL学习的方法,并且可以在没有任何用户干预的情况下按顺序进行。
准备工作
从github上下载源码,下载完毕之后下载模型 pre-trained models。

模型分这么多种类,将全部模型复制到 checkpoints 中。
创建虚拟环境
切记这个里面有编译的环境在里面,不要移动创建好的虚拟环境,除非你能自己修改源码修改对应的路径文件。
conda create -n VideoReTalking python=3.8
激活虚拟环境
在GIT环境目录下激活,这里是我的路径,修改成你自己的。
conda activate VideoReTalking
pip安装匹配版本
确保安装了所有必要的依赖项,可以通过requirements.txt文件进行安装。
这里会有个问题要根据显卡选择torch版本,我的显卡是RTX4090,我选择这个安装命令。
pip install torch==2.0.0+cu118 torchvision==0.15.1+cu118 torchaudio==2.0.1 --index-url https://download.pytorch.org/whl/cu118 pip install -r requirements.txt
其他显卡根据情况自行安装。
pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html pip install -r requirements.txt
模型预测对口型
必要的数据准备
事先还要准备好素材视频和音频文件,这里分别放置原始的图片,音频以及视频文件。
其中音频和视频文件放在项目目录下的./examples/audio和 ./examples/face中即可。

命令行预测
使用预训练模型进行快速推理,可以测试任何说话的人脸视频,无需手动对齐。
\VideoReTalking\python.exe inference.py --face examples/face/1.mp4 --audio examples/audio/1.wav --outfile results/1_1.mp4 python inference.py --face examples/face/1.mp4 --audio examples/audio/1.wav --outfile results/1_1.mp4
推理总共分6步,依次执行后会在result文件夹下生成对应的视频文件。
参数解释
基础参数设置base_options.py
| 参数 | 类型 | 默认值 | 解释 |
|---|---|---|---|
| –name | str | ‘face_recon’ | 实验名称,决定样本和模型存储的位置 |
| –gpu_ids | str | ‘0’ | GPU的ID,例如:0、0,1,2、0,2。使用-1表示CPU |
| –checkpoints_dir | str | ‘./checkpoints’ | 模型存储的目录 |
| –vis_batch_nums | float | 1 | 用于可视化的图像批次数 |
| –eval_batch_nums | float | inf | 用于评估的图像批次数,设置为inf表示所有图像都参与评估 |
| –use_ddp | bool | True | 是否使用分布式数据并行 |
| –ddp_port | str | ‘12355’ | DDP端口 |
| –display_per_batch | bool | True | 是否使用批次显示损失 |
| –add_image | bool | True | 是否将图像添加到Tensorboard中 |
| –world_size | int | 1 | 分布式数据并行的总批次数 |
| –model | str | ‘facerecon’ | 选择要使用的模型 |
| –epoch | str | ‘latest’ | 要加载的模型的训练轮数,设置为’latest’表示使用最新的缓存模型 |
| –verbose | bool | 如果指定,则打印更多调试信息 | |
| –suffix | str | ‘’ | 自定义后缀,将添加到opt.name中,例如:{model}_{netG}_size{load_size} |
推理工具参数设置inference_utils.py
| 参数名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| DNet_path | str | ‘checkpoints/DNet.pt’ | DNet模型的路径 |
| LNet_path | str | ‘checkpoints/LNet.pth’ | LNet模型的路径 |
| ENet_path | str | ‘checkpoints/ENet.pth’ | ENet模型的路径 |
| face3d_net_path | str | ‘checkpoints/face3d_pretrain_epoch_20.pth’ | face3d模型的路径 |
| face | str | None | 包含要使用的人脸的视频/图像的文件路径,此参数必填 |
| audio | str | None | 要用作原始音频源的视频/音频文件的文件路径,此参数必填 |
| exp_img | str | ‘neutral’ | 表情模板。可以是’neutral’,‘smile’或图像路径。默认为’neutral’ |
| outfile | str | None | 要保存结果视频的路径 |
| fps | float | 25.0 | 只有当输入为静态图像时可以指定的帧率,默认为25.0 |
| pads | list | [0, 20, 0, 0] | 填充(上、下、左、右)。请确保至少包含下巴区域 |
| face_det_batch_size | int | 4 | 人脸检测的批处理大小 |
| LNet_batch_size | int | 16 | LNet的批处理大小 |
| img_size | int | 384 | 图像的大小(宽度和高度相等) |
| crop | list | [0, -1, 0, -1] | 将视频裁剪为较小的区域(上、下、左、右)。在resize_factor和rotate参数之后应用。如果有多个人脸,这很有用。 -1表示根据高度、宽度自动推断值 |
| box | list | [-1, -1, -1, -1] | 为人脸指定一个固定的边界框。如果人脸检测失败,请仅在万不得已时使用此选项。仅在人脸几乎不移动时有效。 语法:(上、下、左、右) |
| nosmooth | bool | False | 在短时间窗口内阻止平滑人脸检测 |
| static | bool | False | 指定输入是否为静态图像 |
| up_face | str | ‘original’ | 人脸朝向的方向。可以是’original’或其他用户指定的方向 |
| one_shot | bool | False | 一次处理整个视频而不是逐帧处理 |
| without_rl1 | bool | False | 不使用相对l1损失 |
| tmp_dir | str | ‘temp’ | 保存临时结果的文件夹路径 |
| re_preprocess | bool | False | 重新预处理视频(例如,检测新的人脸) |
模型训练参数设置train_options.py,训练模型根据实际情况调整。
| 训练数据参数 | 数据类型 | 默认值 | 解释说明 |
|---|---|---|---|
| data_root | str | ./ | 数据集根目录 |
| flist | str | datalist/train/masks.txt | 训练集掩膜文件名列表 |
| batch_size | int | 32 | 批处理大小 |
| dataset_mode | str | flist | 选择数据集加载方式。[None |
| serial_batches | bool | 如果为True,按顺序获取图像以形成批次;否则随机获取图像。 | |
| num_threads | int | 4 | 加载数据的线程数 |
| max_dataset_size | int | inf | 数据集允许的最大样本数。如果数据集目录包含的样本数超过max_dataset_size,则仅加载子集。 |
| preprocess | str | shift_scale_rot_flip | 加载时图像的缩放和裁剪方式。[shift_scale_rot_flip |
| use_aug | bool | True | 是否使用数据增强 |
| 验证参数 | 数据类型 | 默认值 | 解释说明 |
|---|---|---|---|
| flist_val | str | datalist/val/masks.txt | 验证集掩膜文件名列表 |
| batch_size_val | int | 32 | 验证集的批处理大小 |
| 可视化参数 | 数据类型 | 默认值 | 解释说明 |
|---|---|---|---|
| display_freq | int | 1000 | 在屏幕上显示训练结果的频率 |
| print_freq | int | 100 | 在控制台上显示训练结果的频率 |
| 网络保存和加载参数 | 数据类型 | 默认值 | 解释说明 |
|---|---|---|---|
| save_latest_freq | int | 5000 | 保存最新结果的频率 |
| save_epoch_freq | int | 1 | 在每个epoch结束时保存检查点的频率 |
| evaluation_freq | int | 5000 | 评估的频率 |
| save_by_iter | bool | 是否按迭代保存模型 | |
| continue_train | bool | 继续训练:加载最新模型 | |
| epoch_count | int | 1 | 起始epoch计数,我们按,+,…保存模型 |
| phase | str | train | 训练、验证、测试等 |
| pretrained_name | str | None | 从其他检查点继续训练 |
| 训练参数 | 数据类型 | 默认值 | 解释说明 |
|---|---|---|---|
| n_epochs | int | 20 | 初始学习率的epoch数 |
| lr | float | 0.0001 | Adam的初始学习率 |
| lr_policy | str | step | 学习率策略。[linear |
| lr_decay_epochs | int | 10 | 每lr_decay_epochs个epoch乘以一个gamma |
脸部对焦参数配置facerecon_model.py,这些参数默认即可。
| 网络结构参数 | 数据类型 | 默认值 | 解释说明 |
|---|---|---|---|
| net_recon | str | ‘resnet50’ | 网络结构 |
| init_path | str | ‘checkpoints/init_model/resnet50-0676ba61.pth’ | 初始化路径 |
| use_last_fc | bool | False | 是否对最后一个全连接层进行零初始化 |
| bfm_folder | str | ‘BFM’ | BFM文件夹路径 |
| bfm_model | str | ‘BFM_model_front.mat’ | BFM模型 |
| 渲染器参数参数 | 数据类型 | 默认值 | 解释说明 |
|---|---|---|---|
| focal | float | 1015. | 焦距 |
| center | float | 112. | 中心点 |
| camera_d | float | 10. | 相机参数d |
| z_near | float | 5. | 近截面 |
| z_far | float | 15. | 远截面 |
| 训练参数 | 数据类型 | 默认值 | 解释说明 |
|---|---|---|---|
| net_recog | str | ‘r50’ | 人脸识别网络结构 |
| net_recog_path | str | ‘checkpoints/recog_model/ms1mv3_arcface_r50_fp16/backbone.pth’ | 人脸识别网络的权重文件路径 |
| use_crop_face | bool | False | 是否使用裁剪掩码来计算照片损失 |
| use_predef_M | bool | False | 是否使用预定义的M矩阵来处理预测的人脸特征 (M矩阵用于三维形状预测) |
| 数据增强参数参数 | 数据类型 | 默认值 | 解释说明 |
|---|---|---|---|
| shift_pixs | float | 10.0 | 像素平移大小 |
| scale_delta | float | 0.1 | 尺度缩放因子的变化范围 |
| rot_angle | float | 10.0 | 旋转角度的变化范围 (单位:度) |
| 损失权重参数 | 数据类型 | 默认值 | 解释说明 |
|---|---|---|---|
| w_feat | float | 0.2 | 特征损失权重 |
| w_color | float | 1.92 | 颜色损失权重 |
| w_reg | float | 3.0e-4 | 形状正则化损失权重 |
| w_id | float | 1.0 | 身份正则化损失权重 |
| w_exp | float | 0.8 | 表情正则化损失权重 |
| w_tex | float | 1.7e-2 | 纹理正则化损失权重 |
| w_gamma | float | 10.0 | Gamma矫正损失权重 |
| w_lm | float | 1.6e-3 | 关键点坐标损失权重 |
| w_reflc | float | 5.0 | 反照率损失权重 |
其他使用方法
表情控制参数操作,可以通过添加以下参数来控制表情:
| 参数 | 解释 |
|---|---|
| –exp_img | 预定义的表情模板。默认为”neutral”(中性表情)。可以选择”smile”(微笑)或提供一个图片路径。 |
| –up_face | 可以选择”surprise”(惊讶)或”angry”(愤怒)来使用 GANimation 修改上半部分脸部的表情。 |
WebUI预测
项目中自带WebUI启动文件,是基于gradio开发的页面。
由于代码中素材文件是写死的如果想更换素材并且在页面中显示必须进行一些修改。
添加音频和视频文件的路径目录。
audio_list = os.listdir("./examples/audio")
video_list = os.listdir("./examples/face")
添加路径并遍历文件到对应的文件位置。
with gradio.Row():
gradio.Examples(
label="Face Examples",
examples=[
os.path.join(os.path.dirname(__file__), "examples/face/" + str(i)) for i in video_list
],
inputs=[v],
fn=convert,
)
with gradio.Row():
gradio.Examples(
label="Audio Examples",
examples=[
os.path.join(os.path.dirname(__file__), "examples/audio/" + str(i)) for i in audio_list
],
inputs=[a],
fn=convert,
)
然后启动webUI.py文件,然后在浏览器中就可以看到自己添加好的对应文件啦。

最终出来的结果是这样的,视频效果呢个人感觉比wav2lip强一些,如果视频分辨率不大的话无所谓,如果原始分辨率大的话需要进行超分操作。

来看一下和wav2lip的对比吧。虽然处理效率慢了一点淡出出来的效果更佳清楚。

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/8aca433ef3.html
