SadTalker 是一个使用静态人物图片与音频文件自动合成人物说话的视频动画开源模型。它从音频中生成 3DMM(3D Morphable Model,三维可变形模型)运动系数,包括头部姿势和表情等信息,通过对音频特征的分析和学习,将其转化为人物头部与面部的运动参数,并映射到面部渲染器的三维关键点空间,以生成最终的视频。该模型支持中英文在内的多种语言,根据自己的需求进行参数定制和调整,获得符合自己期望的视频动画效果。在内容创作、智能交互、情感分析和表达等诸多领域有着广泛的应用。
首先调用 init_path 函数对模型做初始化操作,model_sad_talker_path 参数为模型的 checkpoints 路径,第二个参数为模型配置路径,size 参数为控制程序在进行面部渲染时生成图像的大小,preprocess 参数为用户选择的预处理方法调整输入图像的尺寸、内容或边界。接下来构造了三个模型对象:Audio2Coeff 为将音频转换成系数的对象,CropAndExtract 为裁剪并提取特征的对象,AnimateFromCoeff 为从系数生成动画的对象,cuda 参数表示指定使用 CUDA 支持的 GPU 进行处理。
from utils.sad_talker.src.utils.init_path import init_path
from utils.sad_talker.src.test_audio2coeff import Audio2Coeff
from utils.sad_talker.src.utils.preprocess import CropAndExtract
from utils.sad_talker.src.facerender.animate import AnimateFromCoeff
path = init_path(
model_sad_talker_path,
os.path.join(os.path.split(sys.argv[0])[0], config_dir),
size,
None,
preprocess
)
audio_to_coeff = Audio2Coeff(path, 'cuda')
preprocess_model = CropAndExtract(path, 'cuda')
animate_from_coeff = AnimateFromCoeff(path, 'cuda')
接下来调用 preprocess_model 对象的 generate 方法来对图片提取 3DMM 运动系数, pic_path 参数为图片素材的存放路径, frame_dir 参数为处理帧的存放路径,preprocess 参数为调整输入图像的尺寸、内容或边界的预处理参数,source_image_flag=True 标记是否使用源图像, pic_size=size 为指定图片的尺寸大小。
first_coeff_path, crop_pic_path, crop_info = preprocess_model.generate(
pic_path,
frame_dir,
preprocess,
source_image_flag=True,
pic_size=size
)
再然后是调用 audio_to_coeff 对象的 generate 方法来对音频数据进行处理,其中 get_data 方法用于获取音频数据,该方法的 first_coeff_path 参数为初始系数路径, audio_path 参数为传入的音频文件存放路径,device 参数为设备类型,可以是 CPU 或 CUDA 支持的 GPU, still 参数用于控制生成视频时头部运动的幅度。audio_to_coeff 对象的 generate 方法的 save_dir 参数指定了保存结果的路径, pose_style 参数允许用户根据需求选择不同的姿势风格参与到程序的处理或生成任务中。
coeff_path = audio_to_coeff.generate(
get_data(first_coeff_path, audio_path, device, None, still),
save_dir,
pose_style,
None
)
接下来调用 animate_from_coeff 对象的 generate 方法来生成视频动画。其中 get_facerender_data 方法用于获取面部渲染数据,coeff_path 参数为前面生成的系数路径,crop_pic_path 参数为裁剪后图片路径,first_coeff_path 参数为初始系数路径,audio_path 参数为音频文件路径, batch_size 参数为批处理大小,expression_scale 参数为表情缩放比例, still_mode 参数指定人物头部运动幅度,preprocess 参数限制图像的尺寸、内容或边界,size 参数为渲染结果尺寸。animate_from_coeff 对象的 generate 方法的第二个参数 save_dir 指定保存结果的目录,pic_path 参数为输入图片素材的路径,crop_info 参数为裁剪图片的信息, enhancer 参数为增强器, background_enhancer 参数为背景增强器。
result = animate_from_coeff.generate(
get_facerender_data(
coeff_path,
crop_pic_path,
first_coeff_path,
audio_path,
batch_size,
None,
None,
None,
expression_scale=expression_scale,
still_mode=still,
preprocess=preprocess,
size=size
),
save_dir,
pic_path,
crop_info,
enhancer='gfpgan',
background_enhancer=background_enhancer,
preprocess=preprocess,
img_size=size
)
模型参数清单
字段名称 | 字段数值 | 数值选项 | 参数名称 | 参数描述 |
---|---|---|---|---|
pose_style | 0 | 0 - 45 | 姿势风格 | 根据需求选择不同的姿势风格参与到程序的处理或生成任务中。 |
batch_size | 2 | 1 - 20 | 面部渲染 | 该参数控制程序在处理面部渲染任务时一次性处理的数据样本数量,以适应不同的计算资源和性能需求。 |
size | 256 | 256、512 | 渲染尺寸 | 该参数控制程序在进行面部渲染时生成图像的大小,以满足不同的应用场景或输出要求。 |
expression_scale | 1.0 | 0.0 - 3.0 | 表情修正 | 该参数控制面部渲染时调整表情的大小或夸张程度。 |
input_yaw | None | 10 20 30 | 头部偏航角 | 该参数允许用户指定与头部姿态相关的偏航角,用于影响面部渲染、姿态估算或其他与头部方向相关的处理。 |
input_pitch | None | 10 20 30 | 头部俯仰角 | 该参数允许用户指定与头部姿态相关的俯仰角,用于影响面部渲染、姿态估算或其他与头部朝向相关的处理。 |
input_roll | None | 10 20 30 | 头部翻滚角 | 该参数允许用户指定与头部姿态相关的翻滚角,用于影响面部渲染、姿态估算或其他与头部旋转相关的处理。 |
enhancer | None | None gfpgan RestoreFormer | 面部清晰度 | 该参数允许用户选择使用特定的人脸增强算法来改善输入图像中人脸的质量或清晰度。 |
background_enhancer | None | None realesrgan | 背景清晰度 | 该参数允许用户选择使用特定的背景增强算法来改善输入图像中非人脸区域(背景)的质量或清晰度。 |
cpu | cuda | cpu cuda | CPU 优先 | 该参数通常用于控制程序运行时是否优先使用 CPU 资源。 |
still | True | True False | 头部运动幅度 | 该参数用于控制生成视频时头部运动的幅度。 |
preprocess | full | crop extcrop resize full extfull | 取景范围 | 该参数允许用户选择不同的预处理方法来调整输入图像的尺寸、内容或边界。 |