Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import numpy as np | |
| import random | |
| from PIL import Image, ImageDraw, ImageFont | |
| import torch | |
| from diffusers import DiffusionPipeline | |
| import io | |
| import time | |
| # ===== CONFIG ===== | |
| device = "cuda" if torch.cuda.is_available() else "cpu" | |
| torch_dtype = torch.float16 if device == "cuda" else torch.float32 | |
| # Using SDXL Turbo for fastest generation | |
| model_repo_id = "stabilityai/sdxl-turbo" | |
| pipe = DiffusionPipeline.from_pretrained( | |
| model_repo_id, | |
| torch_dtype=torch_dtype, | |
| variant="fp16" if device == "cuda" else None | |
| ) | |
| pipe.to(device) | |
| # Enable memory efficient attention and channels last for better performance | |
| pipe.enable_xformers_memory_efficient_attention() | |
| pipe.unet.to(memory_format=torch.channels_last) | |
| MAX_SEED = np.iinfo(np.int32).max | |
| IMAGE_SIZE = 1024 # Same as original code | |
| WATERMARK_TEXT = "SelamGPT" | |
| # ===== OPTIMIZED WATERMARK FUNCTION ===== | |
| def add_watermark(image): | |
| """Optimized watermark function matching original style""" | |
| try: | |
| draw = ImageDraw.Draw(image) | |
| font_size = 24 # Fixed size as in original | |
| try: | |
| font = ImageFont.truetype("Roboto-Bold.ttf", font_size) | |
| except: | |
| font = ImageFont.load_default(font_size) | |
| text_width = draw.textlength(WATERMARK_TEXT, font=font) | |
| x = image.width - text_width - 10 | |
| y = image.height - 34 | |
| # Shadow effect | |
| draw.text((x+1, y+1), WATERMARK_TEXT, font=font, fill=(0, 0, 0, 128)) | |
| draw.text((x, y), WATERMARK_TEXT, font=font, fill=(255, 255, 255)) | |
| return image | |
| except Exception as e: | |
| print(f"Watermark error: {str(e)}") | |
| return image | |
| # ===== ULTRA-FAST INFERENCE FUNCTION ===== | |
| def generate( | |
| prompt, | |
| negative_prompt="", | |
| seed=None, | |
| randomize_seed=True, | |
| guidance_scale=0.0, # 0.0 for turbo models | |
| num_inference_steps=1, # Can be as low as 1-2 for turbo | |
| progress=gr.Progress(track_tqdm=True), | |
| ): | |
| if not prompt.strip(): | |
| return None, "⚠️ Please enter a prompt" | |
| start_time = time.time() | |
| # Seed handling | |
| if randomize_seed or seed is None: | |
| seed = random.randint(0, MAX_SEED) | |
| generator = torch.manual_seed(seed) | |
| # Ultra-fast generation with minimal steps | |
| result = pipe( | |
| prompt=prompt, | |
| negative_prompt=negative_prompt, | |
| width=IMAGE_SIZE, | |
| height=IMAGE_SIZE, | |
| guidance_scale=guidance_scale, | |
| num_inference_steps=max(1, num_inference_steps), # Minimum 1 step | |
| generator=generator, | |
| ).images[0] | |
| # Optimized watermark and JPG conversion | |
| watermarked = add_watermark(result) | |
| buffer = io.BytesIO() | |
| watermarked.save(buffer, format="JPEG", quality=85, optimize=True) | |
| buffer.seek(0) | |
| gen_time = time.time() - start_time | |
| status = f"✔️ Generated in {gen_time:.2f}s | Seed: {seed}" | |
| return Image.open(buffer), status | |
| # ===== EXAMPLES ===== | |
| examples = [ | |
| ["An ancient Aksumite warrior in cyberpunk armor, 4k detailed"], | |
| ["Traditional Ethiopian coffee ceremony in zero gravity"], | |
| ["Portrait of a Habesha queen with golden jewelry"] | |
| ] | |
| # ===== OPTIMIZED INTERFACE ===== | |
| theme = gr.themes.Default( | |
| primary_hue="emerald", | |
| secondary_hue="amber", | |
| font=[gr.themes.GoogleFont("Poppins"), "Arial", "sans-serif"] | |
| ) | |
| with gr.Blocks(theme=theme, title="SelamGPT Turbo Generator") as demo: | |
| gr.Markdown(""" | |
| # 🎨 SelamGPT Turbo Image Generator | |
| *Ultra-fast 1024x1024 image generation with SDXL-Turbo* | |
| """) | |
| with gr.Row(): | |
| with gr.Column(scale=3): | |
| prompt = gr.Textbox( | |
| label="Describe your image", | |
| placeholder="A futuristic Ethiopian city with flying cars...", | |
| lines=3, | |
| max_lines=5 | |
| ) | |
| with gr.Row(): | |
| generate_btn = gr.Button("Generate Image", variant="primary") | |
| clear_btn = gr.Button("Clear") | |
| gr.Examples( | |
| examples=examples, | |
| inputs=[prompt] | |
| ) | |
| with gr.Column(scale=2): | |
| output_image = gr.Image( | |
| label="Generated Image", | |
| type="pil", | |
| format="jpeg", | |
| height=512 | |
| ) | |
| status_output = gr.Textbox( | |
| label="Status", | |
| interactive=False | |
| ) | |
| with gr.Accordion("⚙️ Advanced Settings", open=False): | |
| negative_prompt = gr.Textbox( | |
| label="Negative Prompt", | |
| placeholder="What to avoid (optional)", | |
| max_lines=1 | |
| ) | |
| with gr.Row(): | |
| randomize_seed = gr.Checkbox(label="Randomize Seed", value=True) | |
| seed = gr.Number(label="Seed", value=0, precision=0) | |
| guidance_scale = gr.Slider(0.0, 1.0, value=0.0, step=0.1, label="Guidance Scale") | |
| num_inference_steps = gr.Slider(1, 4, value=1, step=1, label="Inference Steps") | |
| generate_btn.click( | |
| fn=generate, | |
| inputs=[ | |
| prompt, | |
| negative_prompt, | |
| seed, | |
| randomize_seed, | |
| guidance_scale, | |
| num_inference_steps | |
| ], | |
| outputs=[output_image, status_output] | |
| ) | |
| clear_btn.click( | |
| fn=lambda: [None, ""], | |
| outputs=[output_image, status_output] | |
| ) | |
| if __name__ == "__main__": | |
| demo.queue(max_size=4) # Increased queue for better throughput | |
| demo.launch(server_name="0.0.0.0", server_port=7860) |