AUTOMATIC1111/stable-diffusion-webui はCustom Scriptsを作る機能がありますが情報が全くないので参考になりそうなことメモしておきます
実際に作ったもの
生成した画像をDiscordにWebhookで送信するものを作りました
コードはGithubから確認出来ます
環境
2022年10月17日時点での最新(e644b5a80beb54b6df4caa63fb19d889dd4ceff6)を使って説明
そもそもCustom Scriptsとは
作り始める時はWordpressのプラグインなどのようにイベントにフックするのかも思ってましたが全然違いました
1回の生成に1つのCustom Scriptsしか実行出来ないし自由度もそこまで高くないようです
解説
とりあえず最小限のサンプル
import modules.scripts as scripts
import gradio as gr
from modules.processing import process_images
class Script(scripts.Script):
def title(self):
return "Custom scripts sample"
def ui(self, is_img2img):
text = gr.Textbox(label="Text Box", lines=1)
return [text]
def show(self, is_img2img):
return True
def run(self, p, text):
proc = process_images(p)
print(p.prompt)
return proc
Scriptsの中身はここから確認できます
title
タイトルを返します
ui
UIはGradioの components で構成します
配列にして返すとrunの引数から中身が受け取れます サンプルの例ではtextを返しているのでrunの第3引数にtextの中身が与えられています
show
メニューに表示するかどうかをboolean
で返します
引数のis_img2img
やmodules.shared
と組みあわせて使うっぽい
run
画像を生成するときに呼び出されます
生成するにはprocess_images
を実行しますprocess_images
は同期関数なので生成が終わるまで処理がストップします
第2引数のStableDiffusionProcessing
ですStableDiffusionProcessing
の中身はここから確認できます
run
はProcessed
を返さなければならなくて基本的にはprocess_images
の返り値を使います
scripts/custom_codeのようにprocess_images
を実行させずに返り値を使わない方法もあるっぽいです
逆に複数回実行しても良くてその時は返り値のどれか1つだけ返せば良いです
Processed
の中身はここから確認できます
ui-config.json
UIで指定した要素が必ず表示されるとは限らなくてui-config.json
で指定した値で上書きされる
されたくない場合はgradioの返り値のdo_not_save_to_config
をTrue
にする
その他
公式の解説
他の人が作ったCustom Scriptsが確認できるので参考になる