import time import gradio as gr from generate import generate # base font stacks mono_fonts = ["monospace"] sans_fonts = [ "sans-serif", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", ] def read_file(path: str) -> str: with open(path, "r", encoding="utf-8") as file: return file.read() # don't request a GPU if input is bad def generate_btn_click(*args, **kwargs): start = time.perf_counter() if "prompt" in kwargs: prompt = kwargs.get("prompt") elif len(args) > 0: prompt = args[0] else: prompt = None if prompt is None or prompt.strip() == "": raise gr.Error("You must enter a prompt") images = generate(*args, **kwargs, Error=gr.Error) end = time.perf_counter() diff = end - start gr.Info(f"Generated {len(images)} images in {diff:.2f}s") return images with gr.Blocks( head=read_file("head.html"), css="./app.css", js="./app.js", theme=gr.themes.Default( # colors primary_hue=gr.themes.colors.orange, secondary_hue=gr.themes.colors.blue, neutral_hue=gr.themes.colors.gray, # sizing text_size=gr.themes.sizes.text_md, spacing_size=gr.themes.sizes.spacing_md, radius_size=gr.themes.sizes.radius_sm, # fonts font=[gr.themes.GoogleFont("Inter"), *sans_fonts], font_mono=[gr.themes.GoogleFont("Ubuntu Mono"), *mono_fonts], ).set( block_background_fill=gr.themes.colors.gray.c50, block_background_fill_dark=gr.themes.colors.gray.c900, block_shadow="0 0 #0000", block_shadow_dark="0 0 #0000", ), ) as demo: gr.HTML(read_file("intro.html")) output_images = gr.Gallery( label="Output", show_label=False, columns=1, interactive=False, show_share_button=False, elem_id="gallery", ) prompt = gr.Textbox( label="Prompt", show_label=False, lines=2, placeholder="corgi, at the beach, cute", value=None, ) generate_btn = gr.Button("Generate", variant="primary", elem_classes=[]) with gr.Accordion( label="Menu", open=False, elem_id="menu", elem_classes=["accordion"], ): with gr.Tabs(): with gr.TabItem("⚙ī¸ Settings"): with gr.Group(): negative_prompt = gr.Textbox( label="Negative Prompt", lines=1, placeholder="ugly", value="", ) with gr.Row(): num_images = gr.Dropdown( label="Images", choices=[1, 2, 3, 4], value=1, filterable=False, ) aspect_ratio = gr.Dropdown( label="Aspect Ratio", choices=["1:1", "4:3", "3:4", "16:9", "9:16"], value="1:1", filterable=False, ) seed = gr.Number(label="Seed", value=0) with gr.Row(): guidance_scale = gr.Slider( label="Guidance Scale", minimum=1.0, maximum=15.0, step=0.1, value=7.5, ) inference_steps = gr.Slider( label="Inference Steps", minimum=1, maximum=50, step=1, value=30, ) with gr.Row(): model = gr.Dropdown( label="Model", choices=[ "fluently/Fluently-v4", "Linaqruf/anything-v3-1", "Lykon/dreamshaper-8", "prompthero/openjourney-v4", "runwayml/stable-diffusion-v1-5", "SG161222/Realistic_Vision_V5.1_Novae", ], value="Lykon/dreamshaper-8", ) scheduler = gr.Dropdown( label="Scheduler", choices=[ "DEIS 2M", "DPM++ 2M", "DPM2 a", "Euler a", "Heun", "LMS", "PNDM", ], value="DEIS 2M", elem_id="scheduler", ) with gr.Row(): use_karras = gr.Checkbox( label="Use Karras Īƒ", value=True, elem_classes=["checkbox"], scale=2, ) increment_seed = gr.Checkbox( label="Autoincrement seed", value=True, elem_classes=["checkbox"], elem_id="increment-seed", scale=2, ) random_seed_btn = gr.Button( "🎲 Random seed", variant="secondary", size="sm", scale=1, ) with gr.TabItem("🛠ī¸ Advanced"): gr.Markdown("_Coming soon..._", elem_classes=["markdown"]) with gr.TabItem("ℹī¸ Info"): gr.Markdown(read_file("info.md"), elem_classes=["markdown"]) # change gallery columns when num_images changes num_images.change( lambda n: gr.Gallery(columns=n), inputs=[num_images], outputs=[output_images], ) # update the random seed using JavaScript random_seed_btn.click(None, outputs=[seed], js="() => Math.floor(Math.random() * 2**32)") generate_btn.click( generate_btn_click, api_name="generate", concurrency_limit=5, outputs=[output_images], inputs=[ prompt, negative_prompt, seed, model, scheduler, aspect_ratio, guidance_scale, inference_steps, use_karras, num_images, increment_seed, ], ) # https://www.gradio.app/docs/gradio/interface#interface-queue demo.queue().launch( { "server_name": "0.0.0.0", "server_port": 7860, } )