詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

Stable Diffusion を Colab で Web アプリ化する

Stable Diffusion が来てるねってことで貧者の GPU であるところの Colaboratory でいろいろ試したいのだけどノートブック上で Python のコードをこまごまいじりながら試行錯誤するのは微妙に体験が悪い。

ちょっとしたウェブサービスとして立てて実行できるとよいけれど、なかなかクラウドサービスも帯に短し襷に長しという感じで GPU を気軽に借りられるところはなさそうだ……と思ったら、Colab 上に HTTP サーバを立てられることを知ったので、その方法でやってみることにする。

やってみたソースは以下。

GitHub - motemen/stablediffusion-server-on-colab

README にあるノートブックを開いて Huggingface のトークンを埋め、GPU を選択して実行するとサーバが起動する。サーバが起動する前のセルに表示される https://localhost:5000 のようなリンクをクリックすると、簡単なウェブアプリケーションが起動して、入力した prompt から生成した画像を表示してくれる。画像をクリックすると prompt をファイル名とした画像をダウンロードできるので、ここから気に入ったやつだけ保存しておけばよい。

Colab の HTTP プロキシ機能は当該のリンクをクリックしたノートブックのユーザのみに見られるようにしているようなので、不用意にリロードしたりプロキシしたり他のユーザに見せたりすると 403 になってしまうのに注意。そうなってしまったら、port を変えて再実行するとよさそうである。手元で開発してたときに API だけサーバにプロキシしてたら突然 403 になってしまってハマった。

性質上、ノートブックを開いてる間しか使えません。取り急ぎ作ったものなので、ロード中の進捗表示やステップ数の調整機能くらいはつけたいですね。

Colaboratoryでワードクラウドを生成する

任意の文章に対してワードクラウドを生成したい要件があるとき、非エンジニアでも行えるようにするには、ウェブアプリケーションとして提供するのもよいが、この程度のちょっとしたスクリプトのような用途であれば Google Colaboratory でもいいんじゃね、となったのでやってみた。結果できた。

日本語の文章を入力として、分かち書きした出現頻度をもとにワードクラウドを生成する。

日本語WordCloud

走れメロス』でこんな感じになります。

Colaboratory には変数のもつデータをフォームで指定させる方法があるので、なんとなく使い方がわかるはず。複数行入力できそうな見た目のフォームはなかったけど……。

形態素解析器には Janome を利用した。pip だけでインストールできるので非常に簡単だった。

Google Apps ScriptでSlackのプロフィールカードを作る

オンラインで直接顔を突き合わせずに仕事ができるようになったり、会社が大きくなってきたりすると、たまの飲み会で顔を突き合わせてもあれこの人どこの誰だっけ、となることもしばしば。

物理的な会なら名札を配るところ。オンラインでの会なら、バーチャル背景に自分のプロフィールを書いておくのがオススメだけど、わざわざ全員が自分のを作るのは面倒なので自動化する、ということで今回は Google Apps Script で Slack のプロフィールカードを作ることにする。

GitHub - motemen/gas-slack-profile-card-slide-generator

動きはこんな感じ。

Slack Profile Card Generator demo - YouTube

Google と Slack でログインすると、Slack のプロフィールを元に Google スライドを作ってくれる。

いちおうデプロイしたものが以下にあるが、Google ドライブの権限をかなり広く要求するので、まあ信頼できる人が内輪向けに作ったのを利用するのがいいと思う。

https://script.google.com/macros/s/AKfycbyp8V4S1K3BptwKBNsnD5NcNE7kYd1jWZvGgVnDcLlhF5uQ3k_HxDv9cC4Av_gC-HqN/exec

セットアップ

というわけで自前でデプロイする方法。

@google/clasp を使っている。clasp のセットアップができている環境で yarn setup すると

  • clasp create --type webapp して GAS プロジェクトを作成、
  • yarn build でコードを生成、
  • yarn push で反映させる。

これをやった上で、プロジェクトを GAS でウェブアプリとしてデプロイすれば OK(完全に動かすには下記の設定が必要)。

Slack でログインさせてプロフィール情報を取得したいので、Slack App を作成する必要がある。便利なことに、右上の「Slack App Manifest」から https://api.slack.com/apps で使える JSON 形式の manifest を表示できるので、コールバック URL とか必要なスコープとかを手入力する必要はないはず。

後はいつもどおり GAS エディタで「プロジェクトの設定」→「スクリプト プロパティ」を開き、Slack アプリの SLACK_CLIENT_IDSLACK_CLIENT_SECRET をそれぞれ設定。それに加えて、プロフィールカードのテンプレートとなるスライドの ID(Google スライドの URL の https://docs.google.com/presentation/d/<この部分>/edit)を TEMPLATE_SLIDE_ID として設定すれば設定完了。

テンプレートスライドの作成

テンプレートとなる Google スライドはこんな感じ。

https://docs.google.com/presentation/d/1jwKNAl-MaMhfRSufmoTT3VX1g5Q-_q-EGkCszQo74Xc/edit#

このテンプレートをコピーして、プレースホルダっぽい要素が書き換えた新しいスライドを生成する。スライドは微調整の上、PNG なり SVG なりでダウンロードできる。

右上の「Template Variables」から、どんなテンプレート変数が使えるかが確認できる。ワークスペースに特有のフィールドも対応してるので便利ですぞ。

はてなで一緒に働きませんか?