Spaces:
Runtime error
Runtime error
| # app.py | |
| # Uncensored Text-to-Image mit Stable Diffusion – keine Safety-Checks, kein NSFW-Filter | |
| # Für Hugging Face Spaces / lokales Ausführen | |
| import gradio as gr | |
| from diffusers import StableDiffusionPipeline, EulerAncestralDiscreteScheduler | |
| import torch | |
| # Modell wählen – diese sind relativ uncensored-freundlich | |
| # Alternativen: "Lykon/DreamShaper", "prompthero/openjourney-v4", "nitrosocke/Arcane-Diffusion", "runwayml/stable-diffusion-v1-5" | |
| model_id = "Lykon/DreamShaper" | |
| print(f"Lade Modell: {model_id}") | |
| pipe = StableDiffusionPipeline.from_pretrained( | |
| model_id, | |
| torch_dtype=torch.float16, | |
| variant="fp16", | |
| use_safetensors=True, | |
| safety_checker=None, # ← wichtig: deaktiviert NSFW-Filter komplett | |
| requires_safety_checker=False # ← das auch | |
| ) | |
| # Scheduler für bessere Ergebnisse bei expliziten/uncensored Prompts | |
| pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config) | |
| # VRAM-Optimierungen | |
| pipe.enable_attention_slicing() | |
| pipe.enable_model_cpu_offload() # hilft bei wenig VRAM | |
| pipe = pipe.to("cuda" if torch.cuda.is_available() else "cpu") | |
| def generate( | |
| prompt, | |
| negative_prompt="", | |
| steps=35, | |
| guidance=7.0, | |
| width=512, | |
| height=512, | |
| seed=-1, | |
| progress=gr.Progress(track_tqdm=True) | |
| ): | |
| if seed == -1: | |
| generator = None | |
| else: | |
| generator = torch.Generator(device="cuda" if torch.cuda.is_available() else "cpu") | |
| generator.manual_seed(int(seed)) | |
| progress(0, desc="Starte Generierung...") | |
| try: | |
| image = pipe( | |
| prompt=prompt, | |
| negative_prompt=negative_prompt, | |
| num_inference_steps=steps, | |
| guidance_scale=guidance, | |
| width=width, | |
| height=height, | |
| generator=generator, | |
| ).images[0] | |
| progress(1.0, desc="Fertig") | |
| return image | |
| except Exception as e: | |
| return f"Fehler: {str(e)}" | |
| css = """ | |
| body { background: #0d0015; color: #e0d0ff; font-family: system-ui; } | |
| .gradio-container { max-width: 1200px !important; } | |
| h1 { color: #ff4d94; text-shadow: 0 0 20px #ff4d9480; } | |
| button { background: linear-gradient(45deg, #ff4d94, #c71585) !important; } | |
| """ | |
| with gr.Blocks(css=css, title="Uncensored Image Generator") as demo: | |
| gr.Markdown(""" | |
| # Uncensored Text-to-Image Generator | |
| Kein Safety-Checker · Kein NSFW-Filter · Keine Zensur | |
| """) | |
| with gr.Row(): | |
| with gr.Column(scale=6): | |
| prompt = gr.Textbox( | |
| label="Prompt (beliebig explizit möglich)", | |
| placeholder="very detailed, nsfw, explicit, nude woman, cinematic lighting, masterpiece", | |
| lines=4, | |
| max_lines=8 | |
| ) | |
| neg_prompt = gr.Textbox( | |
| label="Negative Prompt (optional)", | |
| placeholder="blurry, low quality, deformed, extra limbs, watermark, text", | |
| lines=2 | |
| ) | |
| with gr.Column(scale=4): | |
| with gr.Group(): | |
| gr.Markdown("**Einstellungen**") | |
| steps = gr.Slider(15, 80, value=35, step=1, label="Steps") | |
| guidance = gr.Slider(1.0, 20.0, value=7.0, step=0.5, label="CFG / Guidance Scale") | |
| seed = gr.Number(value=-1, label="Seed (-1 = random)") | |
| with gr.Group(): | |
| gr.Markdown("**Auflösung**") | |
| width = gr.Slider(256, 1024, value=512, step=64, label="Breite") | |
| height = gr.Slider(256, 1024, value=512, step=64, label="Höhe") | |
| btn = gr.Button("Generieren", variant="primary", scale=0) | |
| output_image = gr.Image(label="Ergebnis", type="pil", show_label=False) | |
| btn.click( | |
| fn=generate, | |
| inputs=[prompt, neg_prompt, steps, guidance, width, height, seed], | |
| outputs=output_image, | |
| _js="() => {return []}" # verhindert unnötige Validierung | |
| ) | |
| demo.launch( | |
| share=True, | |
| server_name="0.0.0.0", | |
| server_port=7860 | |
| ) |