yokon

yokon

君子终日乾乾,夕惕若厉,无咎
github

Midjourney|自分のプラットフォームへの統合方法

最近 Midjourney を自分のプラットフォームに接続しようと考えていますが、Midjourney が API を公開していないため、妥協策として Discord の Bot API を利用し、/imagineコマンドを発行して Midjourney bot の描画タスクを作成します。そして、Midjourney bot のメッセージをリアルタイムでリスニングし、プラットフォームに返送します。これで基本的に私のニーズを満たすことができました。

この記事では、私が実装した Midjourney API プロジェクトを紹介し、使用方法を添付します。

大まかな流れは以下の図の通りです:

Mermaid Loading...

midjourney-api#

オープンソースのアドレス:https://github.com/yokonsan/midjourney-api

このリポジトリは、Midjourney をプラットフォームに接続するために開発した一連のインターフェースです。個人使用では基本的に大部分のニーズを満たしており、現在オープンソースとして公開していますので、皆さんの参考にしてください。役に立つと思ったらスターを押していただけると嬉しいです。バグを見つけた場合は、イシューやプルリクエストを提案してください。

具体的な開発の詳細は省略しますが、この記事ではこのリポジトリの使い方について説明します。

準備作業#

注意:このリポジトリは Discord が開発した API に依存しています。Discord へのアクセス方法については、各自で調べてください。ここでは、皆さんがすでに Discord で自分のサーバーを作成し、Midjourney をサーバーに追加していることを前提とします。

このリポジトリを使用するには、4 つのパラメータが必要です:

  1. ユーザートークン(API 呼び出しには認証が必要)
  2. 作成した Discord ボットのトークン(Midjourney セッションをリアルタイムでリスニング)
  3. Discord 自作サーバーの ID
  4. Midjourney bot がいるチャンネルの ID

これらのパラメータの取得方法がわかる方は、次のセクションに進んでください。

ユーザートークン#

ウェブ版 Discord にログインし、F12を押して開発者ツールを開き、ページをリフレッシュします。下の図を参考にNetworkをクリックし、フィルター欄に/api/libraryを入力してこのリクエスト記録を見つけ、リクエストボディ内のauthorizationフィールドを見つけます。その値が必要なトークンです。

注意:このトークンはプライバシー情報に属するため、コード内に直接公開して GitHub にアップロードしないでください。

Pasted image 20230519144719

ボットトークン#

ここでは、まず Discord ボットを作成する必要があります。アドレス:https://discord.com/developers/applications

作成プロセスは非常に簡単なので、詳細は省略します。

Pasted image 20230519145542

Reset Tokenをクリックし、そのトークンをcopyします。

しかし、ボットが機能するためには、いくつかのスコープを追加する必要があります。

Pasted image 20230519145939

スコープを選択すると、ページの下部に OAuth2 認証リンクが生成されます。このリンクをコピーしてブラウザで開きます。

開くと OAuth2 認証ページが表示されるので、ボットをサーバーに追加します。

サーバー ID、チャンネル ID#

ここは比較的簡単です。まず、開発者モードを開きます:

Pasted image 20230519150515

次に、サーバーのアイコンを右クリックしてサーバー 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は以下のインターフェースを提供します:

  1. /v1/api/trigger/bot:描画タスクをトリガー、完了済み
  2. /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
}'

Pasted image 20230521113818

私たちが起動したtask_bot.pyリスニングサービスが、すでにメッセージログをリスニングしているのがわかります:

Pasted image 20230521113910

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 ではありません。

Pasted image 20230521114604

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 枚生成します。

Pasted image 20230521120322

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
}'

Pasted image 20230521120623

まとめ#

この記事では、Midjourney を接続する方法を主に紹介し、私のオープンソースプロジェクト midjourney-api を紹介し、このプロジェクトの使用方法について説明しました。

このリポジトリに基づいて、皆さんは Midjourney を QQ、WeChat、DingTalk などのプラットフォームに簡単に接続できます。興味がある方には、WeChat ボットを作成するか、私の個人公式アカウントに接続する方法をお教えします。

もちろん、このリポジトリにはまだ多くの未完成の部分があります。例えば、画像生成から画像生成への機能などです。これらの機能は今後追加していく予定ですので、皆さんの参加も歓迎します。オープンソースのアドレス:https://github.com/yokonsan/midjourney-api

Stable-Diffusion に比べて、Midjourney は初心者にとってよりフレンドリーです。皆さんもぜひ体験してみてください。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。