🙄

Google Colab で hallo2 を使うときにハマったこと

2024/11/21に公開

下記の記事を読み、Google Colab で hallo2 を使いたいと思いました。
思い切ってColab PROを購入して、取り掛かりました。
でも、上手く行きませんでした。

まず参考にした記事は、こちらです。
https://note.com/npaka/n/nd481db182741

Repositoryは、こちらです。
https://github.com/fudan-generative-vision/hallo2

今回の失敗の原因

  • huggingface_hubとdiffusersのアップデートが必要だった
  • 必要なモデルをすべてダウンロードできていなかったこと
  • サンプル素材のディレクトリの指定の誤り

huggingface_hubとdiffusersのアップデート

Google Colabのノートブックで実行しているとき、次のエラーが出ました。

Traceback (most recent call last):
  File "/content/./hallo2/scripts/inference_long.py", line 36, in <module>
    from diffusers import AutoencoderKL, DDIMScheduler
  File "/usr/local/lib/python3.10/dist-packages/diffusers/__init__.py", line 5, in <module>
    from .utils import (
  File "/usr/local/lib/python3.10/dist-packages/diffusers/utils/__init__.py", line 38, in <module>
    from .dynamic_modules_utils import get_class_from_dynamic_module
  File "/usr/local/lib/python3.10/dist-packages/diffusers/utils/dynamic_modules_utils.py", line 28, in <module>
    from huggingface_hub import cached_download, hf_hub_download, model_info
ImportError: cannot import name 'cached_download' from 'huggingface_hub' (/usr/local/lib/python3.10/dist-packages/huggingface_hub/__init__.py)

ChatGPT PlusのGPT-4oに質問したところ、huggingface_hub パッケージのバージョンが古いために発生している可能性がありますと回答がありました。
それで、下記のコマンドを実行しました。

1.huggingface_hub パッケージを更新

!pip install --upgrade huggingface_hub

2. diffusers パッケージも更新

!pip install --upgrade diffusers

モデルのダウンロードについて

参考にした記事では、ファイルが大きすぎてダウンロードができなかったことが書かれていました。
私は、この部分のダウンロードできなったモデルの一覧を作り手動でダウンロードするという部分を行っていなかったのです。

今回ChatGPT PlusのGPT-4oを使て、モデルのダウンロードができるコードを作りました。

from huggingface_hub import HfApi

# リポジトリIDを指定
repo_id = "fudan-generative-ai/hallo2"
base_url = f"https://huggingface.co/{repo_id}/resolve/main"

# ダウンロード先ディレクトリ
download_dir = "./pretrained_models"

# Hugging Face APIを使用してリポジトリ内のファイル一覧を取得
api = HfApi()
files = api.list_repo_files(repo_id=repo_id)

# wgetコマンドを作成して実行
import os

if not os.path.exists(download_dir):
    os.makedirs(download_dir)

for file in files:
    # フルURLを生成
    file_url = f"{base_url}/{file}"
    # 保存先パス
    save_path = os.path.join(download_dir, file)
    
    # 保存先のディレクトリが存在しない場合は作成
    os.makedirs(os.path.dirname(save_path), exist_ok=True)
    
    # wgetコマンドを実行
    os.system(f"wget -O {save_path} {file_url}")

このコードを実行して、必要なモデルのダウンロードと配置ができました。

リップシンクに使う画像と音声ファイルのディレクトリの指定

リップシンクで使う素材は、下記のディレクトリの中にあります。

/content/hallo2/examples

この場所の指定が、上手く行かなかったのです。
それで最初は、下記のように直接下記のファイルを修正しました。

/content/hallo2/scripts/inference_long.py

このように、修正しています。
画像のディレクトリ
修正前

parser.add_argument("--source_image", type=str, required=False,
                    help="source image")

修正後

parser.add_argument("--source_image", type=str, required=False, default="/content/hallo2/examples/reference_images/1.jpg",
                    help="source image")

音声のディレクトリ
修正前

parser.add_argument("--driving_audio", type=str, required=False,
                    help="driving audio")

修正後

parser.add_argument("--driving_audio", type=str, required=False, default="/content/hallo2/examples/driving_audios/1.wav",
                    help="driving audio")

全体のコード

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    parser.add_argument(
        "-c", "--config", default="configs/inference/long.yaml")
    parser.add_argument("--source_image", type=str, required=False, default="/content/hallo2/examples/reference_images/1.jpg",
                        help="source image")
    parser.add_argument("--driving_audio", type=str, required=False, default="/content/hallo2/examples/driving_audios/1.wav",
                        help="driving audio")
    parser.add_argument(
        "--pose_weight", type=float, help="weight of pose", required=False)
    parser.add_argument(
        "--face_weight", type=float, help="weight of face", required=False)
    parser.add_argument(
        "--lip_weight", type=float, help="weight of lip", required=False)
    parser.add_argument(
        "--face_expand_ratio", type=float, help="face region", required=False)
    parser.add_argument(
        "--audio_ckpt_dir", "--checkpoint", type=str, help="specific checkpoint dir", required=False)

    command_line_args = parser.parse_args()

実際には、このスクリプトを直接修正しなくても、環境設定のファイルを修正することで対応できます。
こちらのファイルです。

/content/hallo2/configs/inference/long.yaml

このファイルの中身を適宜修正してください。
ご自身のファイルを使うときも、このファイルを修正してください。

source_image: ./examples/reference_images/1.jpg
driving_audio: ./examples/driving_audios/1.wav

私の環境では、examplesのディレクトリが、下記の位置でした。

/content/hallo2/examples

hallo2というディレクトリ名が無いことで、今回エラーになりました。

実行結果

今回1.jpgなど1の素材を使ったので、このディレクトリになったと思います。
merge_video.mp4を再生すると、リップシンクができていました。

/content/output_long/debug/1/merge_video.mp4

まとめ

以上の内容が、Google Colabでhallo2を実行したときに発生するエラーです。
このエラーが出ずに、スムーズに使える場合もあるかもしれないです。
今回私の学びとして備忘録を兼ねて、記事にまとめました。

Discussion