1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

「今日は何の日」をAIに描かせてみた

1
Last updated at Posted at 2022-10-01

「今日は何の日API」ただいまv2が公開中です。

Twitterでデモ用のbotアカウントも作っていて、毎日つぶやいています。

新しい使い方も模索&実験中ですが、いまいちぱっとしません。Twitterで他のアカウントを見ていると、イラストや写真などと一緒に「今日は何の日」を投稿していて、とても楽しそうです。私に絵心でもあれば…。
と、ここで目に止まったのが、話題のお絵描きAI「Stable Diffusion」。

こいつに描いてもらえばいいのです。

  1. 「今日は何の日API」から「○○の日」を取得
  2. 「○○の日」をお題にAIが画像生成
  3. Twitterに投稿

この辺を1日1回まとめて実行する方法を探してみたのですが、すぐ頓挫しました。2022年10月現在、Google Colaboratoryも含めて、無料でGPU環境をスケジュール実行するサービスはありません。
そこで方針を変えました。

  1. 一年分の記念日画像をあらかじめAIに描いてもらう
  2. 画像を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)


実行結果がこちら。

この日はわりとお題に忠実な画像が生成されましたが、日によって「ギリギリセーフ」「ギリギリアウト」「何を表現したいのかわかるけどアウト」「明らかにアウト」などの判定が楽しいです。あまりにも意味不明な画像は、差し替えたりもしてますが…。
これからも、面白い…もとい役立つ機能や活用法を考えていこうと思います。

  1. 記念日APIは"anniv1"〜"anniv5"まで、1日最大5つの記念日をレスポンスします。でも記念日がない場合は""空文字を返します。ただし、"anniv1"には、何かしら必ず記念日を入れるようにしています。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?