PSNbst's picture
Update app.py
9730020 verified
raw
history blame
6.37 kB
import gradio as gr
import random
import openai
import os
# ========== 默认选项和数据 ==========
EXPRESSIONS = ["smiling", "determined", "surprised", "serene"]
ITEMS = ["magic wand", "sword", "flower", "book of spells", "ancient scroll", "music instrument"]
OTHER_DETAILS = ["sparkles", "magical aura", "lens flare", "fireworks in the background"]
SCENES = ["sunset beach", "rainy city street at night", "fantasy forest with glowing mushrooms", "futuristic skyline at dawn"]
CAMERA_ANGLES = ["low-angle shot", "close-up shot", "bird's-eye view", "wide-angle shot"]
QUALITY_PROMPTS = ["8k", "ultra-realistic", "high detail", "cinematic lighting", "award-winning"]
# ========== 工具函数 ==========
def load_candidates_from_files(files):
"""
从多个文件中加载候选项。
"""
all_lines = []
if files:
for file in files:
# Gradio 的 Files 返回文件路径
if isinstance(file, str):
with open(file, "r", encoding="utf-8") as f:
all_lines.extend([line.strip() for line in f if line.strip()])
return all_lines
def get_random_item(candidates):
"""
随机选取候选项。
"""
return random.choice(candidates) if candidates else ""
def generate_natural_language_description(tags, api_key=None):
"""
使用 OpenAI GPT 生成自然语言描述(适配 GPT-4o)。
"""
if api_key:
try:
openai.api_key = api_key.strip()
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": (
"You are a helpful assistant that generates creative painting/prompt descriptions. "
"Write at least three sentences in English, separated by periods."
)},
{"role": "user", "content": f"Here are the tags: {tags}\nPlease generate a vivid, imaginative scene description."}
]
)
return response["choices"][0]["message"]["content"].strip()
except Exception as e:
return f"GPT generation failed. Error: {e}"
else:
# 本地逻辑生成
return (
f"In this scene, {tags.get('character_name', 'the character')} appears in a {tags.get('scene', 'mysterious place')}, "
f"captured from a {tags.get('camera_angle', 'unique angle')} perspective. "
f"The overall style combines {tags.get('artist_prompt', 'an unknown artist')} and {tags.get('style', 'a distinctive aesthetic')}, "
f"bringing a captivating atmosphere to the artwork. They are {tags.get('action', 'doing something')} "
f"with a {tags.get('expression', 'neutral expression')}, holding {tags.get('items', 'something')} among {tags.get('other_details', 'subtle details')}."
)
def generate_prompt(action_file, style_file, artist_files, character_files, api_key, selected_categories):
"""
生成随机提示词和描述。
"""
# 从文件加载候选项
actions = load_candidates_from_files([action_file]) if action_file else []
styles = load_candidates_from_files([style_file]) if style_file else []
artists = load_candidates_from_files(artist_files) if artist_files else []
characters = load_candidates_from_files(character_files) if character_files else []
# 确定角色类型
number_of_characters = ", ".join(selected_categories) if selected_categories else random.choice(["1girl", "1boy"])
# 随机生成提示词
tags = {
"number_of_characters": number_of_characters,
"character_name": get_random_item(characters),
"artist_prompt": get_random_item(artists),
"style": get_random_item(styles),
"scene": get_random_item(SCENES),
"camera_angle": get_random_item(CAMERA_ANGLES),
"action": get_random_item(actions),
"expression": get_random_item(EXPRESSIONS),
"items": get_random_item(ITEMS),
"other_details": get_random_item(OTHER_DETAILS),
"quality_prompts": get_random_item(QUALITY_PROMPTS),
}
# 生成描述
description = generate_natural_language_description(tags, api_key)
# 返回结果
tags_list = [value for value in tags.values() if value]
final_tags = ", ".join(tags_list)
combined_output = f"Tags: {final_tags}\n\nDescription: {description}"
return final_tags, description, combined_output
# ========== Gradio 界面 ==========
def gradio_interface():
"""
定义 Gradio 应用界面。
"""
with gr.Blocks() as demo:
gr.Markdown("## Random Prompt Generator with User-Provided GPT API Key")
# API Key 输入区
api_key_input = gr.Textbox(
label="Enter your OpenAI API Key (Optional)",
placeholder="sk-...",
type="password"
)
# 文件上传
with gr.Row():
action_file = gr.File(label="Upload Action File (Optional)", file_types=[".txt"])
style_file = gr.File(label="Upload Style File (Optional)", file_types=[".txt"])
with gr.Row():
artist_files = gr.Files(label="Upload Artist Files (Multiple Allowed)", file_types=[".txt"])
character_files = gr.Files(label="Upload Character Files (Multiple Allowed)", file_types=[".txt"])
# 角色类型选择
selected_categories = gr.CheckboxGroup(
["1boy", "1girl", "furry", "mecha", "fantasy monster", "animal", "still life"],
label="Choose Character Categories (Optional)"
)
# 输出区域
with gr.Row():
tags_output = gr.Textbox(label="Generated Tags")
description_output = gr.Textbox(label="Generated Description")
combined_output = gr.Textbox(label="Combined Output: Tags + Description")
# 按钮
generate_button = gr.Button("Generate Prompt")
# 按钮动作
generate_button.click(
generate_prompt,
inputs=[action_file, style_file, artist_files, character_files, api_key_input, selected_categories],
outputs=[tags_output, description_output, combined_output],
)
return demo
# 启动 Gradio 应用
if __name__ == "__main__":
gradio_interface().launch(share=True)