|
|
import gradio as gr |
|
|
import spaces |
|
|
from model import ModelHandler |
|
|
from generator import Generator |
|
|
from config import Config |
|
|
|
|
|
|
|
|
print("Initializing Application...") |
|
|
handler = ModelHandler() |
|
|
handler.load_models() |
|
|
gen = Generator(handler) |
|
|
|
|
|
|
|
|
@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)}") |
|
|
|
|
|
|
|
|
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") |
|
|
|
|
|
|
|
|
all_inputs = [ |
|
|
prompt, |
|
|
negative_prompt, |
|
|
aspect_ratio, |
|
|
cfg_scale, |
|
|
steps, |
|
|
seed |
|
|
] |
|
|
|
|
|
run_btn.click( |
|
|
fn=process_text, |
|
|
inputs=all_inputs, |
|
|
outputs=[output_img] |
|
|
) |
|
|
|
|
|
|
|
|
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 |
|
|
) |
|
|
|