MultiTalk:音声駆動の複数人物対話動画生成プロジェクト

MeiGen-AI/MultiTalk は、単一人物・複数人物生成、TTS、低 VRAM 推論、LoRA 高速化、量子化、Gradio に対応した音声駆動の複数人物対話動画生成プロジェクトです。

MeiGen-AI/MultiTalk は、音声駆動の複数人物対話動画生成プロジェクトです。論文タイトルは Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation です。複数ストリーム音声、参照画像、プロンプトから複数人物の対話動画を生成し、口の動き、相互作用、プロンプト制御を一致させることを目的としています。

MultiTalk は単一人物のデジタルヒューマンだけを対象にしていません。複数人物の会話、歌唱、インタラクション制御、カートゥーンキャラクター生成も重視しています。480P と 720P 出力に対応しますが、README では現在のコードは主に 480P 推論をサポートし、720P には複数 GPU が必要だと説明されています。

主な機能

MultiTalk の機能は次のように整理できます。

  • 単一人物と複数人物の音声駆動動画生成。
  • prompt による仮想人物のインタラクション制御。
  • カートゥーンキャラクターや歌唱など、より汎化された生成シーン。
  • 480P と 720P 出力。
  • 最大約 15 秒の動画生成。
  • 複数 GPU、TeaCache、APG、低 VRAM 推論、TTS、Gradio、LoRA 高速化、INT8 量子化。

複数人物インタビュー、ポッドキャスト動画、デジタルヒューマン対話、キャラクター同士のやり取り、TTS 駆動の人物動画を作るなら、単一人物リップシンク系のプロジェクトより MultiTalk の方が近い用途です。

インストール手順

以下は公式 README のインストール手順を保ったものです。CUDA 対応の Linux 環境を使い、Conda、Git、十分な VRAM とディスク容量を事前に用意してください。README の環境名は multitalk です。

まずリポジトリを clone し、ディレクトリに入ります。

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

1. conda 環境を作成し、PyTorch と 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

ここでは CUDA 12.1 向けの PyTorch wheel を使っています。ドライバー、CUDA、プラットフォームが異なる場合は、PyTorch 公式の案内に従ってインストールコマンドを調整してください。

2. 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 は CUDA、コンパイラツールチェーン、PyTorch バージョンに敏感です。インストールに失敗する場合は、CUDA バージョン、nvcc、GCC、Python バージョン、PyTorch wheel の組み合わせを先に確認してください。

3. その他の依存をインストールする

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

4. FFmpeg をインストールする

Conda 環境内では次のように使えます。

1
conda install -c conda-forge ffmpeg

システム側にインストールすることもできます。README の yum 例は次のとおりです。

1
sudo yum install ffmpeg ffmpeg-devel

モデル準備

MultiTalk には次のモデルが必要です。

モデル 用途
Wan2.1-I2V-14B-480P ベースモデル
chinese-wav2vec2-base 音声エンコーダー
Kokoro-82M TTS 重み
MeiGen-MultiTalk MultiTalk の音声条件重み

README では huggingface-cli を使ってモデルをダウンロードします。公式コマンドは次のとおりです。

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

環境に huggingface-cli がない場合は、先に Hugging Face Hub をインストールします。

1
pip install -U huggingface_hub

ダウンロード後のディレクトリは、おおよそ次のようになります。

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

MultiTalk モデルをリンクまたはコピーする

README では、MultiTalk モデルを Wan2.1-I2V-14B-480P ディレクトリへリンクまたはコピーする必要があります。

シンボリックリンクを使う場合:

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/

または直接コピーします。

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/

シンボリックリンクを使う場合は、{Absolute path} を自分の絶対パスに置き換えてください。Windows や WSL 環境では、リンク権限とパス解決も確認してください。

よく使うパラメータ

README のパラメータ説明は次のとおりです。

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.

README の表記をそのまま残しています。実際にコマンドをコピーする前に、sample_text_guide_scalesample_audio_guide_scale の前のダッシュが標準の -- かどうか手動で確認してください。

単一人物推論例

単一人物、単一 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

単一人物の低 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

単一人物の複数 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

単一人物の 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

複数人物推論例

複数人物、単一 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

複数人物の低 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

複数人物の複数 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

複数人物の 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、量子化、Gradio

FusioniX または Lightx2v はサンプリングステップ数を減らせます。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

複数人物例:

 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

INT8 量子化モデルは単一 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

量子化 + 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

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

または:

1
python app.py --num_persistent_param_in_dit 0

量子化 Gradio の例:

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

使うときの注意点

MultiTalk は依存関係もモデルも重めです。実際に導入する前に、次の点を確認してください。

  • 現在のコードは主に 480P 推論をサポートし、720P には複数 GPU が必要。
  • 公式メモでは、音声 CFG は通常 3 から 5 の範囲がよく、audio CFG を上げるとリップシンク精度が改善しやすい。
  • モデルは 25 FPS、81 フレーム動画で学習されており、81 フレームが prompt 追従に向いている。より長いフレーム数では prompt 追従が弱くなる可能性がある。
  • 長尺動画生成では Audio CFG がセグメント間の色調一貫性に影響する。色調変化を抑えるには 3 を試せる。
  • --teacache_thresh の推奨範囲は 0.2 から 0.5。値を上げると速くなる可能性があるが、動画品質が下がることもある。
  • 低 VRAM 環境では、--num_persistent_param_in_dit 0、INT8 量子化、またはコミュニティの低 VRAM 方案を先に試す。

README では、TeaCache により約 2 から 3 倍の速度向上が可能だとも説明されています。実際の効果は GPU、解像度、サンプリングステップ、人物数、LoRA や量子化の有無に左右されます。

まとめ

MultiTalk は、複数人物対話動画向けの音声駆動生成プロジェクトです。複数人物デジタルヒューマン、インタビュー動画、TTS 駆動動画、カートゥーンキャラクターのインタラクション、歌唱などに向いています。

まず試すだけなら、公式のインストール手順で環境とモデルを準備し、モデルのリンクまたはコピーを済ませてから、480P の単一人物例を実行するのがおすすめです。動作確認後に、複数人物、TTS、TeaCache、LoRA 高速化、INT8 量子化、Gradio を段階的に試すと進めやすくなります。

参考リンク:

记录并分享
Hugo で構築されています。
テーマ StackJimmy によって設計されています。