V-Express是腾讯AI Lab与南京大学共同研发的一项前沿技术,主要用于人像视频的生成。它的主要特点是能够将一张静态的人物照片转化为一段生动的说话视频,同时能够很好地处理多种控制信号,包括音频、姿势和图像参考等。
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
# 然后你可以使用脚本
你可以在这里下载模型。我们在模型卡中包含了所有必需的模型。你也可以从原始仓库单独下载模型。
在说话人脸生成任务中,当目标视频与参考角色不是同一人时,人脸的重定向将是一个非常重要的部分。选择与参考人脸姿态更接近的目标视频将能获得更好的结果。此外,我们的模型目前在英语上表现更好,其他语言尚未详细测试。
如果你有一个目标说话视频,你可以按照下面的脚本从视频中提取音频和人脸V-kps序列。你也可以跳过这一步,直接在步骤2中运行脚本来尝试我们提供的示例。
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。下图中的绿色到红色框是推荐的裁剪范围。
场景1 (A的图片和A的说话视频。) (最佳实践)
如果你有一张A的图片和A在另一个场景中的说话视频。那么你应该运行以下脚本。我们的模型能够生成与给定视频一致的说话视频。你可以在我们的项目页面上看到更多示例。
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
我们优化了内存使用,现在支持生成更长的视频。对于一个31秒的音频,在V100测试环境中需要峰值内存7956MiB,总处理时间为2617.4秒。你可以用以下脚本尝试。
[!NOTE]
./test_samples/short_case/AOC/v_exprss_intro_chattts.mp3
是一个大约30秒的长音频片段,使用ChatTTS生成,我们只需要输入一段文字。然后我们使用V-Express生成一个肖像视频。这可能是一个有趣的流程。
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的图片和任意说话音频。)
如果你只有一张图片和任意说话音频。使用以下脚本,我们的模型可以为固定人脸生成生动的嘴部动作。
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的说话视频。)
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] 我们目前只实现了非常简单的重定向策略,这使我们能够在有限条件下实现用不同角色视频驱动参考人脸。为了获得更好的结果,我们强烈建议你选择与参考人脸更接近的目标视频。我们也在尝试实现更强大的面部重定向策略,希望能进一步解决参考人脸与目标人脸之间不一致的问题。我们也欢迎有经验的人士帮助。
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。
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