見出し画像

女の子が歩くまで - Stable DiffusionとPythonの画像処理と自動化(1)

AI で映像クリエーターを志すみなさん。
まずは以下の動画を見てみましょう。

女の子が旅をするような映像で MV をつくりたかったんですね。
AVICII の Waiting For Love の MV なんか、とてもいいですね。
いつかあのレベルまでつくってみたいものです。もちろん AI だけで。

背景映像は、kaiber.ai で生成できます。すきなプロンプトを入れましょう。
音楽は自分で作りましょう。誰でも suno.com に行けば作れます。
映像全体の編集なんかは、Windows 11 に無料でついてる Clipchamp 使えば、Adobe のゴージャスなツールなんかいりません。

問題は、左下の、歩いてる女の子です。

まずは、結局これにしたパラパラ動画。

続いて、フレーム間を補完する画像処理を入れてみたもの。
残念ですが、こっちは結局使いませんでした。

上記の映像について、採用できなかった説明を少し。画像処理と数学の話しなので、わかる人だけどうぞ。わからない人は読み飛ばしてください。

補完アルゴリズムに2次関数を用いた非線形補完をしていますが、シグモイド関数にする、エッジ検出と保持で輪郭を保持する、と、いろいろ試してみましたが、補完している間のアルファ値によってどうしても背景に埋もれて、特に足元が背景に溶けてしまいます。
フレーム間の補完の程度を、線形にすると全体が透過して見にくくなるので、正弦波のイージング関数であえて中間を強くしたのですが、それが逆に悪かったのかもしれません。
この辺、いろいろ議論したい方いたらぜひコメントへ。


はい、イラストレーターの皆さん、お疲れ様です。
イラストレーターの皆さんは、ここまでで十分でしょう。
自分でパラパラ動画を背景を緑にした映像にしちゃえばおしまいです。
お疲れ様です。

絵を書けない!
Stable Diffusion でこんな風に歩く女の子を生成したい!
という方が、ここから先の記事の対象になります。

ここまでたどり着くの結構頑張ったんで、有料記事にしたいくらいに思ったんですが、一旦は公開します!
いつか有料になるかも!
その時はすいません。

歩く女の子の動画なんか、Deforum 使えば簡単じゃない?
Motion 動画で AnimateDiff 使えば簡単できるでしょ?

そう考えたあなた。やってみてください。むしろ、それで背景を透過にして同じものができるなら、お金を払うので教えてほしいくらいです。
note にしてくれたら、有料記事でも読ませていただきますので、コメントして教えてください。
ここまで読んでいただいてありがとうございます。

それでもうまくいかない!できない!
という方が、ここから先の記事の対象になります。

なお、すでにある程度、Stable Diffusion webui の使い方に慣れている方を前提としているので、Stable Diffusion webui の使い方が分からない方は、他の方の記事や、YouTube の解説動画などで、まず使い方を勉強してください。自分でまあまあな画像生成はできるよ、という方はここから先に進んでください。



動作環境

ローカル PC で作成しました。GPU はないと辛いかも。
Google Corab や Jupyter Notebook を使っている方でもできるとは思いますが試してません。

PC のスペック

  • Windows 11

  • CPU : 11th Gen Intel(R) Core(TM) i7-11700@2.50GHz

    • コア : 8

    • 論理プロセッサ数 : 16

  • メモリ : 16GB

  • GPU : NVIDIA GeForce RTX3060

    • GPU メモリ : 19.9 GB

      • GPU 専用メモリ : 12 GB

      • 共有 GPU メモリ : 7.9 GB

Stable Diffusion webui の準備

以下が、Stable Diffusion webui の Extension です。

Stable Diffusion の拡張機能のリスト

この中で、最も重要なのは以下です。

上記4つの Extension が入っている前提でこの記事は進めます。


今回使ったモデルと VAE、Sampler 等

モデルやら VAE やらは自分で好きなもの使っていいんですが、参考まで。

  • Checkpoint : animeGod_v10

  • VAE : animevae.pt

  • Sampling method : DDIM

  • Schedule type : Automatic

人物の背景が透過になる画像の生成

最終的に歩いている女の子の背景は、後ろで流す別の映像に重ねたいので、女の子の背景は不要です。なので、背景を除去しなければなりません。
いろんな画像編集ソフトでもできることですが、後述しますが、パラパラ動画にするために量のある画像を生成しなければならないので、いちいち1枚ずつやってなんかいられません。

ABG Remover

これはすでにご存じの方も多いでしょう。ABG Remover ですね。
他にも使い方を説明してくれてる情報はあちこちにありますが、ここでも説明させていただきます。
ABG Remover は、簡単に言うと、生成した人物の背景を、指定した色や透明にしてくれたり、マスク画像を作成してくれたりします。
以下の3つを生成することができます。

普通につくるとこう
背景をなくして透過ピクセルにした png ファイル
人物だけをマスクする画像

今回は背景を透明にした画像を作ります。

ともかく女の子を生成する

Stable Diffusion で txt2img で、ともかく作りたい人物を作りましょう。
が、ここで、コツが2つあります。

  • 背景周りの prompt に (blurry:2), を入れる
    背景をぼやけさせます。これ大事。
    ABG Remover が事物と背景を区別しやすくなります。
    simple_background,nobody_background, とかも入れたらいいかも。
    ともかく背景は使わないから。

  • ここでは ADetailer は使わない
    いちいち毎回これ使ってたら、時間がいくらあっても足りません。
    あとで使うことにして、これという画像を見つけるまでは使わないようにします。

作ったら、PNG 画像は保存してください。Stable Diffusion の PNG Info でプロンプトや Seed 等のパラメータを再利用するので。

背景がぼやけた女の子ができます

ADetailer でいい感じにする

人物ができたら ADetailer で細部をいい感じにしたいですね。
デフォルトで使ってもいいんですが、デフォルトだと、ぼやけた背景の中から、無駄な検出をして処理して、時間がいくらあっても足りません。
ここではこんな感じに設定しました。すいません、もっといい指定したほうがいいよって人、教えてください。

  • ADetailer を有効にする

    • 1st ( 顔の調整 )

      • ADetailer detector  : face_yolov8n.pt

      • Detection

        • Mask only the top k largest : 1
          人物が 1 人しかいない前提なので 1 にします。
          背景にたまに顔っぽいぼやけた画像まで検出しちゃうんで、その処理は時間がかかるんでしたくありません。

      • Inpainting

        • ContorolNet Model : control_v11p_sd15_inpaint_fp16

        • ControlNet module : inpaint_global_harmonious

    • 2nd ( 手の調整 )

      • ADetailer detector  : hand_yolov8n.pt

      • Detection

        • Mask only the top k largest : 2
          人物が 1 人しかいない前提なので、手は2つのはずなので 2 にします。顔同様、背景にたまに手っぽいぼやけた画像まで検出しちゃうんで。

      • Inpainting

        • ( 1st と同じ )

    • 3rd ( 人物全体の調整 )

      • ADetailer detector  : person_yolov8n-seg.pt

      • Detection

        • Detection model confidence threshold 3rd : 0.8
          無駄な人物を検出しないように、検出しにくくします。

        • Mask only the top k largest : 1
          人物が 1 人しかいない前提なので、1 にします。
          顔同様、背景にまあまあ人物っぽいぼやけた画像を、結構検出しちゃうんですよ。

      • Inpainting

        • ( 1st と同じ )

    • 4th

      • Enable を OFF

ABG Remover で背景を透過にする

さあ、ADetailer で細部の調整のパラメータをいれたら、背景を透過させた画像を生成ましょう。ABG Remover が入ってたらとても簡単。
txt2img の一番下の、Script で、ABG Remover を選択するだけ!

ABG Remover
Stable Diffusion webui の結果
あんまり変わってないですが、顔のあたりが微妙に詳細に描かれています
背景が透明

歩く女の子の画像を作る(その 1 - ffmpeg とモーション動画 )

さて、ベースの女の子はできました。でも、歩かせたいんですよね。

プロンプトをどんだけいじろうが、Deforum や AnimateDiff 使おうが、いい感じにはなりません。何が一番できないって、Deforum や AnimateDiff と ABG Remover を、同時に使えないんですよ。いや、AnimateDiff となら使えるんですけど、まー、所詮 AI がすること。いまいちなんですよ。
何がいまいちって、左右の手足の動きがもーめちゃくちゃ。
そんなことないよ!うまくできるよ!っていう人、教えてください。

ここで ControlNet の登場です。
というか ContorolNet でいろんな動きのある映像、皆さん作ってますよね。だからこれでいいんじゃない?と思うそこのあなた。
そんな簡単にいかないのが、横向きで歩く女の子なんですよ。

ぶっちゃけ、こちらを参考にしました。基本的に、ちらのサイトの通りにすればいいです。

以降は、上記サイトの情報に加えて、今回つくりたい横向きに歩く女の子についての補足です。

ともかく、ControlNet で歩く女の子を作るために、モーションのベースになる歩いている映像が必要です。上記サイトの言う通りに Mootion でゲットしましょう。

ここで、Discord で Mootion のサーバに参加すると、多数の ControlNet で使えそうなモーションの動画が探せます。「 forward walk cycle 」で検索すると横向きであるくモーション動画がみつかるので、これをダウンロードして使いましょう。

Mootion の Discord で歩くモーションを探す。今回は下のやつ。

あとは、上記サイトの内容に従って、ffmpeg でこの画像の左半分を切り取って、ControlNet 用のモーション動画にします。
サイト内にもありますが、ffmpeg のコマンドは以下。

# インプットファイル用にインプットファイル名を定義
SET input=female_character_walking_towards__bot_left.mp4
# アウトプットファイル用にインプットファイル名を加工
SET base_name=%input:~0,-4%
# 左半分の動画を生成
ffmpeg -i %input% -vf "crop=in_w/2:in_h:0:0" %base_name%_left.mp4

ffmpeg のインストール方法はこちら。

歩く女の子の画像を作る(その 2 - ControlNet で試した )

実は、先に紹介したサイトの通りにしてうまくいったんなら、ここで終われるんですよ。僕が記事を書くまでもない。

が、この横向きの女の子、ってのが、そう簡単にはいかないのですよ!
何度も言うよ!
うまくいかないの!できるなら教えて!

ともかくきれいに作りたいし、足とかあちこちが消えるとか嫌だし。
サイトの通りにやってうまくいくなら、この先は何なら読まなくてもいいですね。上手くいかない方は、この先へどうぞ。

ともかく、ControlNet でモーション動画をそのまま使っても、女の子は左右の手足をきれいに前後に動かして歩いてくれません。
おそらく ControlNet でモーションを取得した後の画像生成の過程で、左右の手足をちゃんと認識してくれないんでしょう。
こちらがその結果です。これで満足できますか?

僕は不満です。
さてどうしよう。

歩く女の子の画像を作る(その 3 - とりあえずバラシてみる )

Mootion から取得した動画そのままの全フレームつかわなくていいんじゃない?ループできる程度の画像だけで構成できればいいんじゃない?多少のゴミはしゃーないから手作業で除去するとして、最小限の画像だけでループさせようと思い至ります。
なので、ともかく、多数の画像をつくることは後で考えることにして、1 枚の画像をつくることを考えます。

まず Mootion で取得したモーション映像を、バラバラの画像にします。
ffmpeg を使います。なんならここから先、ffmpeg めちゃくちゃ使います。
コマンドプロンプトで以下を実行。

mkdir motion_frames_half
ffmpeg -i female_character_walking_towards__bot_left.mp4 -vf "select='not(mod(n,2))',setpts=N/FRAME_RATE/TB" -vsync vfr motion_frames_half\motion_%04d.png

さあ、バラバラのモーション画像ができました。

フレーム抽出したモーション画像群

まずは、最初のフレームで、ControlNet で画像を生成してみましょう。

  1. 最初に作った画像を PNG Info でプロンプトや Seed 等の設定を読み込む

  2. Send txt2img をクリックして txt2img へ。すでにプロンプトや Seed 等が入っています

  3. ADetailer が有効になってるのを確認

  4. ControlNet の Unit0 に、モーション動画を設定

  5. ControlNet の Unit0 の設定をします。
    Enable : チェック入れます。入れないと使われません
    Control Type : OpenPose
    Preprocessor : dw_openpose_full
    Model : control_v11p_sd15_openpose_fp16
    Control Weight : 1.75
    Control Mode : ControlNet is more important

  6. Script に ABG Remover を指定

さあ、Generate!

歩く女の子の画像を作る(その 4 - 左右の手足をいい感じにする )

ControlNetを使った結果を並べてみました

さー
ControlNet に全部まかせてうまくいかない原因が、ここでわかりますね。
左右の手足が、逆なんですよ。
ここで、OpenPose Editor の登場です。
モーションの情報を、左右がちゃんと認識される程度に調整します。

ControlUnit のエリアの、Preprocessor と Model の間のなんだか爆発したようなアイコンのボタンを押すとこんな画面に。

ControlNet で Preprocessor を実行

モーション画像の横に、モーションを成す多数の線が表示されます。
線がそれぞれ胴体のパーツを意味していますが、これ編集できるんですね。
なので、ちゃんと左右がうまく認識されるように、これを編集します。
右に小さく「Edit」とあるので、そこをクリック。

OpenPose Editor 画面

ここは、若干試行錯誤ですが、なんとなく、重なりが可能な限り少なくして、お尻は逆にくっつけたほうがよいようです。
あと、右手と左手がどうやっても逆に認識されちゃうんで、位置を左右どちらにでも使えるように近づけてみました。
あと、背中に 3 本目の手が出たりするんですが、お尻の位置を調整すると消えたりします。
編集後は、左上の「ControlNet にポーズを送信」を忘れずに!
うっかり右上のバツを押すと、せっかく編集したのに消えちゃいます。
ここは試行錯誤を繰り返すので、ADetailer は一旦無効にします。
このモーションの編集と Generate を繰り返します。
試行錯誤の末、こんな風にしてみました。

ControlNet を編集
編集後に生成された背景が透過の女の子

おお、、、左右の足がちゃんとなってるじゃないのさ。
でも、髪付近のぼやけた部分とか、気に成るなあ・・・
まあ、あとで考えよう。


背景が透過な歩く女の子のパラパラ画像の生成 - Python 登場

さて、1 枚 1 枚の画像がいい感じに作れるようにはなりました。
ですが、作りたいのは歩く女の子の「映像」なので、1枚1枚こんなことやってらんないよ!なんなら描いたほうが早いよ!描けないけど。

じゃあどうするか。

ここからが、Python の登場です。
さあ、プログラミングの世界がやってきました。
プログラミングなんかできないよ・・・という方。安心してください。
そのまま使えるソースコードと動かし方、この記事にありますよ。

ご存じの方も多いでしょうが Stable Diffusion webui は API を備えています。
なので画面で操作したことを Python で自動化しちゃいましょう。
そして、自動化するついでに、ぼやけた画素も画像中から除去する処理を入れちゃいます。

さすがに ControlNet の OpenPose Editor は自動化できるところじゃないので、生成後に一部の画像に行うにして、ともかくモーションから背景が透過の、歩く女の子の多数の画像を作りましょう。
実際には結構な枚数を作りますが、ここでは最低限歩く動作になる程度で。

今回はこの範囲だけで

さー、Python のコードです。

import webuiapi
from PIL import Image
import numpy as np
import os
import glob

PROMPT = '''
( 自分のプロンプト )
'''
NEGATIVE_PROMPT = '''
( 自分のネガティブプロンプト )
'''
SEED = (自分の Seed )
CONTROLNET_MOTION_DIR = 'D:\\test_motion'
OUTPUT_DIR = 'D:\\test_png'

def color_distance(pixel1, pixel2):
    return np.sqrt(np.sum((pixel1[:3] - pixel2[:3])**2))

def remove_blur(image, color_threshold=30, alpha_threshold=50, window_size=3):
    """
    画像全体のぼやけを除去し、処理された画像を返します。
    薄いぼやけた部分も効果的に処理します。

    :param image: PIL.Image オブジェクト (RGBA モード)
    :param color_threshold: ぼやけとみなす色の差の閾値
    :param alpha_threshold: 透明度の閾値
    :param window_size: 比較する近傍のサイズ
    :return: 処理済みの PIL.Image オブジェクト
    """
    # NumPy配列に変換
    img_array = np.array(image)
    height, width, _ = img_array.shape
    
    # パディングを追加
    pad = window_size // 2
    padded_image = np.pad(img_array, ((pad, pad), (pad, pad), (0, 0)), mode='edge')
    
    # 結果を格納する配列
    result = np.copy(img_array)
    
    for i in range(height):
        for j in range(width):
            neighborhood = padded_image[i:i+window_size, j:j+window_size]
            center = neighborhood[pad, pad]
            
            # 中心ピクセルと近傍ピクセルの最大色差を計算
            max_diff = 0
            for pixel in neighborhood.reshape(-1, 4):
                if not np.array_equal(pixel, center):
                    diff = color_distance(center, pixel)
                    max_diff = max(max_diff, diff)
            
            # 改良された判定基準
            if center[3] > 0:  # 完全に透明でない場合のみ処理
                if max_diff > color_threshold:
                    # 色の差が大きい場合
                    alpha_factor = min(1.0, max_diff / (2 * color_threshold))
                    new_alpha = int(center[3] * (1 - alpha_factor))
                    result[i, j] = [*center[:3], new_alpha]
                elif center[3] < alpha_threshold:
                    # 薄いぼやけの場合
                    result[i, j] = [0, 0, 0, 0]  # 完全に透明にする
    
    # 処理された画像を PIL.Image オブジェクトとして返す
    return Image.fromarray(result)

api = webuiapi.WebUIApi(host='127.0.0.1', port=7860)

def make_walking_girl(input_motion_dir, output_dir):

    # ControlNetUnit の設定
    def create_control_unit(image_path):
        motion_image = Image.open(image_path)
        return webuiapi.ControlNetUnit(
            image=motion_image,
            module='dw_openpose_full',
            model='control_v11p_sd15_openpose_fp16 [73c2b67d]',
            weight=1.75,
            control_mode=2,
            resize_mode='Crop and Resize',
        )

    # ADetailer の設定
    ads = [
        webuiapi.ADetailer(
            ad_model='face_yolov8n.pt',
            ad_controlnet_model='control_v11p_sd15_inpaint_fp16 [be8bc0ed]',
            ad_controlnet_module='inpaint_global_harmonious',
            ad_mask_k_largest=1,
        ),
        webuiapi.ADetailer(
            ad_model='hand_yolov8n.pt',
            ad_controlnet_model='control_v11p_sd15_inpaint_fp16 [be8bc0ed]',
            ad_controlnet_module='inpaint_global_harmonious',
            ad_mask_k_largest=2,
        ),
        webuiapi.ADetailer(
            ad_model='person_yolov8n-seg.pt',
            ad_controlnet_model='control_v11p_sd15_inpaint_fp16 [be8bc0ed]',
            ad_controlnet_module='inpaint_global_harmonious',
            ad_mask_k_largest=1,
            ad_confidence=0.8
        )
    ]

    # PNG ファイルを処理
    png_files = sorted(glob.glob(os.path.join(input_motion_dir, '*.png')))

    for png_file in png_files:
        print('Start ' + png_file.split(os.sep)[-1], flush=True)
        control_unit0 = create_control_unit(png_file)
        
        print('Generating...', end='', flush=True)
        result = api.txt2img(
            sampler_name='DDIM',
            steps=40,
            prompt=PROMPT,
            negative_prompt=NEGATIVE_PROMPT,
            width=1024, height=1024,
            seed=SEED,
            controlnet_units=[control_unit0],
            adetailer=ads,
            animatediff=webuiapi.AnimateDiff(enable=False),
            script_name='ABG Remover',
            script_args=['True','False'],
        )
        print('Done', flush=True)
        
        # ぼかしを除去
        print('Removing blur...', end='', flush=True)
        result_image = remove_blur(result.image, color_threshold=30, alpha_threshold=80)
        print('Done', flush=True)

        # 出力ファイル名を入力ファイル名と同じにする
        output_filename = os.path.basename(png_file)
        output_path = os.path.join(output_dir, output_filename)
        
        result_image.save(output_path)
        print(f"Processed and saved: {output_path}")

    print("All images processed successfully.")

def remove_blur_from_dir(target_dir):
    png_files = sorted(glob.glob(os.path.join(target_dir, '*.png')))

    for png_file in png_files:
        print('Start ' + png_file.split(os.sep)[-1], flush=True)
        img = Image.open(png_file).convert('RGBA')

        print('Removing blur...', end='', flush=True)
        result_image = remove_blur(img, color_threshold=30, alpha_threshold=80)
        print('Done', flush=True)

        # 出力ファイル名を入力ファイル名と同じにする
        output_filename = os.path.basename(png_file)
        output_path = os.path.join(target_dir, output_filename)
        
        result_image.save(output_path)
    
    print("All images processed successfully.")

if __name__ == "__main__":
    make_walking_girl(CONTROLNET_MOTION_DIR, OUTPUT_DIR)

適当なファイル名で、拡張子を .py にして、Stable Diffusion webui をインストールしたディレクトリに上記のソースコードを配置します。ここでは walking_test.py にしました。
PROMPT、NEGATIVE_PROMPT、SEED、CONTROLNET_MOTION_DIR、OUTPUT_DIR を、自分の作成した画像に合わせて変更してください。

さあ、大量につくりますよっと。
コマンドプロンプトで以下を実行します。

cd stable-diffusion-webui
venv\Scripts\activate
date /T
time /T
python walking_test.py

おー。なんか、勝手に、Stable Diffusion webui を起動したコマンドプロンプトが勝手に動き始めます。

Stable Diffusion が勝手に動きますよ

タスクマネージャとかで GPU をモニターすると、もりもり動いています。

GPU がうごいております

さあ、プログラムが終了しました。
今回は 10 枚だけなので、30 分くらいで終わりました。

プログラムの終了

一部の画像の修正

モーションとの比較

さあ、できた画像と、元のモーションの画像を見比べてみましょう。

元のモーション画像
生成された画像

うーん、なるほど。

  • 3 つめの画像が、余計な腕がある

  • 4 つめと5つ目の画像の、足が左右逆

  • 6 つめの画像にいらない画像が残っている

腕の除去、なんか持ってるものを除去

3 つめから 5 つめは、Stable Diffusion webui で、直接直しましょう。
前述の ControlNet で OpenPose Editor を使って修正してください。
3 つめの腕が余計にあるとかは、お尻の位置を近づけて、体に隠れている手を少し表に出します。

お尻をくっつけて、隠れてる手を表に出します
なんかちがう・・・

なんか持ってる・・・ブーツは赤いし。
Negative Prompt に
(handing_things:2),(handing_stick:2),(handing_black_things:2),
を追加して、Generate。

んー・・

んー。。。髪が赤すぎるけど、まあいいや。。。プロンプトで直せると思うけど、今回は動きが焦点なので。直したい人はプロンプトで直してね。
別のディレクトリに一旦保存しておきます。

足が逆

4 つめ、5つめの足が逆なのは、足の線を調整。
OpenPose Editor で修正します。

4つめのモーション。隠れている手がない

お・・・4 つめは、手が隠れてて、モーションの中にない。
というか、これ、隠れてる手が、反対の手と重なってるんですよ。
見えてる側の腕と手を一度非表示にして、重なっている部分をいい感じの位置に移動して、消えてる腕を表示させて手とくっつけます。
このとき、どうしても 3 本目の腕が出現するんで、なんでだとおもったら、OpenPose の中で、いくつかの腕と指が消えてました。
これも復旧させます。

3本目の腕が出ないようにし、何も持たないようにする
修正後

微妙に、左右の足がどっちなのかわかんないけど、わかんないならいいや。
これも修正した別のディレクトリに保存。

5 つめは、普通にお尻の移動をしてあっさり修正できました。
これも上のディレクトリに保存。

修正した画像

ここまでに、別のディレクトリに修正した 3 つの画像があります。でもこのままだと、Python で除去したノイズが残っているんですね。なので、Python でこれらの画像からノイズを除去します。

python
from walking_test import remove_blur_from_dir
remove_blur_from_dir('D:\\test_png2')
exit()

はい、ノイズが消えました。これを元のディレクトリに上書きします。

ノイズが消えました

6 つめは、gimp とかの画像編集ソフトでいらない部分を消すだけ。
語るほどでもないです。
さあ、改めて比較してみましょう。

元のモーション画像
修正後

やっぱ 3 枚目が、髪が赤すぎるよね・・・
gimp で、赤を弱くします。

gimp で赤を弱くする
gimp で赤を弱くしてみる

んーーーーなんか色がちょっと違うけど、まあいいや。

最終的な感じ

まあ、いいんじゃないかなー


Clipchamp で使う背景に透過する動画の生成

ここまできたら、あとは ffmpeg で映像にするだけです。
でもそれってどうやるのー?
はい、以下のコマンドプロンプトのバッチファイルを作成してディレクトリ内において実行しましょう。

@echo off
chcp 65001 > nul
setlocal enabledelayedexpansion

:: Default values
set "output_file=output.mp4"
set "file_list=temp_file_list.txt"
set "video_duration=10"
set "file_pattern=*.png"
set "bg_r=00"
set "bg_g=FF"
set "bg_b=00"

echo File pattern: %file_pattern%
echo Output file: %output_file%
echo Video duration: %video_duration% seconds
echo Background color: #%rgb_r%%rgb_g%%rgb_b%

:: Count matching files and calculate framerate
set file_count=0
for %%F in (%file_pattern%) do set /a file_count+=1
set /a framerate=file_count/video_duration
if %framerate% lss 1 set framerate=1

echo Number of matching files: %file_count%
echo Calculated framerate: %framerate%

:: Create a new file list with matching files
if exist "%file_list%" del "%file_list%"
for %%F in (%file_pattern%) do (
    echo file '%%~fF'>>"%file_list%"
)

:: Use FFmpeg to create video from the file list with specified background color, preserving transparency
ffmpeg -y -f concat -safe 0 -r %framerate% -i "%file_list%" ^
-filter_complex "[0:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:color=#00000000,format=rgba[scaled];color=c=0x%bg_r%%bg_g%%bg_b%:s=1920x1080[bg];[bg][scaled]overlay=format=auto,format=yuv420p[v]" ^
-map "[v]" ^
-c:v libx264 ^
-preset ultrafast ^
-crf 23 ^
-t %video_duration% ^
"%output_file%"

echo Video creation complete. Output file: %output_file%
echo File list saved as: %file_list%

できまーしたー。3 コマ目が気になるけど、今はまあいいや。

Clipchamp で背景を透過させた動画の作成

さー、歩く女の子ができました!
Clipchamp を使って、背景動画に重ねて、女の子に旅をさせましょう。

Clipchamp で編集

速度

適度な速さに、速度を調整してください。4x にしてみました。

速度の調整

背景の透過

「効果」->「グリーンスクリーン」で、背景が消える!!!
これですよ!

背景が、透ける!!

できた!


終わりに

皆さんお疲れ様です。とても長い note でした。
Stable Diffusion 便利ですよね。最近はもー、いろいろ出てきてて、いつも勉強しなおしです。
それでもやはり、専業アニメーターにはまだ程遠いかな、っていつも感じますが、AI でいろんなスペシャリストに挑むのが僕なのです。
それに、一度作った MV の作業をたどって note に整理できたので、これはこれでよかったのかな。
このコンテンツが、皆さんの助けになっていれば、何よりの幸せです。
これからも、映像に限らず、AI でいろんなスペシャリストに挑んでいこうと思います。

最後にもう一度宣伝を。

まずは、この歩く女の子を入れた僕が作成した MV をどうぞ。
さすがに歌詞は書きましたよ。
ここまで読んだらさすがにチャンネル登録をお願いしますw




この記事が気に入ったらサポートをしてみませんか?