pixel-art / app.py
primerz's picture
Upload 7 files
0f0e9c7 verified
raw
history blame
3.5 kB
import gradio as gr
import spaces
from model import ModelHandler
from generator import Generator
from config import Config
# 1. Initialize Models
print("Initializing Application...")
handler = ModelHandler()
handler.load_models()
gen = Generator(handler)
# 2. Define GPU Inference Function
@spaces.GPU(duration=20)
def process_text(
prompt,
negative_prompt,
aspect_ratio,
cfg_scale,
steps,
seed
):
try:
print("--- Starting Generation ---")
result = gen.predict(
user_prompt=prompt,
negative_prompt=negative_prompt,
aspect_ratio=aspect_ratio,
guidance_scale=cfg_scale,
num_inference_steps=steps,
seed=seed
)
print("--- Generation Complete ---")
return result
except Exception as e:
print(f"Error during generation: {e}")
raise gr.Error(f"An error occurred: {str(e)}")
# 3. Build Gradio Interface
with gr.Blocks(title="Pixel Art Generator", theme=gr.themes.Soft()) as demo:
gr.Markdown(
"""
# 🎮 Text to Pixel Art
Type a prompt to generate high-quality pixel art scenes.
"""
)
with gr.Row():
with gr.Column(scale=2):
prompt = gr.Textbox(
label="Prompt",
placeholder="e.g. cyberpunk city street at night, rain",
info="The trigger words 'p1x3l4rt, pixel art' are added automatically."
)
negative_prompt = gr.Textbox(
label="Negative Prompt",
placeholder="e.g., blurry, text, watermark, bad art...",
value=Config.DEFAULT_NEGATIVE_PROMPT
)
with gr.Accordion("Settings", open=True):
aspect_ratio = gr.Dropdown(
label="Aspect Ratio",
choices=list(Config.ASPECT_RATIOS.keys()),
value=Config.DEFAULT_ASPECT_RATIO,
info="Image dimensions (all ~1MP resolution)"
)
seed = gr.Number(
label="Seed",
value=-1,
info="-1 for random",
precision=0
)
cfg_scale = gr.Slider(
elem_id="cfg_scale",
minimum=1.0,
maximum=5.0,
step=0.1,
value=Config.CGF_SCALE,
label="CFG Scale"
)
steps = gr.Slider(
elem_id="steps",
minimum=4,
maximum=20,
step=1,
value=Config.STEPS_NUMBER,
label="Steps"
)
run_btn = gr.Button("Generate", variant="primary")
with gr.Column(scale=1):
output_img = gr.Image(label="Result")
# Event Handler
all_inputs = [
prompt,
negative_prompt,
aspect_ratio,
cfg_scale,
steps,
seed
]
run_btn.click(
fn=process_text,
inputs=all_inputs,
outputs=[output_img]
)
# 4. Launch
if __name__ == "__main__":
demo.queue(max_size=20, api_open=True)
demo.launch(
server_name="0.0.0.0",
server_port=7860,
show_api=True
)