見出し画像

Silly tavern用のキャラクター画像作成の手順:覚え書きのようなもの

Silly tavern用のキャラクター画像を作ってみたくなり、その手順などの覚え書きになります。
おそらく、こういった事について、自動で作成するようなプログラムとか作ってる人はいると思われますが、そんなの調べてないため手間がかかるパターンで。
Forgeで使用できる拡張機能の透過画像を作れる「layerdiffusion」というのが最近でたので、少し試してみると案外うまくいかない画像も出てきて全てこれに任せるという感じではなさそうです。

Silly tavern用に必要な画像について

大まかに以下の4つぐらいかと思われます。
①画像サイズ:400x600がモデルカードのサイズ(アスペクト比が2:3)
②画像の特徴:人物のみの透過画像
③28種類の感情表現:服装や人物は一貫性が高めが良い
④ファイル名を感情表現のものにする必要がある

準備として必要と感じたもの

①Excelファイル:感情表現とimg_%3dの紐づけしたもの

②Excelファイル:感情表現のプロンプトが記載されたもの:個々で準備
③作成した画像をリネームするプログラム的なやつ

ということで、作成していくわけですが、最初に元画像を作成する必要がありますね。
プロンプトを深く考えたくない人は以下のも参考になるかと思います。

これは、なんか適当なバリエーションを作ってくれる拡張機能です。
プロンプトは以下

1girl, (chibi:1.2), (cowboy shot), (big breast), looking at viewer,
best quality, masterpiece

で入れて、バリエーションを適当に作って良いの選びました。
SDXLで作成したので、800x1200で。

こんな感じの出力になります

透過画像の作成

参照画像を透過にしておくと、その後の生成画像の背景も複雑ではないので、透過処理がしやすくなる気がします。
方法はなんでも良いかと思いますが、windowsだとペイントソフトに透過画像作成するボタンが出来ていますので、それを使用してみます。

ワンクリックでこんな感じになった

作成元となる画像を作成プロンプトには感情表現は入れない方が無難ですが、次の作業の際に消すのでも良いと思います。
今回は以下のプロンプトです。拡張機能で結構追加されています。

1girl, (chibi:1.2), (cowboy shot), (big breast), looking at viewer,
best quality, masterpiece, armor, boots, closed mouth, dual wielding, gloves, high heels, holding, holding sword, holding weapon, kneeling, long hair, pantyhose, parted lips, parted bangs, pouch, red cape, red eyes, red jacket, red skirt, skirt, solo, sword, weapon, yellow eyes

Txt2imgでバリエーションを作成する:感情表現の追加(28パターン)

<注意点>
①シード値は固定する。
②コントロールネットを使用する
「reference only」
③拡張機能の使用
「SAG(SelfAttentionGuidance Integrated)」を併用する
後者はプロンプトの反映がしやすくなるらしい(※Forgeにデフォルトでついている拡張機能)
これらで作成された画像は、若干元画像と異なるのですが、参照元を変えていない場合は、おおむね統一感のあるシリーズになると思われます。

プロンプトを書き換えて28パターン作成する

プロンプトの先頭に感情表現を追加するプロンプトを配置するのが最も楽な印象です。
私はGPTさんに依頼して作成してもらいましたが、後の結果を見ると分かりますが、結構失敗していました。

プロンプトの効果を一つずつ、画像を確認しながら作業するのも良いですが手間です。
「Prompts from file or textbox」のスクリプトを使うと、一行分のプロンプトをもともとのプロンプトの最初か最後に挿入した画像が出来るようで、それを使用すると放置している間に全てのパターンが作成出来るのでお勧めです。
以下、Excelで作成したものをコピペしてみた画像。

以下が出来上がった画像たちです。

作成したpngファイルをフォルダー内に入れて作業する

まずはimg_%3dの連番に変更します。
以下をpythonファイルにして、パスを追加してから、コマンドプロンプトで実行

import os

def rename_png_files(folder_path):
    # フォルダ内の全ファイルを取得
    files = os.listdir(folder_path)
    
    # PNGファイルのみをフィルタリングし、指定されたパターンに従ってソート
    png_files = sorted([file for file in files if file.endswith('.png') and '-' in file], key=lambda x: int(x.split('-')[0]))
    
    # 各PNGファイルの名前を変更
    for index, file in enumerate(png_files, start=1):
        # 新しいファイル名を生成
        new_file_name = f'img_{index:03d}.png'
        # 元のファイルパスと新しいファイルパスを生成
        original_file_path = os.path.join(folder_path, file)
        new_file_path = os.path.join(folder_path, new_file_name)
        
        # ファイル名を変更
        os.rename(original_file_path, new_file_path)
        print(f'Renaming "{original_file_path}" to "{new_file_path}"')

if __name__ == "__main__":
    rename_png_files(r'ファイル名のパス')

ファイル名を感情表現のものに変更する

以下の一番したのパスを直して、同じ様にパイソンファイルにしてコマンドプロンプトで実行する
以下のライブラリがない場合は先にコマンドプロンプトでインストールします。

pip install pandas

pip install openpyxl
import os
import pandas as pd

def rename_files_based_on_excel(folder_path, excel_path):
    # Excelファイルを読み込む
    df = pd.read_excel(excel_path)
    
    # フォルダ内の全ファイルを取得
    files = os.listdir(folder_path)
    
    # Excelファイルに基づいてファイル名を変更
    for index, row in df.iterrows():
        # 現在のファイル名と新しいファイル名を取得
        current_name = row['変更前'] + '.png'
        new_name = row['変更後'] + '.png'
        
        # 現在のファイル名がフォルダ内に存在する場合にのみ変更を実行
        if current_name in files:
            # 元のファイルパスと新しいファイルパスを生成
            original_file_path = os.path.join(folder_path, current_name)
            new_file_path = os.path.join(folder_path, new_name)
            
            # ファイル名を変更
            os.rename(original_file_path, new_file_path)
            print(f'Renamed "{current_name}" to "{new_name}"')

# 実際にファイル名を変更するには、以下の関数を実行してください(パスは適宜調整してください):
# rename_files_based_on_excel(r'pngファイルがあるフォルダパス', r'エクセルがあるフォルダパス')

<補足>Pythonファイルの実行
pngファイルがあるフォルダ内にPythonファイルを配置して、そのフォルダの上の所からコマンドプロンプトを立ち上げます。
作成したPythonファイル名が、name.pyだとすると、以下の様に、入力すれば良いはず

py name.py

これは名前が修正出来たやつですね。
このpythonスクリプトについては、batファイルを作成しておけば運用が楽になると思います。

作成したpngファイルを透過画像に変換した後、zipに圧縮して完成!!

一括で出来る方法もあると思いますが、先ほどのペイントソフトで書き換えるのも良いと思います。

背景透過をしていないと以下のようになります。

透過で修正するとこんな感じになります

なんだか思ったより手間が個人的にかかりましたが、フローが出来ればそれほど問題なくいけるかと思います。
また、画像がぼけたやつは、追加したプロンプトに問題があったようです。
パイソンコードはGPTさんに書いてもらったやつなので、使用されてエラーを吐いたらGPTさんに聞くと解決策を教えてくれるでしょう。

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