Stable Diffusion Web UIで画像をDiscordに送信するCustom Scriptsを自作してみた

AUTOMATIC1111/stable-diffusion-webui はCustom Scriptsを作る機能がありますが情報が全くないので参考になりそうなことメモしておきます

実際に作ったもの

生成した画像をDiscordにWebhookで送信するものを作りました
コードはGithubから確認出来ます

Add custom script and more. Contribute to fa0311/stable-diffusion-webui-patched …
github.com

環境

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_img2imgmodules.sharedと組みあわせて使うっぽい

run

画像を生成するときに呼び出されます
生成するにはprocess_imagesを実行します
process_imagesは同期関数なので生成が終わるまで処理がストップします

第2引数のStableDiffusionProcessingです
StableDiffusionProcessingの中身はここから確認できます

runProcessedを返さなければならなくて基本的にはprocess_imagesの返り値を使います
scripts/custom_codeのようにprocess_imagesを実行させずに返り値を使わない方法もあるっぽいです
逆に複数回実行しても良くてその時は返り値のどれか1つだけ返せば良いです

Processedの中身はここから確認できます

ui-config.json

UIで指定した要素が必ず表示されるとは限らなくてui-config.jsonで指定した値で上書きされる
されたくない場合はgradioの返り値のdo_not_save_to_configTrueにする

その他

公式の解説

Stable Diffusion web UI. Contribute to AUTOMATIC1111/stable-diffusion-webui deve…
github.com

他の人が作ったCustom Scriptsが確認できるので参考になる

Stable Diffusion web UI. Contribute to AUTOMATIC1111/stable-diffusion-webui deve…
github.com