【副業実験記#5】Stable Diffusion web UIのAPIでテキストから画像を生成してみた話

子育てSEパパのIT×AI×副業ラボ_副業実験記_5 副業実験記

つづき。


はじめに

引き続き、雑学動画自動生成ツールを自作できないか、検討してみているお話です。

今回は、テキストから画像を生成できるという「Stable Diffusion web UI」について、雑学動画自動生成ツールで使えるか検証してみた話です。

検証準備

Pythonのインストール

「Python」で雑学動画自動生成ツールを作るつもりなので、検証でも同様に使います。

詳細は以下の記事にまとめていますので、ご興味ある方は、そちらをご覧ください。

PyCharmのインストール

Pythonでの開発を楽にしてくれる統合開発環境「PyCharm」を使います。

Pythonで雑学動画自動生成ツールを作る際に使うつもりなので、検証でも同様に使います。

詳細は以下の記事にまとめていますので、ご興味ある方は、そちらをご覧ください。

検証用Pythonプロジェクトおよびvenvの作成

検証用「Pythonプロジェクト」を作成します。

PyCharmで簡単に作成できます。

Pythonプロジェクトを作成したら、その中で「venv」(Python仮想環境)を作成しておきます。

詳細は以下の記事にまとめていますので、ご興味ある方は、そちらをご覧ください。

Requestsのインストール

Requests」は、WebサイトやAPIと通信するためのHTTPリクエストをPythonで簡単に使えるようにしてくれるライブラリです。

このライブラリを使用し、APIを実行します。

検証用Pythonプロジェクトでvenvを起動し、「Requests」のパッケージをインストールします。

ターミナルでコマンド実行してインストールする方法やPyCharm上で画面を操作してインストールする方法がありますが、今回は、PyCharm上で画面を操作し、venvに「Requests」パッケージをインストールします。

詳細は以下の記事にまとめていますので、ご興味ある方は、そちらをご覧ください。

Stable Diffusion web UIのインストール

Stable Diffusion web UI」を手元のWindowsパソコンにインストールして使用する方法はいくつかあるようですが、今回はPythonとGitを使用する方法を選びます。

「Stable Diffusion web UI」をダウンロード(インストール)および使用するまでの流れは以下の通りです。

(英語ですが、公式ドキュメントにも書いてあります

  1. Python(バージョン:3.10.6)をインストールする
  2. Gitをインストールする
  3. GitHubから「Stable Diffusion web UI」をダウンロード(インストール)する
  4. 「Stable Diffusion web UI」の中にある「webui-user.bat」を実行する
    ※一般ユーザーで実行する

GitHubから「Stable Diffusion web UI」をダウンロード(インストール)する場合、任意のフォルダに移動して以下のコマンドを実行すれば良いです。

git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git

詳細は以下の記事にまとめていますので、ご興味ある方は、そちらをご覧ください。

検証してみた

Stable Diffusion web UIのAPIモードを設定

Stable Diffusion web UIのAPIを利用したい場合、初期状態では利用できないようになっているので、設定が必要です。

設定はとても簡単で、起動バッチ(webui-user.bat)の中で環境変数(COMMANDLINE_ARGS)にAPIを使うための値(–api)を設定するだけです。

今回は、「–api」の他に「–api-server-stop」を設定します。

「–api-server-stop」は、API経由で「Stable Diffusion web UI」を停止/再起動/終了させられるようにする設定値です。

他にもAPI関連の値としては「–api-auth」や「–api-log」がありますが、詳細については、公式ドキュメントをご確認ください。

例)

・「webui-user.bat」設定“前(初期状態)”

@echo off

set PYTHON=
set GIT=
set VENV_DIR=
set COMMANDLINE_ARGS=

call webui.bat

・「webui-user.bat」設定“後(例)”

@echo off

set PYTHON=
set GIT=
set VENV_DIR=
set COMMANDLINE_ARGS=--api --api-server-stop

call webui.bat

他にも「Stable Diffusion web UI」の画像生成時に使う「モデル」を任意に追加することもできますが、今回は初期状態で存在しているモデルを使用します。

「Stable Diffusion web UI」のAPIモード設定方法については、以下の記事にまとめていますので、ご興味ある方は、そちらもご覧ください。

Stable Diffusion web UIの起動

「Stable Diffusion web UI」では、指定のPythonのバージョン(3.10.6)を使うため、手元パソコンの他Pythonと共存できるように、Python標準搭載の仮想環境(venv)を使って起動します。

「Stable Diffusion web UI」のフォルダ内に仮想環境(venv)を作成

まず、ターミナル(PowerShell)を起動して、以下のように、「Stable Diffusion web UI」のフォルダ内で「venv」を作成します。
(自分が「Stable Diffusion web UI」をダウンロードしたフォルダは「D:\stable-diffusion-webui」です)

例)

・「Stable Diffusion web UI」フォルダ内で「venv」仮想環境を作成する例

PS C:\Users\sepapa> cd D:\stable-diffusion-webui

PS D:\stable-diffusion-webui> python -m venv .venv

※PowerShellではなく、コマンドプロンプトで実行する場合は、以下のように読み替えてください。

C:\Users\sepapa> D:

cd D:\stable-diffusion-webui

D:\stable-diffusion-webui> python -m venv .venv

仮想環境(venv)で起動バッチを実行

次に、以下のように、作成した「venv」仮想環境を有効にして、「webui-user.bat」を実行します。

例)

・「venv」仮想環境を有効にする例

PS D:\stable-diffusion-webui> .venv/Scripts/Activate.ps1

PS D:\stable-diffusion-webui> .\webui-user.bat

※PowerShellではなく、コマンドプロンプトで実行する場合は、以下のように読み替えてください。

D:\stable-diffusion-webui> .venv\Scripts\activate.bat

D:\stable-diffusion-webui> webui-user.bat

・結果

ターミナルが自動で起動し、以下のようなメッセージが表示され、「Stable Diffusion web UI」が起動します。

venv "D:\stable-diffusion-webui\venv\Scripts\Python.exe"

~ 省略 ~

Launching Web UI with arguments: --api --api-server-stop

~ 省略 ~

Running on local URL:  http://127.0.0.1:7860

~ 省略 ~

メッセージに「Running on local URL: http://127.0.0.1:7860」とあるように、API実行時の接続先は、IPアドレスが「127.0.0.1」ポート番号が「7860」になります。

「Stable Diffusion web UI」の起動方法については、以下の記事にまとめていますので、ご興味ある方は、そちらもご覧ください。

Stable Diffusion web UI APIを使用したテキスト画像変換の流れ

「Stable Diffusion web UI」起動時に表示されたIPアドレスとポート番号に対して、生成したい画像に関するテキストを含めてHTTPリクエストを送信すれば、それによって生成された画像が含まれたHTTPレスポンスが返ってきます。

APIの公式ドキュメントが出ているので、そちらを確認しながら検証していくと良いですね。

調べてみると、テキストを画像に変換する場合、単にAPI「/sdapi/v1/txt2img」経由で画像生成をリクエストするだけで良く、とても簡単でした。

Stable Diffusion web UI APIを使用したテキスト画像変換の試し

今回はシンプルにテキストから画像を生成してみます。

「/sdapi/v1/txt2img」を使う

では実際に、「/sdapi/v1/txt2img」を使って、テキストから画像を生成してみます。

以下は、公式ドキュメントに記載のあるPythonサンプルコードですが、そのまま流用して検証します。

「/sdapi/v1/txt2img」を使ったPythonサンプルコード
import requests
import base64

# Define the URL and the payload to send.
url = "http://127.0.0.1:7860"

payload = {
    "prompt": "puppy dog",
    "steps": 5
}

# Send said payload to said URL through the API.
response = requests.post(url=f'{url}/sdapi/v1/txt2img', json=payload)
r = response.json()

# Decode and save the image.
with open("output.png", 'wb') as f:
    f.write(base64.b64decode(r['images'][0]))

この中の「payload = { ~ }」の部分で、生成したい画像の情報を指定するようです。
HTTPリクエストボディに含められて送られます。

「prompt」に設定している値が、生成したい画像の指示テキスト(プロンプト)になります。

ちなみに「steps」は、画像を変換する段階(ステップ)数らしく、値が小さいほど画像が粗く不明瞭になり、大きいほど画像の精度が高くなるようです(代わりに時間がかかる)。

サンプルコード内「payload = { ~ }」の部分で指定できる設定項目と既定値
{
  "prompt": "",
  "negative_prompt": "",
  "styles": [
    "string"
  ],
  "seed": -1,
  "subseed": -1,
  "subseed_strength": 0,
  "seed_resize_from_h": -1,
  "seed_resize_from_w": -1,
  "sampler_name": "string",
  "scheduler": "string",
  "batch_size": 1,
  "n_iter": 1,
  "steps": 50,
  "cfg_scale": 7,
  "width": 512,
  "height": 512,
  "restore_faces": true,
  "tiling": true,
  "do_not_save_samples": false,
  "do_not_save_grid": false,
  "eta": 0,
  "denoising_strength": 0,
  "s_min_uncond": 0,
  "s_churn": 0,
  "s_tmax": 0,
  "s_tmin": 0,
  "s_noise": 0,
  "override_settings": {},
  "override_settings_restore_afterwards": true,
  "refiner_checkpoint": "string",
  "refiner_switch_at": 0,
  "disable_extra_networks": false,
  "firstpass_image": "string",
  "comments": {},
  "enable_hr": false,
  "firstphase_width": 0,
  "firstphase_height": 0,
  "hr_scale": 2,
  "hr_upscaler": "string",
  "hr_second_pass_steps": 0,
  "hr_resize_x": 0,
  "hr_resize_y": 0,
  "hr_checkpoint_name": "string",
  "hr_sampler_name": "string",
  "hr_scheduler": "string",
  "hr_prompt": "",
  "hr_negative_prompt": "",
  "force_task_id": "string",
  "sampler_index": "Euler",
  "script_name": "string",
  "script_args": [],
  "send_images": true,
  "save_images": false,
  "alwayson_scripts": {},
  "infotext": "string"
}

「Stable Diffusion web UI」を起動中に参照できる内部ドキュメントを参照(http://127.0.0.1:7860/docs#/default/text2imgapi_sdapi_v1_txt2img_post)

各項目値の詳細は、内部ドキュメントを参照して確認することになりますね。

サンプルコードで生成された画像

基本的な機能だけで十分に、雑学動画自動生成ツールで使えると感じました。

おわりに

「Stable Diffusion web UI」ですが、確かにテキストから画像を生成できることが分かりました。

APIの使い方も、とてもシンプルで扱いやすそうです。

これで、テキストから画像を生成するツールは「Stable Diffusion web UI」を使えば良いことが分かったので、次の技術やツールの検証に移ろうと思います。


今回の記事も、同じように副業に悩んでいる人、手探りで取り組んでいる人にとって、何かの参考になれば嬉しいです。

これからも記録を続けていく予定なので、よければフォローしてもらえると嬉しいです。


つづき。

タイトルとURLをコピーしました