Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import torch | |
| from diffusers import StableDiffusionPipeline, LCMScheduler | |
| import time | |
| # ============================================ | |
| # LCM मॉडल लोडिंग | |
| # ============================================ | |
| model_id = "SimianLuo/LCM_Dreamshaper_v7" | |
| print("🔄 LCM मॉडल लोड हो रहा है...") | |
| pipe = StableDiffusionPipeline.from_pretrained( | |
| model_id, | |
| torch_dtype=torch.float32, | |
| safety_checker=None, | |
| requires_safety_checker=False | |
| ) | |
| pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config) | |
| try: | |
| pipe.enable_attention_slicing() | |
| pipe.enable_vae_slicing() | |
| print("✅ मेमोरी ऑप्टिमाइज़ेशन सक्रिय") | |
| except Exception as e: | |
| print(f"नोट: {e}") | |
| print("✅ मॉडल तैयार है!") | |
| # ============================================ | |
| # प्लेटफॉर्म प्रीसेट्स | |
| # ============================================ | |
| PLATFORM_PRESETS = { | |
| "📱 Instagram Post (Square)": {"width": 1080, "height": 1080}, | |
| "📱 Instagram Story": {"width": 1080, "height": 1920}, | |
| "📱 Instagram Portrait": {"width": 1080, "height": 1350}, | |
| "📱 Instagram Landscape": {"width": 1080, "height": 566}, | |
| "📘 Facebook Post": {"width": 1200, "height": 630}, | |
| "📘 Facebook Cover": {"width": 851, "height": 315}, | |
| "🐦 Twitter/X Post": {"width": 1600, "height": 900}, | |
| "🐦 Twitter/X Header": {"width": 1500, "height": 500}, | |
| "📺 YouTube Thumbnail": {"width": 1280, "height": 720}, | |
| "📺 YouTube Channel Banner": {"width": 2560, "height": 1440}, | |
| "💼 LinkedIn Post": {"width": 1200, "height": 627}, | |
| "💼 LinkedIn Banner": {"width": 1584, "height": 396}, | |
| "📌 Pinterest Pin": {"width": 1000, "height": 1500}, | |
| "🎵 TikTok Video": {"width": 1080, "height": 1920}, | |
| "💬 WhatsApp Status": {"width": 1080, "height": 1920}, | |
| "🖥️ Desktop Wallpaper (HD)": {"width": 1920, "height": 1080}, | |
| "🖥️ Desktop Wallpaper (4K)": {"width": 3840, "height": 2160}, | |
| "📱 Mobile Wallpaper": {"width": 1080, "height": 1920}, | |
| "🎨 Square (1:1)": {"width": 1024, "height": 1024}, | |
| "🎨 Portrait (2:3)": {"width": 1024, "height": 1536}, | |
| "🎨 Landscape (3:2)": {"width": 1536, "height": 1024}, | |
| "🎨 Wide (16:9)": {"width": 1280, "height": 720}, | |
| "✏️ Custom Size": {"width": 512, "height": 512}, | |
| } | |
| QUALITY_PRESETS = { | |
| "⚡ Ultra Fast (Draft)": {"steps": 2, "guidance": 0.8}, | |
| "🚀 Fast (Good)": {"steps": 4, "guidance": 1.0}, | |
| "🎯 Balanced (Better)": {"steps": 6, "guidance": 1.2}, | |
| "💎 High Quality (Best)": {"steps": 8, "guidance": 1.5}, | |
| "🔬 Custom": {"steps": 4, "guidance": 1.0}, | |
| } | |
| # ============================================ | |
| # प्लेटफॉर्म बदलने पर ऑटो-अपडेट फंक्शन | |
| # ============================================ | |
| def update_size_from_preset(platform_choice): | |
| """प्लेटफॉर्म चुनने पर width और height अपडेट करें""" | |
| if platform_choice in PLATFORM_PRESETS: | |
| preset = PLATFORM_PRESETS[platform_choice] | |
| return preset["width"], preset["height"] | |
| return 512, 512 | |
| def update_quality_from_preset(quality_choice): | |
| """क्वालिटी प्रीसेट चुनने पर steps और guidance अपडेट करें""" | |
| if quality_choice in QUALITY_PRESETS: | |
| preset = QUALITY_PRESETS[quality_choice] | |
| return preset["steps"], preset["guidance"] | |
| return 4, 1.0 | |
| # ============================================ | |
| # इमेज जनरेशन फंक्शन | |
| # ============================================ | |
| def generate_image( | |
| prompt, negative_prompt, | |
| platform_choice, quality_choice, | |
| custom_width, custom_height, | |
| custom_steps, custom_guidance, | |
| seed, enhance_prompt | |
| ): | |
| """ | |
| एडवांस्ड इमेज जनरेशन फंक्शन | |
| """ | |
| # खाली प्रॉम्प्ट चेक करें | |
| if not prompt or prompt.strip() == "": | |
| return None, "❌ कृपया प्रॉम्पट डालें" | |
| # साइज़ सेट करें | |
| if platform_choice == "✏️ Custom Size": | |
| width = int(custom_width) | |
| height = int(custom_height) | |
| else: | |
| preset = PLATFORM_PRESETS.get(platform_choice, {"width": 512, "height": 512}) | |
| width = preset["width"] | |
| height = preset["height"] | |
| # साइज़ लिमिट चेक (CPU मेमोरी के लिए) | |
| max_pixels = 1024 * 1024 # 1MP | |
| if width * height > max_pixels: | |
| scale = (max_pixels / (width * height)) ** 0.5 | |
| width = int(width * scale) | |
| height = int(height * scale) | |
| width = (width // 64) * 64 | |
| height = (height // 64) * 64 | |
| size_warning = f"⚠️ बड़ी इमेज को {width}x{height} पर रिसाइज़ किया गया" | |
| else: | |
| width = (width // 64) * 64 | |
| height = (height // 64) * 64 | |
| size_warning = "" | |
| # क्वालिटी सेट करें | |
| if quality_choice == "🔬 Custom": | |
| steps = int(custom_steps) | |
| guidance_scale = float(custom_guidance) | |
| else: | |
| preset = QUALITY_PRESETS.get(quality_choice, {"steps": 4, "guidance": 1.0}) | |
| steps = preset["steps"] | |
| guidance_scale = preset["guidance"] | |
| # प्रॉम्प्ट एन्हांसमेंट | |
| if enhance_prompt: | |
| if not prompt.lower().startswith("raw photo"): | |
| prompt = "RAW photo, hyperrealistic, " + prompt | |
| if "8k" not in prompt.lower(): | |
| prompt = prompt + ", 8k, highly detailed, cinematic lighting" | |
| # नेगेटिव प्रॉम्प्ट | |
| if not negative_prompt: | |
| negative_prompt = "cartoon, anime, illustration, painting, drawing, 3d render, blurry, low quality, distorted, ugly, bad anatomy" | |
| # सीड | |
| if seed is None or seed < 0: | |
| actual_seed = int(time.time()) % 9999999 | |
| generator = torch.Generator().manual_seed(actual_seed) | |
| else: | |
| actual_seed = int(seed) | |
| generator = torch.Generator().manual_seed(actual_seed) | |
| print(f"\n{'='*50}") | |
| print(f"🎨 जनरेट हो रहा है...") | |
| print(f" साइज़: {width}x{height}") | |
| print(f" स्टेप्स: {steps}, गाइडेंस: {guidance_scale}") | |
| print(f" सीड: {actual_seed}") | |
| try: | |
| start_time = time.time() | |
| result = pipe( | |
| prompt=prompt, | |
| negative_prompt=negative_prompt, | |
| num_inference_steps=steps, | |
| guidance_scale=guidance_scale, | |
| generator=generator, | |
| width=width, | |
| height=height, | |
| output_type="pil", | |
| num_images_per_prompt=1 | |
| ) | |
| end_time = time.time() | |
| gen_time = round(end_time - start_time, 1) | |
| success_msg = f""" | |
| ✅ **इमेज जनरेट हो गई!** | |
| - समय: {gen_time} सेकंड | |
| - साइज़: {width} x {height} | |
| - सीड: {actual_seed} | |
| {size_warning} | |
| """ | |
| print(f"✅ इमेज {gen_time} सेकंड में जनरेट हुई!") | |
| return result.images[0], success_msg | |
| except Exception as e: | |
| error_msg = f"❌ एरर: {str(e)[:200]}" | |
| print(f"❌ एरर: {e}") | |
| return None, error_msg | |
| # ============================================ | |
| # Gradio UI | |
| # ============================================ | |
| with gr.Blocks( | |
| title="AI Image Generator - Custom Sizes & Quality", | |
| theme=gr.themes.Soft() | |
| ) as demo: | |
| gr.Markdown(""" | |
| # 🎨 AI इमेज जनरेटर - कस्टम साइज़ और क्वालिटी | |
| **किसी भी सोशल मीडिया प्लेटफॉर्म के लिए परफेक्ट साइज़ की इमेज बनाएं!** | |
| """) | |
| with gr.Row(): | |
| # ===== बायां कॉलम - इनपुट ===== | |
| with gr.Column(scale=2): | |
| # प्रॉम्प्ट सेक्शन | |
| with gr.Group(): | |
| gr.Markdown("### 📝 प्रॉम्प्ट") | |
| prompt = gr.Textbox( | |
| label="आप क्या बनाना चाहते हैं?", | |
| placeholder="जैसे: beautiful sunset over mountains, golden hour...", | |
| value="beautiful sunset over mountains, golden hour, ocean view", | |
| lines=3, | |
| show_label=False | |
| ) | |
| enhance_prompt = gr.Checkbox( | |
| label="✨ प्रॉम्प्ट ऑटो-एन्हांस करें (RAW photo, 8k, cinematic जोड़ें)", | |
| value=True | |
| ) | |
| negative_prompt = gr.Textbox( | |
| label="🚫 नेगेटिव प्रॉम्प्ट (क्या नहीं चाहिए)", | |
| value="cartoon, anime, illustration, painting, drawing, blurry, low quality, ugly, bad anatomy", | |
| lines=2 | |
| ) | |
| # प्लेटफॉर्म और साइज़ सेक्शन | |
| with gr.Group(): | |
| gr.Markdown("### 📐 प्लेटफॉर्म और साइज़") | |
| platform_choice = gr.Dropdown( | |
| choices=list(PLATFORM_PRESETS.keys()), | |
| value="🎨 Square (1:1)", | |
| label="📱 प्लेटफॉर्म चुनें", | |
| info="सोशल मीडिया प्लेटफॉर्म के हिसाब से ऑटो-साइज़" | |
| ) | |
| with gr.Row(): | |
| custom_width = gr.Number( | |
| label="चौड़ाई (px)", | |
| value=512, | |
| minimum=256, | |
| maximum=2048, | |
| step=64, | |
| ) | |
| custom_height = gr.Number( | |
| label="ऊंचाई (px)", | |
| value=512, | |
| minimum=256, | |
| maximum=2048, | |
| step=64, | |
| ) | |
| # क्वालिटी सेक्शन | |
| with gr.Group(): | |
| gr.Markdown("### ⚙️ क्वालिटी सेटिंग्स") | |
| quality_choice = gr.Dropdown( | |
| choices=list(QUALITY_PRESETS.keys()), | |
| value="🚀 Fast (Good)", | |
| label="🎯 क्वालिटी प्रीसेट", | |
| info="तेज़ = कम समय, बेहतर = ज़्यादा डिटेल" | |
| ) | |
| with gr.Row(): | |
| custom_steps = gr.Slider( | |
| label="🔢 स्टेप्स", | |
| minimum=1, | |
| maximum=12, | |
| value=4, | |
| step=1, | |
| ) | |
| custom_guidance = gr.Slider( | |
| label="🎯 गाइडेंस स्केल", | |
| minimum=0.5, | |
| maximum=2.0, | |
| value=1.0, | |
| step=0.1, | |
| ) | |
| # सीड और जनरेट बटन | |
| with gr.Row(): | |
| seed = gr.Number( | |
| label="🎲 सीड (-1 = रैंडम)", | |
| value=-1, | |
| precision=0 | |
| ) | |
| generate_btn = gr.Button( | |
| "✨ इमेज जनरेट करें", | |
| variant="primary", | |
| size="lg", | |
| scale=2 | |
| ) | |
| # ===== दायां कॉलम - आउटपुट ===== | |
| with gr.Column(scale=1): | |
| output_image = gr.Image( | |
| label="जनरेटेड इमेज", | |
| height=400, | |
| show_label=True | |
| ) | |
| status_text = gr.Markdown( | |
| "👆 ऊपर सेटिंग्स चुनें और जनरेट करें" | |
| ) | |
| with gr.Accordion("📊 परफॉरमेंस गाइड", open=False): | |
| gr.Markdown(""" | |
| | क्वालिटी | स्टेप्स | CPU समय | कब इस्तेमाल करें | | |
| |:---|:---:|:---:|:---| | |
| | Ultra Fast | 2 | 5-8s | आइडिया टेस्टिंग | | |
| | Fast | 4 | 10-15s | सोशल मीडिया पोस्ट | | |
| | Balanced | 6 | 15-25s | ब्लॉग/वेबसाइट | | |
| | High Quality | 8 | 25-40s | प्रिंट/पोस्टर | | |
| """) | |
| # ===== इवेंट हैंडलर्स (फिक्स किए हुए) ===== | |
| def on_platform_change(choice): | |
| """प्लेटफॉर्म बदलने पर साइज़ अपडेट करें""" | |
| w, h = update_size_from_preset(choice) | |
| return w, h | |
| platform_choice.change( | |
| fn=on_platform_change, | |
| inputs=[platform_choice], | |
| outputs=[custom_width, custom_height] | |
| ) | |
| def on_quality_change(choice): | |
| """क्वालिटी बदलने पर steps और guidance अपडेट करें""" | |
| s, g = update_quality_from_preset(choice) | |
| return s, g | |
| quality_choice.change( | |
| fn=on_quality_change, | |
| inputs=[quality_choice], | |
| outputs=[custom_steps, custom_guidance] | |
| ) | |
| # जनरेट बटन | |
| generate_btn.click( | |
| fn=generate_image, | |
| inputs=[ | |
| prompt, negative_prompt, | |
| platform_choice, quality_choice, | |
| custom_width, custom_height, | |
| custom_steps, custom_guidance, | |
| seed, enhance_prompt | |
| ], | |
| outputs=[output_image, status_text] | |
| ) | |
| # ===== उदाहरण ===== | |
| gr.Markdown("### 📋 तुरंत ट्राई करें") | |
| gr.Examples( | |
| examples=[ | |
| ["RAW photo, red Ferrari on coastal highway, sunset", "cartoon, anime, blurry", "📱 Instagram Post (Square)", "🚀 Fast (Good)", 1080, 1080, 4, 1.0, 42, True], | |
| ["cute golden retriever puppy in flower garden", "cartoon, drawing, ugly", "📌 Pinterest Pin", "🎯 Balanced (Better)", 1000, 1500, 6, 1.2, 123, True], | |
| ["astronaut floating in space, earth background", "cartoon, 3d render", "📺 YouTube Thumbnail", "🚀 Fast (Good)", 1280, 720, 4, 1.0, 456, True], | |
| ["Indian bride in red lehenga, golden jewelry", "cartoon, illustration, deformed", "📱 Instagram Story", "💎 High Quality (Best)", 1080, 1920, 8, 1.5, 789, True], | |
| ], | |
| inputs=[prompt, negative_prompt, platform_choice, quality_choice, custom_width, custom_height, custom_steps, custom_guidance, seed, enhance_prompt], | |
| label="" | |
| ) | |
| if __name__ == "__main__": | |
| print("=" * 50) | |
| print("🚀 AI इमेज जनरेटर - कस्टम साइज़ और क्वालिटी") | |
| print("=" * 50) | |
| demo.queue(max_size=5).launch(show_error=True) |