import os from openai import OpenAI, BadRequestError import gradio as gr from datetime import datetime from zoneinfo import ZoneInfo import shutil from io import BytesIO import base64 from PIL import Image PLACEHOLDER = "ここに画像を生成するための文章を入力してください…" # 設定用リスト size_list = ["1024x1024" ,"1024x1792" ,"1792x1024"] quality_list = ["standard" ,"hd"] style_list = ["vivid", "natural"] def set_state(state, openai_key, size, quality, style): state["openai_key"]= openai_key state["size"] = size state["quality"] = quality state["style"] = style return state def request_dalle(client, prompt, size, quality, style, image_path): err_msg = "" revised_prompt = "" try: response = client.images.generate( model="dall-e-3", prompt=prompt, size=size, quality=quality, style=style, n=1, response_format="b64_json" ) # データを受け取りデコード image_data_json = response.data[0].b64_json image_data = base64.b64decode(image_data_json) # 画像として扱えるように保存 image_stream = BytesIO(image_data) image = Image.open(image_stream) image.save(image_path) # dalle内部のプロンプト revised_prompt = response.data[0].revised_prompt except BadRequestError as e: print(e) out_image_path = "" err_msg = "リクエストエラーです。著作権侵害などプロンプトを確認して下さい。" except Exception as e: print(e) out_image_path = "" err_msg = "その他のエラーが発生しました。OpenAI APIキーが正しいか、クレジット残高があるか確認して下さい。" finally: return err_msg, revised_prompt def create_image(state, text): err_msg = "" user_id = state["user_id"] client = state["client"] size = state["size"] quality = state["quality"] style = state["style"] # OpenAIキーチェック if state["openai_key"] == "": err_msg = "OpenAIキーを入力してください。(設定タブ)" return None, "", err_msg # 入力チェック if text.strip() == "": err_msg = "プロンプトを入力してください。" return None, "", err_msg if user_id == "": # IDとして現在時刻をセット dt = datetime.now(ZoneInfo("Asia/Tokyo")) user_id = dt.strftime("%Y%m%d%H%M%S") # ユーザIDでフォルダ作成 os.makedirs(user_id, exist_ok=True) state["user_id"] = user_id # ファイル名は現在時刻に dt = datetime.now(ZoneInfo("Asia/Tokyo")) image_name = dt.strftime("%Y%m%d%H%M%S") + ".png" # ファイルパスは手動設定(誤りがないように) image_path = user_id + "/" + image_name if client is None: os.environ["OPENAI_API_KEY"] = state["openai_key"] # クライアント作成 client = OpenAI() # client作成後は消す os.environ["OPENAI_API_KEY"] = "" state["client"] = client return_msg, prompt = request_dalle(client, text, size, quality, style, image_path) if return_msg == "": return image_path, prompt, "" else: err_msg = "画像の作成に失敗しました。\n" + return_msg return None, "", err_msg def make_archive(state): """ 画像のZIP化・一括ダウンロード用関数 """ dir = state["user_id"] if dir is None or dir == "": return None, "" if len(os.listdir(dir)) == 0: return None, "" shutil.make_archive(dir, format='zip', root_dir=dir) return dir + ".zip", "下部の出力ファイルからダウンロードして下さい。" with gr.Blocks() as demo: title = "