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://api.neurix.ru/imggen?prompt={encoded_prompt}&width={width}&height={height}&seed={seed}&nologo=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/styles.css" | |
| # Получение CSS по ссылке | |
| response = requests.get(css_url) | |
| css = response.text + ".gradio-container{max-width: 700px !important; margin: 0 auto;} 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) | |