MultiTalk: generación de video conversacional multi-persona impulsada por audio

MeiGen-AI/MultiTalk es un proyecto de generación de video conversacional multi-persona impulsada por audio, con soporte para generación individual y múltiple, TTS, baja VRAM, aceleración LoRA, cuantización y Gradio.

MeiGen-AI/MultiTalk es un proyecto de generación de video conversacional multi-persona impulsada por audio. Su paper se titula Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation. El objetivo es generar videos de conversación con varias personas a partir de audio multi-stream, una imagen de referencia y prompts, manteniendo alineados el movimiento labial, la interacción y el control por prompt.

MultiTalk no se limita a humanos digitales de una sola persona. También enfatiza conversaciones multi-persona, canto, control interactivo y generación de personajes de estilo cartoon. Soporta salida 480P y 720P. El README indica que el código actual soporta principalmente inferencia 480P, mientras que 720P requiere varias GPU.

Capacidades Principales

Las capacidades de MultiTalk se pueden resumir así:

  • Generación de video impulsada por audio para una o varias personas.
  • Control de interacción de personajes virtuales mediante prompt.
  • Escenarios más generales como personajes cartoon y canto.
  • Salida 480P y 720P.
  • Generación de video de hasta unos 15 segundos.
  • Multi-GPU, TeaCache, APG, inferencia con baja VRAM, TTS, Gradio, aceleración LoRA y cuantización INT8.

Si quieres crear entrevistas multi-persona, videos de podcast, conversaciones con humanos digitales, interacción entre personajes o videos impulsados por TTS, MultiTalk encaja mejor que una herramienta de lip sync para una sola persona.

Instalación

A continuación se conserva el proceso de instalación del README oficial. Usa un entorno Linux con CUDA y prepara Conda, Git, suficiente VRAM y suficiente espacio en disco. El entorno del README se llama multitalk.

Primero clona el repositorio y entra en el directorio:

1
2
git clone https://github.com/meigen-ai/multitalk.git
cd multitalk

1. Crear un entorno conda e instalar PyTorch y xformers

1
2
3
4
conda create -n multitalk python=3.10
conda activate multitalk
pip install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 --index-url https://download.pytorch.org/whl/cu121
pip install -U xformers==0.0.28 --index-url https://download.pytorch.org/whl/cu121

Esto usa el wheel de PyTorch para CUDA 12.1. Si tu driver, CUDA o plataforma son diferentes, ajusta el comando según la guía oficial de instalación de PyTorch.

2. Instalar Flash-Attn

1
2
3
4
5
pip install misaki[en]
pip install ninja
pip install psutil
pip install packaging
pip install flash_attn==2.7.4.post1

flash_attn es sensible a CUDA, la toolchain de compilación y las versiones de PyTorch. Si falla la instalación, revisa primero si CUDA, nvcc, GCC, Python y el wheel de PyTorch son compatibles.

3. Instalar otras dependencias

1
2
pip install -r requirements.txt
conda install -c conda-forge librosa

4. Instalar FFmpeg

En el entorno Conda puedes usar:

1
conda install -c conda-forge ffmpeg

También puedes instalarlo a nivel del sistema. El README da este ejemplo con yum:

1
sudo yum install ffmpeg ffmpeg-devel

Preparación De Modelos

MultiTalk necesita estos modelos:

Modelo Uso
Wan2.1-I2V-14B-480P Modelo base
chinese-wav2vec2-base Codificador de audio
Kokoro-82M Pesos TTS
MeiGen-MultiTalk Pesos de condición de audio de MultiTalk

El README usa huggingface-cli para descargar los modelos. Los comandos oficiales son:

1
2
3
4
5
huggingface-cli download Wan-AI/Wan2.1-I2V-14B-480P --local-dir ./weights/Wan2.1-I2V-14B-480P
huggingface-cli download TencentGameMate/chinese-wav2vec2-base --local-dir ./weights/chinese-wav2vec2-base
huggingface-cli download TencentGameMate/chinese-wav2vec2-base model.safetensors --revision refs/pr/1 --local-dir ./weights/chinese-wav2vec2-base
huggingface-cli download hexgrad/Kokoro-82M --local-dir ./weights/Kokoro-82M
huggingface-cli download MeiGen-AI/MeiGen-MultiTalk --local-dir ./weights/MeiGen-MultiTalk

Si el entorno no tiene huggingface-cli, instala primero Hugging Face Hub:

1
pip install -U huggingface_hub

Tras descargar, el directorio debería contener aproximadamente:

1
2
3
4
5
weights/
  Wan2.1-I2V-14B-480P/
  chinese-wav2vec2-base/
  Kokoro-82M/
  MeiGen-MultiTalk/

Enlazar O Copiar El Modelo MultiTalk

El README pide enlazar o copiar el modelo MultiTalk dentro del directorio Wan2.1-I2V-14B-480P.

Mediante enlaces simbólicos:

1
2
3
mv weights/Wan2.1-I2V-14B-480P/diffusion_pytorch_model.safetensors.index.json weights/Wan2.1-I2V-14B-480P/diffusion_pytorch_model.safetensors.index.json_old
sudo ln -s {Absolute path}/weights/MeiGen-MultiTalk/diffusion_pytorch_model.safetensors.index.json weights/Wan2.1-I2V-14B-480P/
sudo ln -s {Absolute path}/weights/MeiGen-MultiTalk/multitalk.safetensors weights/Wan2.1-I2V-14B-480P/

O copiando los archivos:

1
2
3
mv weights/Wan2.1-I2V-14B-480P/diffusion_pytorch_model.safetensors.index.json weights/Wan2.1-I2V-14B-480P/diffusion_pytorch_model.safetensors.index.json_old
cp weights/MeiGen-MultiTalk/diffusion_pytorch_model.safetensors.index.json weights/Wan2.1-I2V-14B-480P/
cp weights/MeiGen-MultiTalk/multitalk.safetensors weights/Wan2.1-I2V-14B-480P/

Si usas enlaces simbólicos, reemplaza {Absolute path} con tu ruta absoluta real. En Windows o WSL, comprueba también permisos de symlink y resolución de rutas.

Parámetros Comunes

El README lista estos parámetros:

1
2
3
4
5
6
7
8
9
--mode streaming: long video generation.
--mode clip: generate short video with one chunk.
--use_teacache: run with TeaCache.
--size multitalk-480: generate 480P video.
--size multitalk-720: generate 720P video.
--use_apg: run with APG.
--teacache_thresh: A coefficient used for TeaCache acceleration
—-sample_text_guide_scale: When not using LoRA, the optimal value is 5. After applying LoRA, the recommended value is 1.
—-sample_audio_guide_scale: When not using LoRA, the optimal value is 4. After applying LoRA, the recommended value is 2.

Se conserva la escritura original del README. Antes de copiar comandos, ten en cuenta que los guiones antes de sample_text_guide_scale y sample_audio_guide_scale quizá no sean -- estándar; conviene revisarlos manualmente.

Inferencia Con Una Persona

Una persona, una GPU:

1
2
3
4
5
6
7
8
python generate_multitalk.py \
    --ckpt_dir weights/Wan2.1-I2V-14B-480P \
    --wav2vec_dir 'weights/chinese-wav2vec2-base' \
    --input_json examples/single_example_1.json \
    --sample_steps 40 \
    --mode streaming \
    --use_teacache \
    --save_file single_long_exp

Una persona con baja VRAM:

1
2
3
4
5
6
7
8
9
python generate_multitalk.py \
    --ckpt_dir weights/Wan2.1-I2V-14B-480P \
    --wav2vec_dir 'weights/chinese-wav2vec2-base' \
    --input_json examples/single_example_1.json \
    --sample_steps 40 \
    --mode streaming \
    --num_persistent_param_in_dit 0 \
    --use_teacache \
    --save_file single_long_lowvram_exp

Una persona con varias GPU:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
GPU_NUM=8
torchrun --nproc_per_node=$GPU_NUM --standalone generate_multitalk.py \
    --ckpt_dir weights/Wan2.1-I2V-14B-480P \
    --wav2vec_dir 'weights/chinese-wav2vec2-base' \
    --dit_fsdp --t5_fsdp \
    --ulysses_size=$GPU_NUM \
    --input_json examples/single_example_1.json \
    --sample_steps 40 \
    --mode streaming \
    --use_teacache \
    --save_file single_long_multigpu_exp

Una persona con TTS:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
python generate_multitalk.py \
    --ckpt_dir weights/Wan2.1-I2V-14B-480P \
    --wav2vec_dir 'weights/chinese-wav2vec2-base' \
    --input_json examples/single_example_tts_1.json \
    --sample_steps 40 \
    --mode streaming \
    --num_persistent_param_in_dit 0 \
    --use_teacache \
    --save_file single_long_lowvram_tts_exp \
    --audio_mode tts

Inferencia Multi-Persona

Varias personas, una GPU:

1
2
3
4
5
6
7
8
python generate_multitalk.py \
    --ckpt_dir weights/Wan2.1-I2V-14B-480P \
    --wav2vec_dir 'weights/chinese-wav2vec2-base' \
    --input_json examples/multitalk_example_2.json \
    --sample_steps 40 \
    --mode streaming \
    --use_teacache \
    --save_file multi_long_exp

Varias personas con baja VRAM:

1
2
3
4
5
6
7
8
9
python generate_multitalk.py \
    --ckpt_dir weights/Wan2.1-I2V-14B-480P \
    --wav2vec_dir 'weights/chinese-wav2vec2-base' \
    --input_json examples/multitalk_example_2.json \
    --sample_steps 40 \
    --mode streaming \
    --num_persistent_param_in_dit 0 \
    --use_teacache \
    --save_file multi_long_lowvram_exp

Varias personas con varias GPU:

1
2
3
4
5
6
7
8
9
GPU_NUM=8
torchrun --nproc_per_node=$GPU_NUM --standalone generate_multitalk.py \
    --ckpt_dir weights/Wan2.1-I2V-14B-480P \
    --wav2vec_dir 'weights/chinese-wav2vec2-base' \
    --dit_fsdp --t5_fsdp --ulysses_size=$GPU_NUM \
    --input_json examples/multitalk_example_2.json \
    --sample_steps 40 \
    --mode streaming --use_teacache \
    --save_file multi_long_multigpu_exp

Varias personas con TTS:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
python generate_multitalk.py \
    --ckpt_dir weights/Wan2.1-I2V-14B-480P \
    --wav2vec_dir 'weights/chinese-wav2vec2-base' \
    --input_json examples/multitalk_example_tts_1.json \
    --sample_steps 40 \
    --mode streaming \
    --num_persistent_param_in_dit 0 \
    --use_teacache \
    --save_file multi_long_lowvram_tts_exp \
    --audio_mode tts

FusionX, Cuantización Y Gradio

FusioniX o Lightx2v pueden reducir los pasos de muestreo. Ejemplo para una persona del README:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
python generate_multitalk.py \
    --ckpt_dir weights/Wan2.1-I2V-14B-480P \
    --wav2vec_dir 'weights/chinese-wav2vec2-base' \
    --input_json examples/single_example_1.json \
    --lora_dir weights/Wan2.1_I2V_14B_FusionX_LoRA.safetensors \
    --lora_scale 1.0 \
    --sample_text_guide_scale 1.0 \
    --sample_audio_guide_scale 2.0 \
    --sample_steps 8 \
    --mode streaming \
    --num_persistent_param_in_dit 0 \
    --save_file single_long_lowvram_fusionx_exp \
    --sample_shift 2

Ejemplo multi-persona:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
python generate_multitalk.py \
    --ckpt_dir weights/Wan2.1-I2V-14B-480P \
    --wav2vec_dir 'weights/chinese-wav2vec2-base' \
    --input_json examples/multitalk_example_2.json \
    --lora_dir weights/Wan2.1_I2V_14B_FusionX_LoRA.safetensors \
    --lora_scale 1.0 \
    --sample_text_guide_scale 1.0 \
    --sample_audio_guide_scale 2.0 \
    --sample_steps 8 \
    --mode streaming \
    --num_persistent_param_in_dit 0 \
    --save_file multi_long_lowvram_fusionx_exp

El modelo cuantizado INT8 solo soporta ejecución con una GPU:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
python generate_multitalk.py \
    --ckpt_dir weights/Wan2.1-I2V-14B-480P \
    --wav2vec_dir 'weights/chinese-wav2vec2-base' \
    --input_json examples/multitalk_example_2.json \
    --sample_steps 40 \
    --mode streaming \
    --use_teacache \
    --quant int8 \
    --quant_dir weights/MeiGen-MultiTalk \
    --num_persistent_param_in_dit 0 \
    --save_file multi_long_lowvram_exp_quant

Cuantización con LoRA:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
python generate_multitalk.py \
    --ckpt_dir weights/Wan2.1-I2V-14B-480P \
    --wav2vec_dir 'weights/chinese-wav2vec2-base' \
    --input_json examples/multitalk_example_1.json \
    --quant int8 \
    --quant_dir weights/MeiGen-MultiTalk \
    --lora_dir weights/MeiGen-MultiTalk/quant_models/quant_model_int8_FusionX.safetensors \
    --sample_text_guide_scale 1.0 \
    --sample_audio_guide_scale 2.0 \
    --sample_steps 8 \
    --mode streaming \
    --num_persistent_param_in_dit 0 \
    --save_file multi_long_lowvram_fusionx_exp_quant \
    --sample_shift 2

Ejemplo de Gradio:

1
2
3
4
5
python app.py \
    --lora_dir weights/Wan2.1_I2V_14B_FusionX_LoRA.safetensors \
    --lora_scale 1.0 \
    --num_persistent_param_in_dit 0 \
    --sample_shift 2

O:

1
python app.py --num_persistent_param_in_dit 0

Ejemplo de Gradio cuantizado:

1
2
3
4
5
6
python app.py \
    --quant int8 \
    --quant_dir weights/MeiGen-MultiTalk \
    --lora_dir weights/MeiGen-MultiTalk/quant_models/quant_model_int8_FusionX.safetensors \
    --sample_shift 2 \
    --num_persistent_param_in_dit 0

Aspectos A Tener En Cuenta

MultiTalk tiene dependencias pesadas y modelos grandes. Antes de desplegarlo, conviene comprobar lo siguiente:

  • El código actual soporta principalmente inferencia 480P; 720P requiere varias GPU.
  • Las notas oficiales indican que audio CFG suele funcionar bien entre 3 y 5, y aumentar audio CFG puede mejorar el lip sync.
  • El modelo se entrenó con videos de 81 frames a 25 FPS. 81 frames suele funcionar mejor para seguir el prompt; clips más largos pueden reducir esa capacidad.
  • En generación de video largo, Audio CFG afecta la consistencia de color entre segmentos. Se puede probar un valor de 3 para reducir variaciones tonales.
  • El rango recomendado de --teacache_thresh es 0.2 a 0.5. Valores más altos pueden acelerar, pero también bajar la calidad.
  • En entornos con baja VRAM, prueba primero --num_persistent_param_in_dit 0, cuantización INT8 o soluciones comunitarias de baja VRAM.

El README también indica que TeaCache puede aportar una aceleración aproximada de 2 a 3 veces. El resultado real depende de la GPU, resolución, pasos de muestreo, número de personas y uso de LoRA o cuantización.

Resumen

MultiTalk es un proyecto de generación impulsada por audio para video conversacional multi-persona. Encaja con humanos digitales multi-persona, entrevistas, videos impulsados por TTS, interacción de personajes cartoon y canto.

Para una prueba rápida, prepara el entorno y los modelos siguiendo la instalación oficial, completa el enlace o copia del modelo y empieza con el ejemplo 480P de una persona. Cuando funcione, prueba gradualmente multi-persona, TTS, TeaCache, aceleración LoRA, cuantización INT8 y Gradio.

Referencia:

记录并分享
Creado con Hugo
Tema Stack diseñado por Jimmy