EchoMask: Speech-Queried Attention-based Mask Modeling for Holistic Co-Speech Motion Generation
Xiangyue Zhang*, Jianfang Li*, Jiaxu Zhang, Jianqiang Ren, Liefeng Bo, Zhigang Tuโ
โจACM MM 2025โจ
Official implementation and checkpoints for speech-conditioned holistic co-speech gesture generation with mask modeling.
Keywords: co-speech gesture generation, co-speech motion generation, speech-driven motion generation, masked modeling, BEAT2, and SMPL-X.


๐ฃ Updates
- [2026.07.28] Released the 25-speaker EchoMask checkpoint, reusable
All-Speaker representation weights, evaluation metrics, and paired NPZ
results.
- [2025.09.11] ๐ฅ Release: - [โ] Inference code - [โ] Training code
๐ Inference Data
The two releases use different training protocols and are provided separately:
๐ Results
| Training protocol |
Speakers |
FGD โ (ร10-1) |
BC โ (ร10-1) |
DIV โ |
MSE โ (ร10-8) |
LVD โ (ร10-5) |
| Speaker 2 (paper) |
1 |
4.623 |
7.738 |
13.370 |
6.761 |
7.290 |
| All Speakers (released checkpoint) |
25 |
5.656 |
4.951 |
9.299 |
4.700 |
6.090 |
The Speaker 2 row is copied from Table 1 of the
paper. The All-Speaker row is measured on
the released checkpoint selected by a coarse 10-epoch search followed by a
local 1-epoch search. Raw metrics and checkpoint metadata are in
results/all_speakers. The two rows use different
training protocols and should not be interpreted as a controlled
single-speaker versus multi-speaker ablation.
โ๏ธ Quick Start
Build Environtment
We Recommend a python version =3.8 and cuda version >=12.1. Then build environment as follows:
# [Optional] Create a virtual env
conda create -n EchoMask python=3.8
conda activate EchoMask
# pytorch, torchvison
conda install pytorch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 pytorch-cuda=12.1 -c pytorch -c nvidia
# Install with pip:
pip install -r requirements.txt
sudo apt-get update && sudo apt-get install -y ffmpeg # if you don't have ffmpeg
Download Data
please refer to EMAGE and download datasets from BEAT2 for datasets and place the dataset inside the EchoMask folder, i.e. path-to-EchoMask/BEAT2
Download Weights
Download hubert-large-ls960-ft(used for extracting audio features) weights and place itside in the EchoMask folder, i.e. path-to-EchoMask/facebook.
If you are in China, you can use hf-mirror for faster and more reliable downloads. The process may take some time, so please be patient.
pip install -U huggingface_hub
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download --resume-download facebook/hubert-large-ls960-ft --local-dir facebook/hubert-large-ls960-ft
Choose the weights that match the intended protocol:
The Hugging Face archives exclude SMPLX_NEUTRAL_2020.npz. Download SMPL-X
from the official website under its own
license and place it in the path expected by the repository.
Keep the original Speaker 2 archive in its documented locations. Install the
All-Speaker archive without overwriting those files:
unzip EchoMask_all_speakers_weights_25spk.zip
cp -R EchoMask_all_speakers_weights/weights/all_speakers ./weights/
Finally, these EchoMask folder should be orgnized as follows:
.
โโโ BEAT2
โ โโโ beat_english_v2.0.0
โโโ configs
โโโ dataloaders
โโโ datasets (this folder will appear after you generate the datasets)
โ โโโ beat2_cache2
โ โโโ beat2_echomask_train
โ โโโ echomask_dataloader.py
โโโ facebook
โ โโโ hubert-large-ls960-ft
โโโ models
โโโ optimizers
โโโ src
โโโ utils
โโโ weights
โ โโโ pretrained_vq
โ โโโ smplx_models
โ โโโ best_echomask.bin
โ โโโ all_speakers
โ โโโ pretrained_vq
โ โโโ best_echomask.bin
โโโ ae_trainer.py
โโโ aeface_trainer.py
โโโ aelower_trainer.py
โโโ aelowerfoot_trainer.py
โโโ requirements.txt
โโโ echomask_trainer.py
โโโ echomask_trainer.py
โโโ train.py
Generate Dataset
Notice: Please make sure you are in the root directory, i.e. path-to-EchoMask.
- To generate the training dataset, run:
python dataloaders/save_train_dataset.py # generate train dataset
This process may take some time, so please be patient.
- To generate the test dataset, run:
python dataloaders/save_test_dataset.py # generate test dataset
๐Training, Testing, and Inference
Training of EchoMask
The commands below preserve the original Speaker 2 protocol. For the separate
25-speaker preprocessing, training, checkpoint search, and evaluation
workflow, see
scripts/all_speakers/README.md.
Train RVQ-VAE
The commands below reproduce the original Speaker 2 RVQ-VAE protocol. You
can train the models yourself and place them under path-to-EchoMask/weights,
or download weights that match your training protocol:
- Speaker 2 (paper protocol): use the
original pretrained weights.
- All Speakers (25 English BEAT2 speakers): use the
All-Speaker weights.
They contain the five shared representation checkpoints under
weights/all_speakers/pretrained_vq and the selected EchoMask checkpoint.
The representation models do not need to be retrained for EchoMask.
torchrun --nproc_per_mode=1 train.py --train_rvq --config configs/cnn_vqvae_face_30.yaml # face
torchrun --nproc_per_mode=1 train.py --train_rvq --config configs/cnn_vqvae_hands_30.yaml # hands
torchrun --nproc_per_mode=1 train.py --train_rvq --config configs/cnn_vqvae_upper_30.yaml # upper body
torchrun --nproc_per_mode=1 train.py --train_rvq --config configs/cnn_vqvae_lower_foot_30.yaml # lower foot
torchrun --nproc_per_mode=1 train.py --train_rvq --config configs/cnn_vqvae_lower_30.yaml # lower body
Training of EchoMask
torchrun --nproc_per_mode=1 train.py --config configs/echomask.yaml
Testing of EchoMask
Notice: Before running the test code, make sure the load_ckpt and base_ckpt paths in configs/echomask.yaml are set correctly.
torchrun --nproc_per_mode=1 train.py --test_state --config configs/echomask.yaml
Inference
you can put your inference wav format aduio on ./demo path, for example, you can run:
torchrun --nproc_per_mode=1 train.py --inference --config configs/echomask.yaml --audio_infer_path ./demo/2_scott_0_1_1_test.wav
๐บ Visualize
Following EMAGE, you can download SMPLX blender addon, and install it in your blender 3.x or 4.x. Click the button Add Animation to visualize the generated smplx file (like xxx.npz).
๐ Acknowledgments
Thanks to EMAGE, DiffSHEG, our code is partially borrowing from them. Please check these useful repos.
๐ Citation
If you find our code or paper helps, please consider citing:
@inproceedings{zhang2025echomask,
title={EchoMask: Speech-Queried Attention-based Mask Modeling for Holistic Co-Speech Motion Generation},
author={Zhang, Xiangyue and Li, Jianfang and Zhang, Jiaxu and Ren, Jianqiang and Bo, Liefeng and Tu, Zhigang},
booktitle={Proceedings of the 33rd ACM International Conference on Multimedia},
pages={10827--10836},
year={2025}
}
่ฏ่ฎบ