返回

JoyHallo:京东健康开源的高效普通话数字人模型

AI

Star

Forks

Watch

Issues

JoyHallo是京东健康研发的,一个专为普通话设计的数字人模型。该项目旨在解决音视频生成领域中,普通话视频生成的难题。

image.png

项目介绍

在音视频生成领域,创建普通话视频面临巨大挑战。 一方面,收集全面的普通话数据集存在困难。 另一方面,与英语相比,普通话复杂的唇部动作进一步增加了模型训练的难度。JoyHallo项目为此应运而生,它基于京东健康国际股份有限公司员工的29小时普通话视频语音数据,构建了名为jdh-Hallo的数据集。 这个数据集涵盖了不同年龄段和说话风格的样本,包含日常对话和专业医学主题。

为了让JoyHallo模型适配普通话,项目采用了中文wav2vec2模型进行音频特征嵌入。 它还引入了一种半解耦结构来捕捉唇部、表情和姿态特征之间的内部关系。这种设计不仅提高了信息利用效率,还将推理速度提升了14.3%。 值得一提的是,JoyHallo保留了生成英语视频的强大能力,展现出卓越的跨语言生成能力。

项目框架包含几个关键部分:

  • 音频处理: 使用中文wav2vec2模型提取音频特征,为后续的唇形生成提供基础。
  • 视觉生成: 基于提取的音频特征,生成对应的唇形、表情和姿态,最终合成为视频。
  • 半解耦结构: 将唇部、表情和姿态特征进行分离处理,再进行融合,提高了生成质量和效率。

该项目提供了预训练模型、训练脚本和推理脚本,方便用户进行实验和应用。

优势分析

JoyHallo项目有几个显著的优势:

  • 针对性强: 专门针对普通话视频生成进行优化,解决了普通话数据集匮乏和唇形复杂的问题。
  • 高效性: 采用半解耦结构,提高了信息利用效率,并将推理速度提高了14.3%。
  • 跨语言能力: 不仅支持普通话,还保留了生成英语视频的能力,具有良好的跨语言生成能力。
  • 易用性: 提供了详细的安装、配置和使用说明,并附带了示例代码和脚本,方便用户快速上手。
  • 数据集支持: 构建了jdh-Hallo数据集,为普通话数字人研究提供了宝贵资源。

使用方法

系统要求

  • 操作系统:Ubuntu 20.04
  • CUDA版本:11.3
  • GPU: A100 (建议)

环境配置

  1. 创建基础环境:

    conda create -n joyhallo python=3.10 -y
    conda activate joyhallo
    
  2. 安装依赖包:

    pip install -r requirements.txt
    
  3. 安装 ffmpeg:

    sudo apt-get update
    sudo apt-get install ffmpeg -y
    

模型准备

  1. 下载预训练模型:

    首先下载基础权重模型

    git lfs install
    git clone https://huggingface.co/fudan-generative-ai/hallo pretrained_models
    

    其次,下载 chinese-wav2vec2-base 模型

    cd pretrained_models
    git lfs install
    git clone https://huggingface.co/TencentGameMate/chinese-wav2vec2-base
    

    最后, 下载 JoyHallo 模型

    git lfs install
    git clone https://huggingface.co/jdh-algo/JoyHallo-v1 pretrained_models/joyhallo
    

    也可以直接从Hugging Face Hub下载: JoyHallo.

  2. 模型目录结构

    下载完成后, pretrained_models 目录应包含以下结构:

    ./pretrained_models/
    |-- audio_separator/
    |   |-- download_checks.json
    |   |-- mdx_model_data.json
    |   |-- vr_model_data.json
    |   `-- Kim_Vocal_2.onnx
    |-- face_analysis/
    |   `-- models/
    |       |-- face_landmarker_v2_with_blendshapes.task
    |       |-- 1k3d68.onnx
    |       |-- 2d106det.onnx
    |       |-- genderage.onnx
    |       |-- glintr100.onnx
    |       `-- scrfd_10g_bnkps.onnx
    |-- hallo/
    |   `-- net.pth
    |-- joyhallo/
    |   `-- net.pth
    |-- motion_module/
    |   `-- mm_sd_v15_v2.ckpt
    |-- sd-vae-ft-mse/
    |   |-- config.json
    |   `-- diffusion_pytorch_model.safetensors
    |-- stable-diffusion-v1-5/
    |   `-- unet/
    |       |-- config.json
    |       `-- diffusion_pytorch_model.safetensors
    |-- wav2vec/
    |   `-- wav2vec2-base-960h/
    |       |-- config.json
    |       |-- feature_extractor_config.json
    |       |-- model.safetensors
    |       |-- preprocessor_config.json
    |       |-- special_tokens_map.json
    |       |-- tokenizer_config.json
    |       `-- vocab.json
    `-- chinese-wav2vec2-base/
        |-- chinese-wav2vec2-base-fairseq-ckpt.pt
        |-- config.json
        |-- preprocessor_config.json
        `-- pytorch_model.bin
    

数据要求

图像:

  • 需要裁剪成正方形.
  • 人脸朝前,并占据图像的50%-70%.

音频:

  • 使用wav格式.
  • 支持普通话, 英语或混合语言, 要求音频清晰,并有合适的背景音乐.

注意:

上述要求适用于训练和推理过程.

推理

  1. 命令行推理

    执行以下命令进行推理:

    sh joyhallo-infer.sh
    

    提示: 如果要提高推理速度, 你可以在 configs/inference/inference.yaml 文件中将 inference_steps 的值从40改为15, 可以尝试同时修改 cfg_scale。 可以在 configs/inference/inference.yaml 中修改参数来指定音频和图像文件, 以及切换模型。 推理结果将保存在 opts/joyhallo 目录下.

    inference.yaml 中的参数解释如下:

    • audio_ckpt_dir: 模型权重路径.
    • ref_img_path: 参考图像路径.
    • audio_path: 参考音频路径.
    • output_dir: 输出目录.
    • exp_name: 输出文件文件夹名称.
  2. 网页 Demo 推理

    执行以下命令启动网页 Demo:

    sh joyhallo-app.sh
    

    Demo 界面将会在 http://127.0.0.1 打开。

训练或微调 JoyHallo

有两种方式可以训练或微调模型: 从 Stage 1 开始训练或仅训练 Stage 2。

  1. 从 Stage 1 开始训练

    sh joyhallo-alltrain.sh
    

    这个命令将自动开始两个阶段 (Stage 1 和 Stage 2) 的训练。 你可以参考 configs/train/stage1_alltrain.yamlconfigs/train/stage2_alltrain.yaml 来调整训练参数。

  2. 仅训练 Stage 2

    sh joyhallo-train.sh
    

    这个命令将从 Stage 2 开始训练, 你可以参考 configs/train/stage2.yaml 文件来调整训练参数。

准备训练数据

  1. 按以下目录结构准备数据,确保数据符合前面提到的数据要求:

    jdh-Hallo/
    |-- videos/
    |   |-- 0001.mp4
    |   |-- 0002.mp4
    |   |-- 0003.mp4
    |   `-- 0004.mp4
    
  2. 使用以下命令处理数据集:

    # 1. 从视频中提取特征.
    python -m scripts.data_preprocess