【Streamlit】 Black Forest LabのAPIで画像生成する

Streamlit
この記事は約10分で読めます。

こんにちは、JS2IIUです。

今回は画像生成AIのBlack Forest Labを利用してみます。OpenAIのAPIと使い勝手が若干異なるので、画像取得までの手順を丁寧にみていきたいと思います。今回もよろしくお願いします。

Black Forest Labs - Frontier AI Lab
Amazing AI models from the Black Forest.

Black Forest Labとは?

Black Forest Lab(BFL)は、機械学習を活用した高度な画像生成APIを提供するプラットフォームです。特に、flux-devモデルを使用することで、ユーザーは簡単に高品質な画像を生成することができます。BFLのAPIは非同期処理を採用しており、リクエストを送信後に定期的に結果を取得することで画像を生成・取得する仕組みとなっています。

BFLのAPIを利用するためには、Black Forest Labs APIに登録し、APIキーを取得する必要があります。Black Forest Labは従量課金制です。最低1000クレジット、$10分の課金が必要になります。

Streamlitを活用した画像生成アプリ

以下に、BFLのflux-devモデルを使用した画像生成アプリのプログラムを示します。flux-devモデルは複数あるモデルの中でも最も単価が安いモデルです。(2025年2月時点)

必要なライブラリのインストール

アプリを実行するために、以下のPythonライブラリが必要です。

Bash
pip install streamlit requests pillow

プログラムコード

Python
import streamlit as st
import requests
from PIL import Image
from io import BytesIO
import os
import time

# 環境変数からAPIキーを取得
API_KEY = os.getenv('BFL_API_KEY')

# APIエンドポイント
REQUEST_URL = 'https://api.us1.bfl.ai/v1/flux-dev'
RESULT_URL = 'https://api.us1.bfl.ai/v1/get_result'

# Streamlit UI
st.title('Image Generation with FLUX-DEV Model')

prompt = st.text_input('Enter your prompt:')
width = st.number_input('Width of the image:', min_value=64, max_value=2048, value=512, step=64)
height = st.number_input('Height of the image:', min_value=64, max_value=2048, value=512, step=64)

if st.button('Generate Image'):
    if prompt:
        with st.spinner('Generating image...'):
            # リクエストペイロードを作成
            payload = {
                'prompt': prompt,
                'width': width,
                'height': height
            }
            headers = {
                'accept': 'application/json',
                'x-key': API_KEY,
                'Content-Type': 'application/json'
            }

            # 画像生成リクエストを送信
            response = requests.post(REQUEST_URL, json=payload, headers=headers)
            if response.status_code == 200:
                request_id = response.json().get('id')
                if request_id:
                    # 結果を取得するためのポーリング処理
                    while True:
                        time.sleep(0.5)
                        result_response = requests.get(RESULT_URL, headers=headers, params={'id': request_id})
                        if result_response.status_code == 200:
                            result_data = result_response.json()
                            if result_data.get('status') == 'Ready':
                                image_url = result_data['result'].get('sample')
                                if image_url:
                                    # 画像を取得し表示
                                    image_response = requests.get(image_url)
                                    if image_response.status_code == 200:
                                        image = Image.open(BytesIO(image_response.content))
                                        st.image(image, caption='Generated Image', use_column_width=True)
                                    else:
                                        st.error('Failed to retrieve the generated image.')
                                else:
                                    st.error('Image URL not found in the response.')
                                break
                            elif result_data.get('status') == 'Failed':
                                st.error('Image generation failed.')
                                break
                        else:
                            st.error('Error while fetching the result.')
                else:
                    st.error('Request ID not found in the response.')
            else:
                st.error('Error while submitting the generation request.')
    else:
        st.warning('Please enter a prompt.')

プログラムの詳細解説

1. APIキーの設定

APIキーは環境変数BFL_API_KEYに設定されていることを前提としています。ターミナルで以下のように設定できます。

Python
export BFL_API_KEY='your_api_key_here'

または、スクリプト内で直接設定する場合は以下のように記述します。

Python
API_KEY = 'your_api_key_here'

2. Streamlitのインターフェース

  • st.text_input():ユーザーからプロンプトを入力
  • st.number_input():画像の幅と高さを指定
  • st.button():ボタンをクリックすると画像生成処理を開始

3. 画像生成リクエストの送信

requests.post()を使い、BFL APIのflux-devエンドポイントにリクエストを送信します。

Python
response = requests.post(REQUEST_URL, json=payload, headers=headers)

成功すれば、リクエストIDが返され、それを使って結果を取得します。

4. 結果の取得(ポーリング処理)

画像生成は非同期で行われるため、定期的にAPIに問い合わせて結果を取得します。

Python
while True:
    time.sleep(0.5)
    result_response = requests.get(RESULT_URL, headers=headers, params={'id': request_id})

statusReadyになったら画像のURLを取得し、表示します。

5. エラー処理

APIリクエストや画像取得時のエラーに対応するため、st.error()を使って適切なエラーメッセージを表示します。

アプリの実行方法

  1. 必要なライブラリをインストール
  2. APIキーを設定
  3. スクリプトをapp.pyとして保存
  4. 以下のコマンドでアプリを起動
Bash
streamlit run app.py

参考リンク

このアプリを活用して、簡単に高品質な画像を生成してみましょう!

最後に、書籍のPRです。

最新のOpenAIのチャットAPIの使い方もしっかりと解説されている良書です。2024年11月初版発行、「LangChainとLangGraphによるRAG・AIエージェント[実践]入門」西見、吉田、大嶋著。

最後まで読んでいただきありがとうございます。73

コメント

タイトルとURLをコピーしました