「今日は何の日API」ただいまv2が公開中です。
Twitterでデモ用のbotアカウントも作っていて、毎日つぶやいています。
新しい使い方も模索&実験中ですが、いまいちぱっとしません。Twitterで他のアカウントを見ていると、イラストや写真などと一緒に「今日は何の日」を投稿していて、とても楽しそうです。私に絵心でもあれば…。
と、ここで目に止まったのが、話題のお絵描きAI「Stable Diffusion」。
こいつに描いてもらえばいいのです。
- 「今日は何の日API」から「○○の日」を取得
- 「○○の日」をお題にAIが画像生成
- Twitterに投稿
この辺を1日1回まとめて実行する方法を探してみたのですが、すぐ頓挫しました。2022年10月現在、Google Colaboratoryも含めて、無料でGPU環境をスケジュール実行するサービスはありません。
そこで方針を変えました。
- 一年分の記念日画像をあらかじめAIに描いてもらう
- 画像をAPIのURLに組み込んで呼び出す
これなら何とかできそうです。
お絵描きAIに一年分の記念日画像を描かせる
さっそくStable Diffusionの使用環境を整えます。こちらの記事を参考にさせていただきました。
- Hugging Faceアカウント登録
- Hugging Faceでの利用規約同意
- Hugging Faceを利用するトークン取得
そして機械学習ライブラリdiffusersをインストールします。
!pip install diffusers==0.2.4 transformers scipy ftfy
そして閏日も含めた366日分の記念日をリストでえんえん読み込ませました。「今日は何の日API(記念日API)」で"anniv1"のレスポンスに当たる部分です。1
最後に366日分のpng画像を、サーバにアップします。
アップした画像を呼び出す
画像URL
https://wazka.jp/v2/anniv1_img/
こちらにmmdd形式のファイル名でpng画像を格納しました
例えば2月14日「バレンタインデー」の画像なら0214.pngですから、
こちらに格納されています。
Twitterで「今日は何の日」をAPIとともに画像付き投稿する場合は以下のようになります。
import json
import datetime
import tweepy
import requests
from io import BytesIO
def get_api():
consumer_key = "xxxコンシューマーキーxxx"
consumer_secret = "xxxコンシューマーシークレットxxx"
access_token = "xxxアクセストークンxxx"
access_token_secret = "xxxアクセスシークレットxxx"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth, wait_on_rate_limit = True)
return api
def anniv(api):
today = datetime.date.today()
mmdd = today.strftime('%m%d')
mmdd_h = today.strftime('%m月%d日')
url = "https://wazka.jp/v2/anniv/" + mmdd
r = requests.get(url).json()
#ツイート本文作成
contents = ["【AIが描く今日の一枚】"]
contents.append(mmdd_h)
contents.append(r['_items'][0]["anniv1"])
contents.append("")
contents.append("#stablediffusion #今日は何の日")
tweet = '\n'.join(contents)
#アップロード画像を取得してUP
fname = mmdd + ".png"
imgurl = "https://wazka.jp/v2/anniv1_img/" + fname
img = requests.get(imgurl).content
result_img = api.media_upload(filename=fname, file=BytesIO(img))
#画像付きツイート
api.update_status(status=tweet, media_ids=[result_img.media_id])
if __name__ == '__main__':
api = get_api()
anniv(api)
実行結果がこちら。
この日はわりとお題に忠実な画像が生成されましたが、日によって「ギリギリセーフ」「ギリギリアウト」「何を表現したいのかわかるけどアウト」「明らかにアウト」などの判定が楽しいです。あまりにも意味不明な画像は、差し替えたりもしてますが…。
これからも、面白い…もとい役立つ機能や活用法を考えていこうと思います。
-
記念日APIは"anniv1"〜"anniv5"まで、1日最大5つの記念日をレスポンスします。でも記念日がない場合は""空文字を返します。ただし、"anniv1"には、何かしら必ず記念日を入れるようにしています。 ↩