File size: 8,128 Bytes
e547b24
 
 
 
 
 
 
 
 
 
919ba89
e547b24
 
 
 
dee91ab
5329473
e547b24
 
 
 
c7e1ae3
 
 
 
 
 
 
 
6f5a32e
e547b24
 
6f5a32e
e547b24
 
 
 
 
 
5329473
e547b24
 
 
 
6f5a32e
 
e547b24
 
 
 
 
 
 
6f5a32e
e547b24
 
6f5a32e
e547b24
 
a990e71
 
fe3510c
 
 
a990e71
 
 
 
 
5329473
82fb148
fe3510c
82fb148
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a990e71
 
 
5329473
 
3141340
dee91ab
fe3510c
 
5329473
 
 
 
f41cd41
5329473
 
 
 
 
a990e71
 
 
5329473
a990e71
 
5329473
 
a990e71
 
5329473
fe3510c
5329473
 
dee91ab
fe3510c
 
 
 
dee91ab
5329473
a990e71
0a7af4b
fe3510c
 
 
dee91ab
fe3510c
 
 
 
 
0a7af4b
a990e71
 
9f34bf5
 
 
 
 
 
a990e71
5329473
 
 
 
 
 
 
 
 
10ee85a
 
 
 
82fb148
10ee85a
754fa07
3141340
3eb21d9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9a6a08a
dee91ab
9a6a08a
3141340
0a7af4b
f41cd41
5329473
 
 
 
dee91ab
e547b24
c7e1ae3
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
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%; /* Ancho máximo del contenedor en 100% del espacio disponible */
    margin: 0 auto; /* Centrar el contenedor */
    padding: 20px; /* Espacio interno */
}

input, textarea, select {
    background-color: #f5f5f5; /* Fondo gris claro para inputs */
    color: #333333; /* Texto gris oscuro en inputs */
    border: 1px solid #cccccc; /* Borde gris claro en inputs */
    width: calc(100% - 40px); /* Ancho completo menos espacio para el botón */
    box-sizing: border-box; /* Incluir el borde en el ancho total */
    padding-right: 40px; /* Espacio para el botón de borrar */
}

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

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

button {
    background-color: #f5f5f5; /* Fondo gris claro */
    color: #333333; /* Texto gris oscuro */
    border: 1px solid black; /* Borde negro en botones */
    width: 100%; /* Ancho completo del botón */
    box-sizing: border-box; /* Incluir el borde en el ancho total */
    padding: 10px; /* Espacio interno en el botón */
}

button.primary {
    background-color: green; /* Fondo verde para el botón 'Generate' */
    color: black; /* Texto negro en el botón 'Generate' */
}

button.secondary {
    background-color: #f5f5f5; /* Fondo gris claro para el botón 'Clear' */
    color: #333333; /* Texto gris oscuro en el botón 'Clear' */
}

button:hover {
    background-color: #e0e0e0; /* Fondo gris más oscuro en hover */
}

h1, h2, h3, h4, h5, h6 {
    color: #333333; /* Texto gris oscuro en encabezados */
}

@media (max-width: 768px) {
    .button-container {
        display: flex;
        flex-direction: column;
        align-items: center; /* Centra el botón en vista móvil */
    }

    .button-container button {
        width: auto; /* Ajusta el ancho del botón para móviles */
        margin-top: 10px; /* Espacio superior para el botón en móviles */
    }
}

@media (min-width: 769px) {
    .button-container {
        display: flex;
        justify-content: flex-end; /* Alinea el botón a la derecha en vista de escritorio */
    }

    .button-container button {
        width: auto; /* Ajusta el ancho del botón para escritorio */
    }
}
"""

examples = [
    "A group of Minions, the small, yellow, goggle-wearing characters, trapped inside in the same large square block of transparent ice. Their comical expressions of surprise and confusion are clearly visible through the ice, with their characteristic overalls and goggles still intact. The surrounding ice is frosted and cracked, with hints of blue light reflecting off the surface. The scene is set in a wintry environment, with snowflakes gently falling and an icy landscape stretching into the back.",
    "A golden brown horse, trotting forward with bright, expressive eyes and a joyful expression, is captured in stunning 8K realism. The vibrant, colorful sky features brilliantly bright, multicolored clouds in deep blue, pink, and orange hues. The horse's rich coat contrasts beautifully with the swirling clouds, creating a striking and dynamic scene full of energy and joy.",
    "((Helmet of Kylo Ren)) in dominant shape of cat, heavily adapted to the physical characteristics of (((cat))), incorporating rugged texture and robust elements. Ultra-detailed 3D render with exquisite rim lighting, vibrant and hyper-realistic textures. Majestic design, imposing presence, polished tones according to (colors of Kylo Ren). Contrasted and meticulously crafted background, high-quality octane rendering, 8K."
]

with gr.Blocks(css=css) as app:
    gr.HTML("""
    <center>
        <h1>Dream Generator with 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)
            
            with gr.Row(elem_id="button-container"):
                generate_button = gr.Button("QUIERO VER MI SUEÑO", elem_id="generate-button", variant="primary")

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

    generate_button.click(query, inputs=[text_prompt, negative_prompt, steps, cfg, strength], outputs=image_output)

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