File size: 6,627 Bytes
e547b24 7c0ea6c e547b24 4a22dd6 e547b24 119e558 e547b24 9be63af e547b24 119e558 e547b24 6f5a32e e547b24 119e558 e547b24 6f5a32e e547b24 119e558 e547b24 119e558 e547b24 119e558 e547b24 6f5a32e e547b24 119e558 e547b24 6f5a32e e547b24 6f5a32e e547b24 119e558 e547b24 02f8cfa 119e558 02f8cfa 92f9c14 fb3573a 92f9c14 73f7edc e547b24 119e558 7c0ea6c 92f9c14 119e558 02f8cfa 119e558 02f8cfa 92f9c14 119e558 02f8cfa 92f9c14 fb3573a 119e558 92f9c14 fb3573a 92f9c14 e547b24 119e558 02f8cfa 92f9c14 119e558 02f8cfa 92f9c14 e547b24 119e558 e547b24 119e558 92f9c14 |
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 |
import gradio as gr
import requests
import io
import random
import os
import time
from PIL import Image
from deep_translator import GoogleTranslator
import json
from themes import IndonesiaTheme # Import custom IndonesiaTheme
# Project by Nymbo
API_URL = "https://api-inference.huggingface.co/models/black-forest-labs/FLUX.1-schnell"
API_TOKEN = os.getenv("HF_READ_TOKEN")
headers = {"Authorization": f"Bearer {API_TOKEN}"}
timeout = 100
# Function to query the API and return the generated image
def query(prompt, is_negative=False, steps=30, cfg_scale=7, sampler="DPM++ 2M Karras", seed=-1, strength=0.7, width=1024, height=1024):
if prompt == "" or prompt is None:
return None
key = random.randint(0, 999)
API_TOKEN = random.choice([os.getenv("HF_READ_TOKEN")])
headers = {"Authorization": f"Bearer {API_TOKEN}"}
# Translate the prompt from Russian to English if necessary
prompt = GoogleTranslator(source='ru', target='en').translate(prompt)
print(f'\033[1mGeneration {key} translation:\033[0m {prompt}')
# Add some extra flair to the prompt
prompt = f"{prompt} | ultra detail, ultra elaboration, ultra quality, perfect."
print(f'\033[1mGeneration {key}:\033[0m {prompt}')
# Prepare the payload for the API call, including width and height
payload = {
"inputs": prompt,
"is_negative": is_negative,
"steps": steps,
"cfg_scale": cfg_scale,
"seed": seed if seed != -1 else random.randint(1, 1000000000),
"strength": strength,
"parameters": {
"width": width, # Pass the width to the API
"height": height # Pass the height to the API
}
}
# Send the request to the API and handle the response
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:
# Convert the response content into an image
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 to style the app
css = """
#app-container {
max-width: 800px;
margin-left: auto;
margin-right: auto;
padding: 20px;
background-color: #2b2b2b;
border-radius: 15px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.4);
}
h1 {
font-size: 2.5rem;
text-align: center;
color: #ffa500;
margin-bottom: 10px;
font-weight: bold;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
}
.description {
text-align: center;
font-size: 1.2rem;
color: black;
margin-bottom: 20px;
font-style: italic;
}
#gen-button {
background-color: #ff9800;
color: white;
font-weight: bold;
border-radius: 10px;
padding: 15px;
transition: background-color 0.3s ease;
}
#gen-button:hover {
background-color: #e67e22;
transform: scale(1.05);
}
#gallery {
border: 2px solid #ff9800;
border-radius: 15px;
}
#prompt-text-input, #negative-prompt-text-input {
background-color: #444444;
color: white;
border-radius: 8px;
border: 1px solid #ffa500;
}
label {
color: #ffffff;
}
"""
# Build the Gradio UI with Blocks
with gr.Blocks(theme=IndonesiaTheme(), css=css) as app:
# Add a title to the app with an emoji and large header
gr.HTML("<h1>π₯ Unlimited FLUX Schnell - V1.3 π₯</h1>")
# Description below the title in Indonesian
gr.HTML("<p class='description'>π Generator gambar AI berkualitas tinggi dengan kontrol penuh atas detail dan opsi lanjutan. Buat karya seni spektakuler dengan mudah! π¨</p>")
# Container for all the UI elements
with gr.Column(elem_id="app-container"):
# Add a text input for the main prompt
with gr.Row():
with gr.Column(elem_id="prompt-container"):
with gr.Row():
text_prompt = gr.Textbox(label="π¨ Prompt", placeholder="Masukkan deskripsi gambar di sini", lines=2, elem_id="prompt-text-input")
# Accordion for advanced settings
with gr.Row():
with gr.Accordion("βοΈ Pengaturan Lanjutan", open=False):
negative_prompt = gr.Textbox(label="β Prompt Negatif", placeholder="Elemen yang tidak diinginkan dalam gambar", 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")
with gr.Row():
width = gr.Slider(label="Lebar", value=1024, minimum=64, maximum=1216, step=32)
height = gr.Slider(label="Tinggi", value=768, minimum=64, maximum=1216, step=32)
steps = gr.Slider(label="Langkah Sampling", value=4, minimum=1, maximum=100, step=1)
cfg = gr.Slider(label="Skala CFG", value=7, minimum=1, maximum=20, step=1)
strength = gr.Slider(label="Kekuatan", value=0.7, minimum=0, maximum=1, step=0.001)
seed = gr.Slider(label="Seed", value=-1, minimum=-1, maximum=1000000000, step=1) # -1 for random
method = gr.Radio(label="Metode Sampling", value="DPM++ 2M Karras", choices=["DPM++ 2M Karras", "DPM++ SDE Karras", "Euler", "Euler a", "Heun", "DDIM"])
# Add a button to trigger the image generation
with gr.Row():
text_button = gr.Button("π Buat Gambar", variant='primary', elem_id="gen-button")
# Image output area to display the generated image
with gr.Row():
image_output = gr.Image(type="pil", label="Hasil Gambar", elem_id="gallery")
# Bind the button to the query function with the added width and height inputs
text_button.click(query, inputs=[text_prompt, negative_prompt, steps, cfg, method, seed, strength, width, height], outputs=image_output)
# Launch the Gradio app
app.launch(show_api=False, share=False)
|