File size: 7,240 Bytes
357533f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a990e71
 
f857521
 
 
6b4f3b6
 
 
a990e71
 
 
f857521
 
 
 
 
 
82fb148
 
 
 
 
 
 
f857521
82fb148
 
 
 
 
 
a990e71
 
 
f857521
 
 
 
 
 
5329473
 
 
f857521
 
5329473
 
 
f857521
 
a990e71
 
 
f857521
a990e71
 
5329473
f857521
a990e71
 
5329473
fe3510c
5329473
 
f857521
fe3510c
 
 
f857521
 
5329473
6b4f3b6
 
 
 
a990e71
0a7af4b
fe3510c
 
 
f857521
fe3510c
 
 
f857521
fe3510c
0a7af4b
a990e71
357533f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
import gradio as gr
import requests
import io
import random
import os
from PIL import Image
from deep_translator import GoogleTranslator

# Project by Nymbo

API_URL = "https://api-inference.huggingface.co/models/black-forest-labs/FLUX.1-dev"
API_TOKEN = os.getenv("HF_READ_TOKEN")
headers = {"Authorization": f"Bearer {API_TOKEN}"}
timeout = 100

def query(prompt, is_negative=False, steps=30, cfg_scale=7, strength=0.7):
    if not prompt:
        return None

    key = random.randint(0, 999)
    
    # Detectar el idioma del prompt y traducirlo al inglés
    translator = GoogleTranslator(target='en')
    try:
        prompt = translator.translate(prompt)
    except Exception as e:
        print(f"Error during translation: {e}")
        return None

    print(f'\033[1mGeneration {key} translation:\033[0m {prompt}')

    prompt = f"{prompt} | ultra detail, ultra elaboration, ultra quality, perfect."
    print(f'\033[1mGeneration {key}:\033[0m {prompt}')
    
    payload = {
        "inputs": prompt,
        "is_negative": is_negative,
        "steps": steps,
        "cfg_scale": cfg_scale,
        "strength": strength
    }

    response = requests.post(API_URL, headers=headers, json=payload, timeout=timeout)
    if response.status_code != 200:
        print(f"Error: Failed to get image. Response status: {response.status_code}")
        print(f"Response content: {response.text}")
        if response.status_code == 503:
            raise gr.Error(f"{response.status_code} : The model is being loaded")
        raise gr.Error(f"{response.status_code}")
    
    try:
        image_bytes = response.content
        image = Image.open(io.BytesIO(image_bytes))
        print(f'\033[1mGeneration {key} completed!\033[0m ({prompt})')
        return image
    except Exception as e:
        print(f"Error when trying to open the image: {e}")
        return None

css = """
#app-container {
    max-width: 100%;
    margin: 0 auto;
    padding: 20px;
    overflow-y: auto; /* Asegura la barra de desplazamiento vertical si el contenido es demasiado alto */
    height: 100vh; /* Utiliza el 100% de la altura de la ventana de visualización */
    box-sizing: border-box; /* Incluye el padding y el borde en el tamaño total */
}

input, textarea, select {
    background-color: #f5f5f5;
    color: #333333;
    border: 1px solid #cccccc;
    width: calc(100% - 40px);
    box-sizing: border-box;
    padding-right: 40px;
}

input[type="text"] {
    position: relative;
}

input[type="text"]::after {
    content: "✕";
    position: absolute;
    right: 10px;
    top: 50%;
    transform: translateY(-50%);
    cursor: pointer;
    color: #666;
}

button {
    background-color: #f5f5f5;
    color: #333333;
    border: 1px solid black;
    width: 100%;
    box-sizing: border-box;
    padding: 10px;
}

button.primary {
    background-color: green;
    color: black;
}

button.secondary {
    background-color: #f5f5f5;
    color: #333333;
}

button:hover {
    background-color: #e0e0e0;
}

h1, h2, h3, h4, h5, h6 {
    color: #333333;
}

@media (max-width: 768px) {
    .button-container {
        display: flex;
        flex-direction: column;
        align-items: center;
    }

    .button-container button {
        width: auto;
        margin-top: 10px;
    }

    #reset-button {
        display: none; /* Oculta el botón de reinicio en pantallas móviles */
    }
}

@media (min-width: 769px) {
    .button-container {
        display: flex;
        justify-content: flex-end;
    }

    .button-container button {
        width: auto;
    }
}
"""

examples = [
    "Minions con gafas atrapados en un bloque de hielo transparente, mostrando expresiones sorprendidas. Hielo escarchado y agrietado refleja luz azul. Copos de nieve caen suavemente en un paisaje invernal.",
    "Un caballo castaño dorado trotando alegremente en realismo 8K contra un cielo vibrante con nubes multicolores en azul, rosa y naranja.",
    "El casco de Kylo Ren en forma de gato con texturas rugosas. Renderizado 3D ultra detallado con iluminación de borde y texturas hiper-realistas. Tonos pulidos de los colores de Kylo Ren, renderizado en 8K con fondo contrastante."
]

with gr.Blocks(css=css) as app:
    gr.HTML("""
    <center>
        <h1>Generador de Sueños con Flux</h1>
        <h2>Transforma tus sueños en imágenes vibrantes con un solo clic.</h2>
    </center>
    """)

    with gr.Row():
        with gr.Column(scale=1):
            text_prompt = gr.Textbox(
                label="¿Cuál fue tu sueño?", 
                placeholder="Describe lo que soñaste, no omitas ningún detalle.", 
                lines=2, 
                elem_id="prompt-text-input"
            )

            with gr.Accordion("Opciones Avanzadas", open=False):
                negative_prompt = gr.Textbox(
                    label="¿Qué elementos no deseas que se plasmen de tu sueño?", 
                    placeholder="Describe en detalle lo que quieres que aparezca.", 
                    value="(deformed, distorted, disfigured), poorly drawn, bad anatomy, wrong anatomy, extra limb, missing limb, floating limbs, (mutated hands and fingers), disconnected limbs, mutation, mutated, ugly, disgusting, blurry, amputation, misspellings, typos", 
                    lines=3, 
                    elem_id="negative-prompt-text-input"
                )
                steps = gr.Slider(
                    label="Profundidad del sueño (Pasos de muestreo)", 
                    value=35, 
                    minimum=1, 
                    maximum=100, 
                    step=1
                )
                cfg = gr.Slider(
                    label="Claridad del sueño (Nivel de detalle)", 
                    value=7, 
                    minimum=1, 
                    maximum=20, 
                    step=1
                )
                strength = gr.Slider(
                    label="Intensidad del sueño (Fuerza de transformación)", 
                    value=0.7, 
                    minimum=0, 
                    maximum=1, 
                    step=0.001
                )

            # Mover el componente de ejemplos aquí, justo debajo de Opciones Avanzadas
            gr.Examples(examples=examples, inputs=text_prompt, label="Ejemplos de otros sueños")
            
            with gr.Row(elem_id="button-container"):
                generate_button = gr.Button("QUIERO VER MI SUEÑO", elem_id="generate-button", variant="primary")
                reset_button = gr.Button("REINICIAR MI SUEÑO", elem_id="reset-button", variant="secondary")

        with gr.Column(scale=1):
            image_output = gr.Image(type="pil", label="Imagen Resultado", elem_id="gallery")

    generate_button.click(query, inputs=[text_prompt, negative_prompt, steps, cfg, strength], outputs=image_output)
    reset_button.click(lambda: gr.update(text_prompt="", negative_prompt="(deformed, distorted, disfigured), poorly drawn, bad anatomy, wrong anatomy, extra limb, missing limb, floating limbs, (mutated hands and fingers), disconnected limbs, mutation, mutated, ugly, disgusting, blurry, amputation, misspellings, typos)"), outputs=[text_prompt, negative_prompt])

app.launch(show_api=False, share=False)