Stable Diffusionのオリジナル開発陣による画像生成AIモデル最新版FLUX 1.1 [pro]のWeb APIを呼んでいくつかの画像を生成してみた

[Supership](https://supership.jp/)の名畑です。オンライン連載漫画の中では特に[寿エンパイア](https://urasunday.com/title/1020)が大好きなんですが、先日、[せきやてつじ先生](https://twitter.com/QJOqv3oIwaeisUy)の[原画展](https://books.manganight.net/%E3%80%909-20-10-14%E3%80%91%E5%8E%A8%E6%88%BF%E3%81%AF%E6%88%A6%E5%A0%B4%E3%81%A0%EF%BC%81%E3%81%9B%E3%81%8D%E3%82%84%E3%81%A6%E3%81%A4%E3%81%98%E5%8E%9F%E7%94%BB%E5%B1%95%E3%80%8E%E3%83%90%E3%83%B3/)に行ってきました。熱を感じました。エンジョイ！

## はじめに

以前「[Stable Diffusionのオリジナル開発陣が発表した画像生成AIモデルFLUX.1([dev]/[schnell])をMacBook(M2)で動かしてみた](https://qiita.com/nabata/items/ed97f7238f13bd4450a3)」という記事を書きました。
Stable Diffusionのオリジナル開発陣によって立ち上げられた[Black Forest Labs](https://blackforestlabs.ai/)がリリースした画像生成AIモデル **FLUX.1** をMacBookで動かしてみたという記事でした。

あれから2ヶ月が経ち、**FLUX.1.1[pro]** （コードネーム Blueberry）がリリースされ、さらに当時は限定公開だったWeb APIも一般公開されました。まだベータではありますが。

> BlackForestLabsは同時に、開発者や企業向けのBFL APIベータ版の一般提供も開始した。FLUX1.1 [pro]の画像生成能力をアプリケーションに組み込めるようになる。APIの利用料金は1画像あたり4セントという低価格に設定されている。
>
> 参考：[ASCII.jp：人気の画像生成AI、最新版「FLUX 1.1」発表　「Blueberry」として話題のモデル](https://ascii.jp/elem/000/004/226/4226033/)

今回はこの **FLUX1.1 [pro]** をWeb API経由で呼び出してみます。

コードはすべて**Python**です。

## アカウント作成とAPI Keyの作成

[APIのページ](https://api.bfl.ml/)の**Register**からアカウントを作成し、ログインします。

1クレジットは0.01ドルです。登録タイミングによるのかもしれませんが、私は最初から50クレジット付与されていました。

[Pricingのページ](https://docs.bfl.ml/pricing/)によると、モデル毎の費用は以下です。

- FLUX 1.1 [pro] 0.04ドル / 1枚
- FLUX.1 [pro] 0.05ドル / 1枚
- FLUX.1 [dev] 0.025ドル / 1枚

次にAPI Keyを作成します。

**Add Key**を押してページ遷移し、好きなKey名を入力します。

![flb_api_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/037d7a70-e031-8a4a-11e5-8949739bf50a.png)

すると以下のように発行されます。

![flb_api_2.ml.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/cac4391e-5840-b02f-970b-e58598040428.png)

## 私の環境

私の端末のOSは[macOS 14 Sonoma](https://www.apple.com/jp/macos/sonoma/)です。

Pythonのバージョンは以下です。

```shell-session
$ python --version
Python 3.12.2
```

サンプルコードの実行に用いるため、[requests](https://pypi.org/project/requests/)も入れておきます。

```shell-session
$ pip install requests
```

バージョンを確認しておきました。

```shell-session
$ pip list | grep -e requests 
requests           2.31.0
```

ハードコーディングを避けるため、先ほどのAPI Keyを環境変数に保存します。私の環境での設定ファイルはzshrcです。

```shell-session
$ open ~/.zshrc
```

**BFL\_API\_KEY**という環境変数名にしました。

```shell-session
export BFL_API_KEY=ここに取得したAPI Keyを書く
```

## コード

[Getting Started](https://docs.bfl.ml/quick_start/gen_image/)のサンプルコードをそのまま持ってきました。コメント文だけ少しつけています。本当は[status](https://api.bfl.ml/scalar#model/resultresponse)はErrorを拾ってbreakさせた方が良さそうですが、ひとまずサンプルコードのまま変えていません。

```python
import os
import requests
import time

# リクエスト
request = requests.post(
    'https://api.bfl.ml/v1/flux-pro-1.1',
    headers={
        'accept': 'application/json',
        'x-key': os.environ.get("BFL_API_KEY"),
        'Content-Type': 'application/json',
    },
    json={
        'prompt': 'A cat on its back legs running like a human is holding a big silver fish with its arms. The cat is running away from the shop owner and has a panicked look on his face. The scene is situated in a crowded market.',
        'width': 1024,
        'height': 768,
    },
).json()
print(request)
request_id = request["id"]

# 生成完了を待つ
while True:
    time.sleep(0.5)
    result = requests.get(
        'https://api.bfl.ml/v1/get_result',
        headers={
            'accept': 'application/json',
            'x-key': os.environ.get("BFL_API_KEY"),
        },
        params={
            'id': request_id,
        },
    ).json()
    if result["status"] == "Ready":
        print(f"Result: {result['result']['sample']}")
        break
    else:
        print(f"Status: {result['status']}")
```

プロンプトを訳すと「**後ろ足で人間のように走っている猫が、両腕で大きな銀色の魚を抱えている。猫は店主から逃げ出していて、パニックになった顔に見えます。シーンは混雑した市場の中です。**」ですね。

最終的な**result**は以下のフォーマットです。ちなみにですが、レスポンスまでの時間は過去に試したAPI群と比べてかなり早かったです。

```python
{
    'id': 'リクエストのID',
    'status': 'Ready',
    'result': {
        'sample': '生成された画像が置かれたurl',
        'prompt': '指定したプロンプト'
    }
}
```

**sample**内に画像が置かれたurlが指定されています。私が試したときのドメインは**bflapistorage.blob.core.windows.net**でした。

生成された画像は以下です。

![flb_image_0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/d294e76d-6ffb-0a77-7b69-b6e03e222579.jpeg)

「**このプロンプトだとこんな画像が返ってきてほしいな**」と期待したそのままに近いですね。素晴らしいです。
何枚か試しても店主自身が登場する画像は生成されませんでしたが、追われる焦りは表現されています。

## 別プロンプト

せっかくなのでプロンプトを変えて様々な画像を生成してみました。

使用するプロンプトは過去記事である「[Stability AIの最新サービス「Stable Image Ultra」とStable Diffusionの過去モデル(2022年〜)の生成画像をひたすら比較して進化を実感してみた](https://qiita.com/nabata/items/52a25e3f2bac99a2527d)」と同様のものとしています。

### 日本の萌えヒロイン

「**日本の萌えヒロイン（Japanese moe heroine）**」を**anime style**指定で生成しました。

```Python
'prompt': 'anime style, Japanese moe heroine',
```

![flb_image_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/2fe33b6f-6f3e-db9b-d47e-0593c61954c8.jpeg)

### 日本の人気アニメに登場するスイーツ

「**日本の人気アニメに登場するスイーツ（Sweets that appear in popular Japanese anime）**」です。これも**anime style**指定です。

```Python
'prompt': 'anime style, sweets that appear in popular Japanese anime',
```

![flb_image_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/b84df771-a372-5d61-4276-a291c516c93b.jpeg)

### 修学旅行中の男子高校生

「**修学旅行中の男子高校生（Male high school student on a school trip）**」です。こちらも**anime style**指定となります。

```Python
'prompt': 'anime style, male high school student on a school trip',
```

![flb_image_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/622cb52c-d8dd-9f6c-f8c7-b4aa1e24443b.jpeg)

### ギターを演奏するお姫様

次は「**ギターを演奏するお姫様（A princess playing guitar）**」です。
ここから2プロンプトは**fantasy-art style**を指定しています。

```Python
'prompt': 'fantasy-art style, a princess playing guitar',
```

![flb_image_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/f437cd78-78da-7126-ed63-583827139770.jpeg)

### ノートパソコン上の可愛い妖精

「**ノートパソコン上の可愛い妖精（A cute fairy on top of a white laptop）**」です。ここからは**photographic style**を指定します。

```Python
'prompt': 'photographic style, a cute fairy on top of a white laptop',
```

![flb_image_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/111fc6b8-77e7-cb88-efa2-653f641a1d77.jpeg)

### 黒いボブヘアで可愛い28歳の日本人女性

「**黒いボブヘアで可愛い28歳の日本人女性（28-year-old Japanese pretty woman with black bobbed hair）**」です。

```Python
'prompt': 'photographic style, 28-year-old Japanese pretty woman with black bobbed hair',
```

![flb_image_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/ab8d4526-f451-88b5-af1d-8a4292d0552f.jpeg)

### 1980年代の香港の繁華街

「**1980年代の香港の繁華街（Hong Kong downtown in the 1980s）**」です。

```Python
'prompt': 'photographic style, Hong Kong downtown in the 1980s',
```

![flb_image_7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/b6b3fbf6-5847-b1f1-f7e7-722cdc5e7090.jpeg)

### 2020年の新宿歌舞伎町

最後です。「**2020年の新宿歌舞伎町（Shinjuku Kabukicho in 2020）**」です。

```Python
'prompt': 'photographic style, Shinjuku Kabukicho in 2020',
```

![flb_image_8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/fc2aadcb-a7dd-93e9-df68-1cd463a1e04f.jpeg)

生成されたどの画像も、かなり高品質です。

高品質なAI生成物に触れすぎていて、現実というものに対する感覚が麻痺しそう。

## 最後に

**Black Forest Labs**が勢いを発揮し続けそうな空気ですね。

今後に予定されている動画生成も楽しみです。

## 宣伝

[SupershipのQiita Organization](https://qiita.com/organizations/supership-inc)を合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方は[Supership株式会社 採用サイト](https://supership.jp/recruit/)よりご確認ください。