【9日目】discord botでAtCoderの通知を行う。【pythonで音楽系人工知能を作るまでの日記】

プログラミング

2023年2月18日

近況

 最近はStable diffusionというオープンソースの拡散モデルを使った画像生成AIを自分のパソコンに入れて、自分好みの画像を生成するのに夢中になってる。
 Kaggleの「Stable diffusion – Image to Prompts」という画像から呪文(プロンプト)を予測しようっていうコンペで存在を知ったんだけど、こいつが凄い。
 環境にもよるとは思うけど、2~3秒で512*512のかなり思った通りの画像を抽出してくれる。しかも、現在進行形で研究が進んでて、最近だと人物のポーズを指定する拡張機能とか、背景と被写体を別々に作って合成する技術とかが出てきてる。

 こいつの問題点として倫理的問題があって、学習データにpixivとかの有名な絵師さんとか、アニメ絵とかが使われてるモデルデータがかなりあるっぽい。恐らくそういうモデルデータは汎用性に欠けるんだけど、アニメ絵とかを書くのにめっちゃ特化してて正に人間の仕事をAIが奪いかけていると私は思う。

 AIには手が書けないとか、ポーズが指定できないとか、毎回服の模様が変わるとかそういう問題はあるんだけど、マジでそこら辺は時間の問題なんじゃないかなと。
 最終的にAIの弱点は個性が無いことになると私は思うんだけど、そのAIを使ってる人間の個性を学ぶことが出来たらそれさえ無くなってしまうんじゃないかなと。

 でも、人の描く絵にはAI以上の考えやストーリーが入っているから無くなることはないんじゃないかなと思う。けど、確実に仕事は減るだろうし、これは絵描きだけじゃなく音楽とか動画コンテンツとかデザインとか全ての物に言えると思う。

 恐らく、というか既にアンチAIという人は世の中にかなりの数いると思う。自分も去年の10月にNovelAIが出たときはAIがすごい怖かったしかなり敵対視してた。ChatGPTでも全く同じことを思った。でも、ただ未知を怖がるんじゃなくて、それについて調べてどう脅威なのか知るのも大事なのかなとも思う。

DiscordのBotを作る

ゼロから作るDeepLearningもアルゴリズム本も読了してちょっとだけ余裕が出来たので、DiscordでAtcoderの様々な情報を通知してくれるbotを作ってみた。

注意点

  1. ライブラリの使い方は調べれば山ほど出てくるから説明しないけど、discord.pyは1.x.xと2.x.xで使い方が違うところがかなりあるから気を付けて
  2. スクレイピングするときはサーバーに負担をかけないように1秒以上の間隔を開ける必要がある。
  3. そもそもbotを24時間稼働させるとなるとpcをずっと開いてるかサーバーを借りるかしなきゃならない。
  4. 出せない情報(TOKENやらユーザーネームやらディレクトリ構造やら)がまあまあある+コードが長くてソースコードを説明するのが面倒くさいから、ソースコードは乗っけてない。

 

このbotに追加した機能は

  1. 次のコンテストの情報を伝える
  2. 指定したユーザーの今日のAC数を数える

というもの。

これらを実装するために、

  • Python 3.9.8
  • discord.py 2.1.1
  • request 2.28.2
  • beutifulsoup4 4.11.2

を主に使った。

discord.pyというのはdiscordのbotを簡単に作れるようにするライブラリ。
requestは指定したURLのhtmlの情報とかを得るもので、beutifulsoup4はそれを加工するもの。

できたものはこんな感じ。

やったこととしては、

 コンテスト情報はAtCoderからrequestで引っ張ってきて、bs4で加工して一番近いコンテスト情報の日にちと時間を得た。次のABC開催までの時間はdatetimeという時間を計算したり得たりできるライブラリで計算して出した。

 誰が何回解いたかはAtcoderProblemを作ってくれている人がAPIを作ってくれていたのでそっから引っ張ってきて加工して作った。これにはエポック時間というものが使われているので注意。

 午後10時40分に毎日発信するようにしたんだけど、それはdiscord.pyのtaskっていうイベントで行った。このtaskがかなり曲者で、v2.0とv1.0で使い方が違うからかなり調べた。
最終的にon_readyイベントにloop.start()を入れたら動くようになった。

終わりに

なんだかんだbotを維持するには電気代orサーバー代がかかるので今は使っていない。けど、pythonファイル間でデータを受け渡す方法とか、.batファイルの仕組みとか、スクレイピングの仕組み、時間の仕組み、botの仕組みとか色々学べたので良かったと思う。

是非興味がある人は作ってほしい。