最近 Midjourney を自分のプラットフォームに接続しようと考えていますが、Midjourney が API を公開していないため、妥協策として Discord の Bot API を利用し、/imagine
コマンドを発行して Midjourney bot の描画タスクを作成します。そして、Midjourney bot のメッセージをリアルタイムでリスニングし、プラットフォームに返送します。これで基本的に私のニーズを満たすことができました。
この記事では、私が実装した Midjourney API プロジェクトを紹介し、使用方法を添付します。
大まかな流れは以下の図の通りです:
midjourney-api#
オープンソースのアドレス:https://github.com/yokonsan/midjourney-api
このリポジトリは、Midjourney をプラットフォームに接続するために開発した一連のインターフェースです。個人使用では基本的に大部分のニーズを満たしており、現在オープンソースとして公開していますので、皆さんの参考にしてください。役に立つと思ったらスターを押していただけると嬉しいです。バグを見つけた場合は、イシューやプルリクエストを提案してください。
具体的な開発の詳細は省略しますが、この記事ではこのリポジトリの使い方について説明します。
準備作業#
注意:このリポジトリは Discord が開発した API に依存しています。Discord へのアクセス方法については、各自で調べてください。ここでは、皆さんがすでに Discord で自分のサーバーを作成し、Midjourney をサーバーに追加していることを前提とします。
このリポジトリを使用するには、4 つのパラメータが必要です:
- ユーザートークン(API 呼び出しには認証が必要)
- 作成した Discord ボットのトークン(Midjourney セッションをリアルタイムでリスニング)
- Discord 自作サーバーの ID
- Midjourney bot がいるチャンネルの ID
これらのパラメータの取得方法がわかる方は、次のセクションに進んでください。
ユーザートークン#
ウェブ版 Discord にログインし、F12
を押して開発者ツールを開き、ページをリフレッシュします。下の図を参考にNetwork
をクリックし、フィルター欄に/api/library
を入力してこのリクエスト記録を見つけ、リクエストボディ内のauthorization
フィールドを見つけます。その値が必要なトークンです。
注意:このトークンはプライバシー情報に属するため、コード内に直接公開して GitHub にアップロードしないでください。
ボットトークン#
ここでは、まず Discord ボットを作成する必要があります。アドレス:https://discord.com/developers/applications
作成プロセスは非常に簡単なので、詳細は省略します。
Reset Token
をクリックし、そのトークンをcopy
します。
しかし、ボットが機能するためには、いくつかのスコープを追加する必要があります。
スコープを選択すると、ページの下部に OAuth2 認証リンクが生成されます。このリンクをコピーしてブラウザで開きます。
開くと OAuth2 認証ページが表示されるので、ボットをサーバーに追加します。
サーバー ID、チャンネル ID#
ここは比較的簡単です。まず、開発者モードを開きます:
次に、サーバーのアイコンを右クリックしてサーバー ID をコピーします。チャンネルも同様に、チャンネルを右クリックしてチャンネル ID をコピーします。
インストールと起動#
git clone
pip install -r requirements.txt
.env.template
を.env
にリネームし、パラメータ値を入力します:
USER_TOKEN=ユーザートークン
BOT_TOKEN=ボットトークン
GUILD_ID=サーバーID
CHANNEL_ID=チャンネルID
CALLBACK_URL=コールバックアドレス、デフォルトはhttpポストリクエスト
直接起動#
# ボットをリスニングする
python task_bot.py
# httpサービスを起動
python server.py
docker 起動#
# イメージをビルド
sh build.sh
# コンテナを起動
sh start.sh
起動後、インターフェースswagger
ドキュメントにアクセスします:http://127.0.0.1:8061/docs
midjourney-api
は以下のインターフェースを提供します:
/v1/api/trigger/bot
:描画タスクをトリガー、完了済み/v1/api/upload
:画像をアップロードし、タスクをトリガー、開発待ち
使用方法#
現在、描画タスクをトリガーするインターフェースのみが完成していますので、これを例にします。このインターフェースを呼び出すには、以下のパラメータが必要です:
class TriggerType(str, Enum):
generate = "generate" # /imagine 提示詞に基づいて画像を生成
upscale = "upscale" # U インデックスを選択して高解像度に拡大
variation = "variation" # V インデックスに基づいてスタイルを変更
reset = "reset" # 再描画
class TriggerBotIn(BaseModel):
type: TriggerType # トリガータイプ
prompt: str = "" # 提示詞
msg_id: str = "" # メッセージID
msg_hash: str = "" # メッセージハッシュ
index: int = 0 # 画像インデックス、1-4
generate#
インターフェース/v1/api/trigger/bot
を直接呼び出して生成します。提示詞:half fish half dragon hybrid, retro screencap --ar 2:3 --niji 5
curl -X 'POST' \
'http://127.0.0.1:8062/v1/api/trigger/bot' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"type": "generate",
"prompt": "half fish half dragon hybrid, retro screencap --ar 2:3 --niji 5",
"msg_id": "",
"msg_hash": "",
"index": 0
}'
私たちが起動したtask_bot.py
リスニングサービスが、すでにメッセージログをリスニングしているのがわかります:
upscale#
ここでは、2 枚目が期待に近いと思うので、インターフェースを呼び出して画像を拡大し、詳細を追加します。ここで、msg_id と msg_hash フィールドの値を取得する必要があります。msg_id は CallbackData の id フィールドで、msg_hash は Attachment の url から拡張子を取り除き、_
で分割した最後の部分です。
class Attachment(TypedDict):
id: int
url: str
proxy_url: str
filename: str
content_type: str
width: int
height: int
size: int
ephemeral: bool
class CallbackData(TypedDict):
type: str
id: int
content: str
attachments: List[Attachment]
curl -X 'POST' \
'http://127.0.0.1:8062/v1/api/trigger/bot' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"type": "upscale",
"prompt": "",
"msg_id": "1109686524045443093",
"msg_hash": "c937b5aa-3f58-4ae5-8dd6-932952243034",
"index": 2
}'
注意:ここでのインデックスは画像の 1-4 であり、0-3 ではありません。
variation#
curl -X 'POST' \
'http://127.0.0.1:8062/v1/api/trigger/bot' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"type": "variation",
"prompt": "",
"msg_id": "1109686524045443093",
"msg_hash": "c937b5aa-3f58-4ae5-8dd6-932952243034",
"index": 2
}'
ここでは、2 枚目の画像のスタイルに基づいて、4 枚生成します。
reset#
提示詞に基づいて再描画します:
curl -X 'POST' \
'http://127.0.0.1:8062/v1/api/trigger/bot' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"type": "reset",
"prompt": "",
"msg_id": "1109686524045443093",
"msg_hash": "c937b5aa-3f58-4ae5-8dd6-932952243034",
"index": 0
}'
まとめ#
この記事では、Midjourney を接続する方法を主に紹介し、私のオープンソースプロジェクト midjourney-api を紹介し、このプロジェクトの使用方法について説明しました。
このリポジトリに基づいて、皆さんは Midjourney を QQ、WeChat、DingTalk などのプラットフォームに簡単に接続できます。興味がある方には、WeChat ボットを作成するか、私の個人公式アカウントに接続する方法をお教えします。
もちろん、このリポジトリにはまだ多くの未完成の部分があります。例えば、画像生成から画像生成への機能などです。これらの機能は今後追加していく予定ですので、皆さんの参加も歓迎します。オープンソースのアドレス:https://github.com/yokonsan/midjourney-api
Stable-Diffusion に比べて、Midjourney は初心者にとってよりフレンドリーです。皆さんもぜひ体験してみてください。