こんにちは、JS2IIUです。
今回は画像生成AIのBlack Forest Labで最も良いモデルのflex-pro-1.1-ultraを利用してみます。オプションでraw画像の出力も可能なモデルです。OpenAIのAPIと使い勝手が若干異なるので、画像取得までの手順を丁寧にみていきたいと思います。今回もよろしくお願いします。
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-pro-1.1-ultraモデルを使用した画像生成アプリのプログラムを示します。flux-pro-1.1-ultraモデルは複数あるモデルの中でも最も単価が高いモデルです。(2025年2月時点で$0.06/image)
必要なライブラリのインストール
アプリを実行するために、以下のPythonライブラリが必要です。
pip install streamlit requests pillowプログラムコード
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-pro-1.1-ultra'
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,
'output_format': 'png',
'raw': False,
}
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.')
# Two people watching fireworks at Disneyland.出来上がった画像はこちらです。かなり良い仕上がりです。
プログラムの詳細解説
1. APIキーの設定
APIキーは環境変数BFL_API_KEYに設定されていることを前提としています。ターミナルで以下のように設定できます。
export BFL_API_KEY='your_api_key_here'または、スクリプト内で直接設定する場合は以下のように記述します。
API_KEY = 'your_api_key_here'2. Streamlitのインターフェース
st.text_input():ユーザーからプロンプトを入力st.number_input():画像の幅と高さを指定st.button():ボタンをクリックすると画像生成処理を開始
3. 画像生成リクエストの送信
requests.post()を使い、BFL APIのflux-pro-1.1-ultraエンドポイントにリクエストを送信します。
response = requests.post(REQUEST_URL, json=payload, headers=headers)成功すれば、リクエストIDが返され、それを使って結果を取得します。
APIリクエストのパラメータは以下のとおりです。
| パラメータ | 型 | デフォルト値 | 説明 |
|---|---|---|---|
prompt | string | nullable | なし | 画像生成に使用するプロンプト |
prompt_upsampling | boolean | false | プロンプトのアップサンプリングを行うかどうか。アクティブにすると、よりクリエイティブな生成のためにプロンプトが自動的に修正される |
seed | integer | nullable | なし | 再現性のためのオプションのシード値。指定しない場合はランダムなシードが使用される |
aspect_ratio | string | 16:9 | 画像のアスペクト比(21:9 から 9:21 の範囲) |
safety_tolerance | integer | 2 | 入力および出力のモデレーションの許容レベル(0 が最も厳しく、6 が最も緩い) |
output_format | string | nullable | jpeg | 生成される画像の出力フォーマット(jpeg または png) |
raw | boolean | false | より加工の少ない、自然な見た目の画像を生成するかどうか |
image_prompt | string | nullable | なし | Remix するオプションの画像(Base64 フォーマット) |
image_prompt_strength | number | 0.1 | プロンプトと画像プロンプトのブレンド比率(0 から 1 の範囲) |
webhook_url | string | nullable | なし | Webhook 通知を受け取るための URL(長さ 1 〜 2083 文字の URI) |
webhook_secret | string | nullable | なし | Webhook の署名検証のためのオプションのシークレット |
4. 結果の取得(ポーリング処理)
画像生成は非同期で行われるため、定期的にAPIに問い合わせて結果を取得します。
while True:
time.sleep(0.5)
result_response = requests.get(RESULT_URL, headers=headers, params={'id': request_id})statusがReadyになったら画像のURLを取得し、表示します。
5. エラー処理
APIリクエストや画像取得時のエラーに対応するため、st.error()を使って適切なエラーメッセージを表示します。
アプリの実行方法
- 必要なライブラリをインストール
- APIキーを設定
- スクリプトを
app.pyとして保存 - 以下のコマンドでアプリを起動
streamlit run app.py参考リンク
このアプリを活用して、簡単に高品質な画像を生成してみましょう!
最後に、書籍のPRです。
最新のOpenAIのチャットAPIの使い方もしっかりと解説されている良書です。2024年11月初版発行、「LangChainとLangGraphによるRAG・AIエージェント[実践]入門」西見、吉田、大嶋著。
最後まで読んでいただきありがとうございます。73

