V-Express是腾讯AI Lab与南京大学共同研发的一项前沿技术,主要用于人像视频的生成。它的主要特点是能够将一张静态的人物照片转化为一段生动的说话视频,同时能够很好地处理多种控制信号,包括音频、姿势和图像参考等。
核心技术特点
-
渐进式训练:V-Express采用了一种渐进式的训练方法,通过一系列的丢弃操作来平衡不同的控制信号。这种方法使得模型能够在训练过程中逐步适应并强化对不同强度条件的响应,特别是在处理音频这类相对微弱的控制信号时表现更加出色。
-
条件性Dropout:这是V-Express的一个独特之处,它允许模型在训练过程中逐步适应并强化对不同强度条件的响应。通过这种方式,即便是音频这样的弱信号也能够在视频生成中发挥重要作用。
-
多信号融合:V-Express能够同时处理多种类型的控制信号,确保弱信号(如音频)不会被强信号(如姿势和图像)所掩盖。这种平衡有助于在最终生成的视频中保持自然和谐的效果。
功能应用
-
生成肖像视频:V-Express可以根据一张人物照片以及音频等控制信号生成一段人像视频。例如,如果提供一张个人的照片和一段该人的语音录音,V-Express就能够生成一段该人说话的视频。
-
音频信号处理:V-Express能够理解并分析音频信号,并将其转换成视频中的嘴部动作和表情,使得生成的视频与提供的声音同步。
技术背景
V-Express的核心在于使用生成模型来增强适配器以实现受控生成。它利用现代深度学习框架,如Transformer架构和Stable Diffusion变体,实现了复杂动态场景的精确建模,并优化了后处理流程,显著降低了生成视频中的闪烁问题。
安装
# 下载代码
git clone https://github.com/tencent-ailab/V-Express
# 安装依赖
cd V-Express
pip install -r requirements.txt
# 下载模型
git lfs install
git clone https://huggingface.co/tk93/V-Express
mv V-Express/model_ckpts model_ckpts
mv V-Express/*.bin model_ckpts/v-express
# 然后你可以使用脚本
下载模型
你可以在这里下载模型。我们在模型卡中包含了所有必需的模型。你也可以从原始仓库单独下载模型。
- stabilityai/sd-vae-ft-mse。
- runwayml/stable-diffusion-v1-5。这里只需要unet的模型配置文件。
- facebook/wav2vec2-base-960h。
- insightface/buffalo_l。
如何使用
重要提示
重要 ! 重要 ! ! 重要 ! ! ! {\color{red}重要! 重要!! 重要!!!} 重要!重要!!重要!!!
在说话人脸生成任务中,当目标视频与参考角色不是同一人时,人脸的重定向将是一个非常重要的部分。选择与参考人脸姿态更接近的目标视频将能获得更好的结果。此外,我们的模型目前在英语上表现更好,其他语言尚未详细测试。
运行演示 (步骤1, 可选)
如果你有一个目标说话视频,你可以按照下面的脚本从视频中提取音频和人脸V-kps序列。你也可以跳过这一步,直接在步骤2中运行脚本来尝试我们提供的示例。
shell
python scripts/extract_kps_sequence_and_audio.py \
--video_path "./test_samples/short_case/AOC/gt.mp4" \
--kps_sequence_save_path "./test_samples/short_case/AOC/kps.pth" \
--audio_save_path "./test_samples/short_case/AOC/aud.mp3"
我们建议按照下面的示例裁剪一个清晰的方形人脸图像,并确保分辨率不低于512x512。下图中的绿色到红色框是推荐的裁剪范围。
运行演示 (步骤2, 核心)
场景1 (A的图片和A的说话视频。) (最佳实践)
如果你有一张A的图片和A在另一个场景中的说话视频。那么你应该运行以下脚本。我们的模型能够生成与给定视频一致的说话视频。你可以在我们的项目页面上看到更多示例。
shell
python inference.py \
--reference_image_path "./test_samples/short_case/AOC/ref.jpg" \
--audio_path "./test_samples/short_case/AOC/aud.mp3" \
--kps_path "./test_samples/short_case/AOC/kps.pth" \
--output_path "./output/short_case/talk_AOC_no_retarget.mp4" \
--retarget_strategy "no_retarget" \
--num_inference_steps 25
新 ! ! ! {\color{red}新!!!} 新!!! 我们优化了内存使用,现在支持生成更长的视频。对于一个31秒的音频,在V100测试环境中需要峰值内存7956MiB,总处理时间为2617.4秒。你可以用以下脚本尝试。
[!NOTE]
./test_samples/short_case/AOC/v_exprss_intro_chattts.mp3
是一个大约30秒的长音频片段,使用ChatTTS生成,我们只需要输入一段文字。然后我们使用V-Express生成一个肖像视频。这可能是一个有趣的流程。
shell
python inference.py \
--reference_image_path "./test_samples/short_case/AOC/ref.jpg" \
--audio_path "./test_samples/short_case/AOC/v_exprss_intro_chattts.mp3" \
--kps_path "./test_samples/short_case/AOC/AOC_raw_kps.pth" \
--output_path "./output/short_case/talk_AOC_raw_kps_chattts_no_retarget.mp4" \
--retarget_strategy "no_retarget" \
--num_inference_steps 25 \
--reference_attention_weight 1.0 \
--audio_attention_weight 1.0 \
--save_gpu_memory
场景2 (A的图片和任意说话音频。)
如果你只有一张图片和任意说话音频。使用以下脚本,我们的模型可以为固定人脸生成生动的嘴部动作。
shell
python inference.py \
--reference_image_path "./test_samples/short_case/tys/ref.jpg" \
--audio_path "./test_samples/short_case/tys/aud.mp3" \
--output_path "./output/short_case/talk_tys_fix_face.mp4" \
--retarget_strategy "fix_face" \
--num_inference_steps 25
场景3 (A的图片和B的说话视频。)
- 使用下面的脚本,我们的模型可以生成伴随轻微面部动作的生动嘴部动作。
shell
python inference.py \
--reference_image_path "./test_samples/short_case/tys/ref.jpg" \
--audio_path "./test_samples/short_case/tys/aud.mp3" \
--kps_path "./test_samples/short_case/tys/kps.pth" \
--output_path "./output/short_case/talk_tys_offset_retarget.mp4" \
--retarget_strategy "offset_retarget" \
--num_inference_steps 25
- 使用以下脚本,我们的模型可以生成与目标视频相同动作的视频,并且角色的唇同步与目标音频匹配。
[!NOTE]
我们目前只实现了非常简单的重定向策略,这使我们能够在有限条件下实现用不同角色视频驱动参考人脸。为了获得更好的结果,我们强烈建议你选择与参考人脸更接近的目标视频。我们也在尝试实现更强大的面部重定向策略,希望能进一步解决参考人脸与目标人脸之间不一致的问题。我们也欢迎有经验的人士帮助。
shell
python inference.py \
--reference_image_path "./test_samples/short_case/tys/ref.jpg" \
--audio_path "./test_samples/short_case/tys/aud.mp3" \
--kps_path "./test_samples/short_case/tys/kps.pth" \
--output_path "./output/short_case/talk_tys_naive_retarget.mp4" \
--retarget_strategy "naive_retarget" \
--num_inference_steps 25 \
--reference_attention_weight 1.0 \
--audio_attention_weight 1.0
更多参数
对于不同类型的输入条件,如参考图像和目标音频,我们提供了参数来调整该条件信息在模型预测中扮演的角色。我们称这两个参数为reference_attention_weight
和audio_attention_weight
。可以使用以下脚本应用不同的参数来实现不同的效果。通过我们的实验,我们建议reference_attention_weight取值0.9-1.0,audio_attention_weight取值1.0-3.0。
shell
python inference.py \
--reference_image_path "./test_samples/short_case/10/ref.jpg" \
--audio_path "./test_samples/short_case/10/aud.mp3" \
--output_path "./output/short_case/talk_10_fix_face_with_weight.mp4" \
--retarget_strategy "fix_face" \ # 此策略不需要kps信息
--reference_attention_weight 0.95 \
--audio_attention_weight 3.0
我们在下面的视频中展示了不同参数产生的效果。你可以根据需要调整参数。
[Video]
https://github.com/tencent-ailab/V-Express/assets/19601425/2e977b8c-c69b-4815-8565-d4d7c3c349a9