import spaces # <--- EN BAŞTA OLMALI import random import diffusers import gradio as gr import numpy as np import torch from diffusers import StableDiffusion3Pipeline from deep_translator import GoogleTranslator # SD3.5 Large Model Yapılandırması MODEL_REPO_ID = "stabilityai/stable-diffusion-3.5-large" MAX_SEED = np.iinfo(np.int32).max MAX_IMAGE_SIZE = 1024 dtype = torch.bfloat16 if torch.cuda.is_available() else torch.float32 pipe = StableDiffusion3Pipeline.from_pretrained( MODEL_REPO_ID, torch_dtype=dtype, ) if torch.cuda.is_available(): pipe.enable_model_cpu_offload() def translate_if_needed(text: str) -> str: """Türkçe girdiyi modelin anladığı İngilizceye çevirir.""" if not text or not text.strip(): return "" try: translated = GoogleTranslator(source='auto', target='en').translate(text) return translated except Exception: return text @spaces.GPU(duration=60) def generate_image( prompt_tr, negative_prompt_tr="", seed=42, randomize_seed=True, width=1024, height=1024, guidance_scale=4.5, num_inference_steps=35, progress=gr.Progress(track_tqdm=True), ): # Çeviri İşlemleri prompt_en = translate_if_needed(prompt_tr) negative_prompt_en = translate_if_needed(negative_prompt_tr) if randomize_seed: seed = random.randint(0, MAX_SEED) generator = torch.Generator(device="cuda" if torch.cuda.is_available() else "cpu").manual_seed(seed) image = pipe( prompt=prompt_en, negative_prompt=negative_prompt_en, guidance_scale=guidance_scale, num_inference_steps=num_inference_steps, width=width, height=height, generator=generator, ).images[0] return image, seed, prompt_en # Özel CSS ile Modern Arayüz Tasarımı custom_css = """ #main-container { max-width: 900px; margin: 0 auto; padding: 20px; } .generate-btn { background: linear-gradient(90deg, #4F46E5 0%, #7C3AED 100%) !important; color: white !important; font-weight: bold !important; font-size: 1.1em !important; border-none !important; } """ with gr.Blocks(css=custom_css, theme=gr.themes.Soft()) as demo: with gr.Column(elem_id="main-container"): gr.Markdown( """ # 🎨 AI Görsel Stüdyosu (SD 3.5 Large) Türkçe komutlar yazarak yüksek kalitede görseller oluşturun. """ ) with gr.Row(): prompt_input = gr.Textbox( label="Ne üretmek istiyorsunuz?", placeholder="Örn: Takım elbise giymiş, elinde 'Merhaba Dünya' yazan bir kapibara...", lines=2, scale=4, ) run_btn = gr.Button("Üret", variant="primary", elem_classes=["generate-btn"], scale=1) with gr.Row(): result_image = gr.Image(label="Üretilen Görsel", show_label=False, type="pil") with gr.Accordion("⚙️ Gelişmiş Ayarlar", open=False): negative_prompt_input = gr.Textbox( label="İstenmeyen Özellikler (Negative Prompt)", placeholder="Örn: bulanık, düşük kalite, kötü anatomi...", lines=1, ) translated_prompt_preview = gr.Textbox( label="Model Kullanılan İngilizce Çeviri (Otomatik)", interactive=False, ) with gr.Row(): width_slider = gr.Slider( label="Genişlik (Width)", minimum=512, maximum=MAX_IMAGE_SIZE, step=64, value=1024 ) height_slider = gr.Slider( label="Yükseklik (Height)", minimum=512, maximum=MAX_IMAGE_SIZE, step=64, value=1024 ) with gr.Row(): guidance_slider = gr.Slider( label="Metne Sadakat (Guidance Scale)", minimum=1.0, maximum=10.0, step=0.1, value=4.5 ) steps_slider = gr.Slider( label="İşleme Adımı (Steps)", minimum=10, maximum=50, step=1, value=35 ) with gr.Row(): seed_slider = gr.Slider( label="Tohum (Seed)", minimum=0, maximum=MAX_SEED, step=1, value=0 ) randomize_seed_chk = gr.Checkbox(label="Her Seferinde Rastgele Seed Kullan", value=True) # Örnek Hazır Promptlar gr.Examples( examples=[ ["Cyberpunk tarzında, gece vakti yağmurlu İstanbul sokakları, neon ışıklar"], ["Astronaut riding a horse on Mars, photorealistic, 8k resolution"], ], inputs=[prompt_input], ) # Tetikleyiciler inputs_list = [ prompt_input, negative_prompt_input, seed_slider, randomize_seed_chk, width_slider, height_slider, guidance_slider, steps_slider, ] outputs_list = [result_image, seed_slider, translated_prompt_preview] run_btn.click(fn=generate_image, inputs=inputs_list, outputs=outputs_list) prompt_input.submit(fn=generate_image, inputs=inputs_list, outputs=outputs_list) if __name__ == "__main__": demo.launch()