2025/06/11: 发布 LatentSync 1.6,采用 512×512 分辨率视频训练,以缓解模糊问题。点击此处查看演示。2025/03/14: 发布 LatentSync 1.5,主要改进:(1) 添加时间层,提升时间一致性;(2) 提升中文视频性能;(3) 通过一系列优化将第二阶段训练所需显存降至 20 GB。更多详情请参见此处。我们提出 LatentSync,一种基于音频条件潜在扩散模型的端到端唇形同步方法,无需中间运动表示。与之前的基于像素空间扩散或两阶段生成的唇形同步方法不同,我们的框架能充分利用 Stable Diffusion 的强大能力,直接建模复杂的音视频关联。
LatentSync 使用 [Whisper](https://github.com/openai/whisper) 将梅尔频谱图转换为音频嵌入,再通过交叉注意力层集成到 U-Net 中。参考帧和掩码帧与加噪后的潜在表示在通道维度上拼接,作为 U-Net 的输入。训练过程中,我们使用一步法从预测噪声中获取估计的干净潜在表示,再解码得到估计的干净帧。在像素空间中,我们添加了 TREPA、[LPIPS](https://arxiv.org/abs/1801.03924) 和 [SyncNet](https://www.robots.ox.ac.uk/~vgg/publications/2016/Chung16a/chung16a.pdf) 损失。 ## 🎬 演示
| 原始视频 | 唇形同步后的视频 |
source setup_env.sh
如果下载成功,权重文件应位于以下目录:
./checkpoints/
|-- latentsync_unet.pt
|-- whisper
| |-- tiny.pt
你也可以从我们的 [HuggingFace 仓库](https://huggingface.co/ByteDance/LatentSync-1.6) 手动下载 `latentsync_unet.pt` 和 `tiny.pt`。
## 🚀 推理
推理所需的最低显存:
- **8 GB** (LatentSync 1.5)
- **18 GB** (LatentSync 1.6)
推理有两种方式:
### 1. Gradio 应用
运行 Gradio 应用进行推理:
python gradio_app.py
### 2. 命令行界面
运行脚本进行推理:
./inference.sh
你可以调整以下推理参数以获得更好的效果:
- `inference_steps`[20-50]:值越高,视觉质量越好,但生成速度越慢。
- `guidance_scale`[1.0-3.0]:值越高,唇形同步精度越高,但可能导致视频失真或抖动。
## 🔄 数据处理流程
完整的数据处理流程包含以下步骤:
1. 移除损坏的视频文件。
2. 将视频帧率重采样至 25 FPS,音频重采样至 16000 Hz。
3. 使用 [PySceneDetect](https://github.com/Breakthrough/PySceneDetect) 进行场景检测。
4. 将每个视频切分为 5-10 秒的片段。
5. 根据 [InsightFace](https://github.com/deepinsight/insightface) 检测到的面部关键点进行仿射变换,并调整尺寸至 256×256。
6. 移除 [sync confidence score](https://www.robots.ox.ac.uk/~vgg/publications/2016/Chung16a/chung16a.pdf) 低于 3 的视频,并将音视频偏移调整至 0。
7. 计算 [hyperIQA](https://openaccess.thecvf.com/content_CVPR_2020/papers/Su_Blindly_Assess_Image_Quality_in_the_Wild_Guided_by_a_CVPR_2020_paper.pdf) 分数,移除分数低于 40 的视频。
运行脚本以执行数据处理流程:
./data_processing_pipeline.sh
请修改脚本中的 `input_dir` 参数,指定待处理的数据目录。处理后的视频将保存在 `high_visual_quality` 目录中。每一步都会创建一个新的目录,如果处理过程中意外中断,无需重复执行整个流程。
## 🏋️♂️ 训练 U-Net
训练前,请按上述流程处理数据。我们发布了一个预训练的 SyncNet,在 VoxCeleb2 和 HDTF 数据集上准确率均达到 94%,可用于监督 U-Net 训练。通过以下命令下载该 SyncNet 权重:
huggingface-cli download ByteDance/LatentSync-1.6 stable_syncnet.pt --local-dir checkpoints
准备工作完成后,使用以下脚本训练 U-Net:
./train_unet.sh
我们在 `configs/unet` 目录中提供了多个 UNet 配置文件,分别对应不同训练设置:
- `stage1.yaml`:第一阶段训练,需要 **23 GB** 显存。
- `stage2.yaml`:第二阶段训练(最优性能),需要 **30 GB** 显存。
- `stage2_efficient.yaml`:高效第二阶段训练,需要 **20 GB** 显存。与 `stage2.yaml` 相比,视觉质量和时间一致性可能略有下降,适合消费级 GPU(如 RTX 3090)。
- `stage1_512.yaml`:在 512×512 分辨率视频上进行第一阶段训练,需要 **30 GB** 显存。
- `stage2_512.yaml`:在 512×512 分辨率视频上进行第二阶段训练,需要 **55 GB** 显存。
同时请记得修改 UNet 配置文件中的参数,以指定数据目录、权重保存路径和其他训练超参数。为了方便,我们提供了一个生成数据文件列表的脚本。运行以下命令:
python -m tools.write_fileslist
## 🏋️♂️ 训练 SyncNet
如果你需要在自定义数据集上训练 SyncNet,可以运行以下脚本。SyncNet 的数据处理流程与 U-Net 相同。
./train_syncnet.sh
训练经过 `validations_steps` 步后,损失图将保存在 `train_output_dir` 中,包含训练和验证损失。如果你需要为不同图像分辨率和输入帧长度定制 SyncNet 架构,请参考[此指南](docs/syncnet_arch.md)。
## 📊 评估
你可以通过以下脚本评估生成视频的 [sync confidence score](https://www.robots.ox.ac.uk/~vgg/publications/2016/Chung16a/chung16a.pdf):
./eval/eval_sync_conf.sh
你还可以通过以下脚本评估 SyncNet 在数据集上的准确率:
./eval/eval_syncnet_acc.sh
注意,我们发布的 SyncNet 是使用经过数据处理流程(包括仿射变换和音视频偏移调整等特殊操作)处理的数据训练的。因此,评估前必须使用提供的流程对测试数据进行预处理。
## 🙏 致谢
- 我们的代码基于 [AnimateDiff](https://github.com/guoyww/AnimateDiff) 构建。
- 部分代码借鉴自 [MuseTalk](https://github.com/TMElyralab/MuseTalk)、[StyleSync](https://github.com/guanjz20/StyleSync)、[SyncNet](https://github.com/joonson/syncnet_python) 和 [Wav2Lip](https://github.com/Rudrabha/Wav2Lip)。
感谢他们对开源社区的慷慨贡献!
## 📖 引用
如果您觉得我们的仓库对您的研究有帮助,请考虑引用我们的论文:
@article{li2024latentsync,
title={LatentSync: Taming Audio-Conditioned Latent Diffusion Models for Lip Sync with SyncNet Supervision},
author={Li, Chunyu and Zhang, Chao and Xu, Weikai and Lin, Jingyu and Xie, Jinghui and Feng, Weiguo and Peng, Bingyue and Chen, Cunjian and Xing, Weiwei},
journal={arXiv preprint arXiv:2412.09262},
year={2024}
}