概要
定期的に16:9画像を生成してデスクトップ壁紙にするPythonスクリプトを書いてみた。
天気や時間を取得してプロンプトに含めてみた。
半日ほど動かしてみた結果
時間や天気が反映されているのがわかる(この日は曇りときどき雨だった)
環境の準備
Python
stable-diffusion-webuiの要件をみて、必要なバージョンを確認する。
(2023-09-10時点では3.10.6でした。)
インストール時に、環境変数PATHを登録するようにでますが、別のバージョンのPythonを使っている人はここでPATHしなくもいいです。
よくわからない人は、PATH登録しておきましょう。
この記事で使うモジュール
- pip
- schedule
- requests
stable-diffusion-webui
ダウンロード
こちらからZipをダウンロード or gitでクローンする
or
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
インストール
Zipを展開 or Gitをクローンしてできた stable-diffusion-webui
フォルダの中の、webui-user.bat
を起動すると、初回起動時に自動で必要なライブラリなどがインストールされます。
さっきPATH環境変数を登録しなかった人は、起動前にwebui-user.bat
の中身のset PYTHON=
の後に、該当のPython.exeの絶対パスを記入して保存してください。
しなくても動きますが、たまに良く稀にバグります。
よくある不具合
no module named 'tqdm.auto'
と表示された場合は、手動でtqdmをインストールする必要があります。
webuiは、venvを使った仮想環境で動いているので、仮想環境を立ち上げてインストール作業をしていきます。
cd stable-diffusion-webui/venv/Scripts
call activate.bat
: ここで表記が (venv) に変わる
python -m pip install tqdm
OpenWeatherMapのアカウント作成
無料アカウント登録
メール認証後に届くメールにAPI Keyが書いてあるので、見返せるようにしておいてください。
無料の範囲はこの通り
Current Weather
で、現在の天気情報が取得できます。
Geocoding API
で、地名から経緯度を取得して使います。
ご家庭にある普通のゲーミングPC
よく家の隅に転がっていますよね。
これで実質0円です。
目安: RTX2060 with maxQ の環境で、1280×720画像が1〜3分で1枚生成できます。
開発
stable-diffusion-webuiをAPIモードで立ち上げる
stable-diffusion-webui\webui-user.bat を編集用に開き、COMMANDLINE_ARGSを設定します
: ~~~
set COMMANDLINE_ARGS=--xformers --no-half-vae --no-download-sd-model --skip-version-check --listen --nowebui
: ~~~
--no-half-vae
エラーが少なくなり、生成速度が少し上がります
--xformers
NVIDIA製GPU専用。生成速度が上がります
--no-download-sd-model
標準のSD-Model(Checkpoint)をダウンロードしません
civit.ai などからCheckpointを手動でダウンロードしましょう
ダウンロード先は stable-diffusion-webui\models\stable-diffusion
--skip-version-check
バージョンチェックをスルーします
立ち上げ速度向上
--listen --nowebui
これをつけないとAPIが使えないです
ブラウザからアクセスしてみる
さっき編集したwebui-user.bat
を実行します
この表示が出たらAPIサーバの立ち上げ完了
INFO: Started server process [3896]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:7861 (Press CTRL+C to quit)
ブラウザからドキュメントを閲覧できます
http://localhost:7861/docs
GETリクエストはブラウザからも閲覧可能
http://localhost:7861/sdapi/v1/sd-models
pythonからアクセスしてみる
requestsモジュールを使ってアクセスしてみます
req = requests.get('http://localhost:7861/sdapi/v1/sd-models', headers={'Content-Type': 'application/json'})
res_json = req.json()
headersで、jsonが返ってくることを明示します。
画像生成 → 画像取得
text2imageで画像生成するときのエンドポイントはこちら
http://localhost:7861/sdapi/v1/txt2img
※POSTリクエストなので、ブラウザからはアクセスできません
画像をを生成する最小構成はこんな感じ
data = { ..ここにデータを書いていく.. }
req = request.Request('http://localhost:7861/sdapi/v1/txt2img', json.dumps(data).encode(), {'Content-Type': 'application/json'})
res = request.urlopen(req)
body = json.loads(res.read())
前後しますが、dataの最小構成はこんな感じ
data = {
"prompt": "プロンプト",
"negative_prompt": "ネガティブ プロンプト",
"sampler_name": "Eular a", # サンプラー
"batch_size": 1, # 生成する数
"steps": 20, # 生成に要するステップ数
"cfg_scale": 7, # プロンプトの適用度合い
"width": 512, # 生成する画像のサイズ
"height": 512,
"eta": 0,
"refiner_checkpoint": "SD-Model",
"send_images": True, # レスポンスに含めるかどうか
"save_images": True, # 保存するかどうか
}
save_images: Trueの場合の保存先は、stable-diffusion-webui\outputs\txt2img-images\{今日の日付}\
Windowsの壁紙を更新する
scheduleモジュールで定期的に動かす
ここまでで、一旦、定期的に画像生成して壁紙が更新されるプログラムは完成です。
時間を取得してプロンプトに追加する
天気を取得してプロンプトに追加する(OpenWeatherMap)
Additional
Loraを使う
SD-Modelをランダムにする
モデルによってサンプラーとステップ数を変える
プロンプトをランダムにする
時間を数字から言葉に変換する
気温/風速も数字から言葉に変換する
Future
アップスケーラーを使う
複数枚生成して自動で評価する
複数PCで共有する
コンスタンスなコンテンツとして配信して収益化する(笑)
まとめ
何を生成するか分からないAI生成画像をPCの壁紙になんてしないほうがいい
プロンプトは90%くらいしか信用できない。