Spaces:
Running
Running
import gradio as gr | |
import requests | |
import random | |
import urllib.parse | |
import logging | |
from PIL import Image | |
from io import BytesIO | |
from deep_translator import GoogleTranslator | |
from langdetect import detect | |
# Настройка логирования | |
logging.basicConfig(level=logging.INFO) | |
logger = logging.getLogger(__name__) | |
def generate_image(prompt, style, width, height, seed): | |
if seed == -1: | |
seed = random.randint(0, 999999) | |
# Добавляем теги для стилей | |
style_tags = { | |
"Свой": "", | |
"Аниме": "anime style, detailed, vibrant colors, cartoonish", | |
"Реализм": "realism style, hyperrealistic, photorealistic", | |
"3D": "3D style, rendering, high detail, volumetric lighting", | |
"Краски": "paintings style, impressionist, detailed brush strokes, oil painting", | |
"Пиксель-арт": "pixel art style, low resolution, retro, nostalgic", | |
"Машины с лицами": "machines with faces, mechanical humanoid, futuristic, detailed features", | |
"Космический": "space style, celestial bodies, galaxies, stars, nebulae", | |
"Монстры": "monster style, mythical creatures, detailed anatomy, fantasy", | |
"Супергерои": "superhero style, comic book, vibrant colors, dynamic poses", | |
"Детская книга": "children's book style, whimsical, colorful, simple shapes", | |
"Готический": "gothic style, dark, intricate details, brooding atmosphere", | |
"Ретро": "retro style, vintage, 8-bit, nostalgic", | |
"Стимпанк": "steampunk style, steam-powered machinery, brass and copper elements, Victorian era", | |
"Фэнтези": "fantasy style, magical creatures, enchanted forests, mythical landscapes", | |
"Народные мотивы": "folk art style, traditional patterns, cultural motifs, vibrant colors", | |
"Минимализм": "minimalist style, clean lines, simple shapes, neutral colors", | |
"Гаражный хардкор": "garage punk style, industrial, rugged, DIY, metal textures", | |
"Стример": "streamer style, gaming, charismatic, energetic, modern", | |
"Новый хоррор": "new horror style, dark atmosphere, suspenseful, twisted, modern", | |
"Детский мультфильм": "children's animation style, colorful, cartoonish, simple shapes", | |
"Арт-ноу": "art nouveau style, ornate, flowing lines, detailed patterns", | |
"Викторианский": "victorian style, intricate details, ornate architecture, vintage", | |
"Грейский тон": "grayscale style, monochrome, detailed textures, high contrast", | |
"Моцарт": "mozart style, classical music, baroque, elegant, detailed", | |
"Гамбит": "chess style, board game, strategy, detailed pieces, high contrast", | |
"Киберпанк": "cyberpunk style, futuristic, neon lights, high-tech, detailed environments", | |
"Грот": "cave style, underground, detailed textures, stone formations, natural", | |
"Цирк": "circus style, vibrant, acrobatic, colorful, dynamic", | |
"Арт-деко": "art deco style, geometric patterns, ornate, luxurious, 1920s", | |
"Стратегические игры": "strategy game style, hexagonal tiles, detailed maps, military units", | |
"Инди-игра": "indie game style, charming, minimalist, vibrant colors, simple graphics", | |
"Медиевский": "medieval style, knightly armor, castles, detailed textures, historical", | |
"Макет": "model kit style, detailed parts, assembly instructions, high precision", | |
"Футуристический": "futuristic style, sleek design, high-tech, minimalistic, modern", | |
"Пасха": "easter egg style, hidden details, playful, humorous, subtle", | |
"Микстап": "meme style, humorous, exaggerated, pop culture references, viral", | |
"Скульптура": "sculpture style, detailed modeling, textured surfaces, realistic materials", | |
"Дизайн интерьера": "interior design style, modern, functional, detailed textures, cozy", | |
"Спорт": "sports style, dynamic action, detailed athletes, high contrast, vibrant colors", | |
"Голливудский": "hollywood style, glamour, high contrast, detailed sets, cinematic", | |
"Тематический парк": "theme park style, vibrant, detailed rides, futuristic, entertaining", | |
"Космический полет": "space travel style, detailed spaceships, planets, starfields, high contrast", | |
"Лабиринт": "maze style, intricate pathways, detailed textures, puzzle-like, high contrast", | |
"Тропический лес": "tropical rainforest style, lush vegetation, detailed textures, vibrant colors", | |
"Экспериментальный": "experimental style, abstract, unconventional, detailed patterns, vibrant colors" | |
} | |
language = detect(prompt) | |
if language != 'en': | |
prompt = GoogleTranslator(source=language, target='en').translate(prompt) | |
prompt = style_tags.get(style, "") + ". " + prompt if style_tags.get(style, "") else prompt | |
prompt = prompt.strip() | |
# URL-кодирование промпта | |
encoded_prompt = urllib.parse.quote(prompt) | |
url = f"https://image.pollinations.ai/prompt/{encoded_prompt}?width={width}&height={height}&seed={seed}&nologo=true&nofeed=true" | |
logger.info(f"Generated URL: {url}") | |
try: | |
response = requests.get(url, timeout=150) | |
if response.status_code == 200: | |
logger.info("Image generated successfully") | |
# Преобразуем байты в изображение | |
image = Image.open(BytesIO(response.content)) | |
return image | |
else: | |
logger.error(f"Failed to generate image. Status code: {response.status_code}, Response: {response.text}") | |
raise gr.Error("Извините, изображение создавалось слишком долго или произошла ошибка. Попробуйте снова.") | |
except requests.exceptions.Timeout: | |
logger.error("Request timed out") | |
raise gr.Error("Извините, изображение создавалось слишком долго, мы отменили генерацию.") | |
except requests.exceptions.RequestException as e: | |
logger.error(f"Request exception: {e}") | |
raise gr.Error("Произошла ошибка при генерации изображения. Попробуйте снова.") | |
# Ссылка на файл CSS | |
css_url = "https://neurixyufi-aihub.static.hf.space/style.css" | |
# Получение CSS по ссылке | |
response = requests.get(css_url) | |
css = response.text + ".gradio-container{max-width: 700px !important} h1{text-align:center}" | |
# Создаем интерфейс Gradio | |
with gr.Blocks(css=css) as demo: | |
gr.Markdown("") | |
gr.Markdown("# Генератор Изображений (Lite)") | |
with gr.Tab("Основные настройки"): | |
prompt_input = gr.Textbox(label="Описание изображения", placeholder="Введите описание изображения на английском языке") | |
with gr.Accordion("Стиль", open=False): | |
style_radio = gr.Radio(label="Выбор стиля", choices=[ | |
"Свой", | |
"Аниме", | |
"Реализм", | |
"3D", | |
"Краски", | |
"Пиксель-арт", | |
"Машины с лицами", | |
"Космический", | |
"Монстры", | |
"Супергерои", | |
"Детская книга", | |
"Готический", | |
"Ретро", | |
"Стимпанк", | |
"Фэнтези", | |
"Народные мотивы", | |
"Минимализм", | |
"Гаражный хардкор", | |
"Стример", | |
"Новый хоррор", | |
"Детский мультфильм", | |
"Арт-ноу", | |
"Викторианский", | |
"Грейский тон", | |
"Моцарт", | |
"Гамбит", | |
"Киберпанк", | |
"Грот", | |
"Цирк", | |
"Арт-деко", | |
"Стратегические игры", | |
"Инди-игра", | |
"Медиевский", | |
"Макет", | |
"Футуристический", | |
"Пасха", | |
"Микстап", | |
"Скульптура", | |
"Дизайн интерьера", | |
"Спорт", | |
"Голливудский", | |
"Тематический парк", | |
"Космический полет", | |
"Лабиринт", | |
"Тропический лес", | |
"Экспериментальный" | |
], value="Свой") | |
with gr.Tab("Дополнительные настройки"): | |
with gr.Row(): | |
width_slider = gr.Slider(label="Ширина", minimum=80, maximum=4000, value=1024) | |
height_slider = gr.Slider(label="Высота", minimum=80, maximum=4000, value=1024) | |
with gr.Row(): | |
seed_slider = gr.Slider(label="Сид", minimum=-1, maximum=999999, value=-1, step=1) | |
create_button = gr.Button("Создать") | |
output_image = gr.Image(label="Изображение", type="pil", show_share_button=False) | |
create_button.click( | |
fn=generate_image, | |
inputs=[prompt_input, style_radio, width_slider, height_slider, seed_slider], | |
outputs=[output_image], | |
queue=True, | |
concurrency_limit=250 | |
) | |
demo.queue(max_size=250).launch(show_api=False, share=False) | |