Spaces:
Running
Running
| import os | |
| import random | |
| import requests | |
| import tempfile | |
| from deep_translator import GoogleTranslator | |
| from langdetect import detect | |
| from gradio_client import Client, handle_file | |
| import gradio as gr | |
| from PIL import Image | |
| from io import BytesIO | |
| # Функция для получения случайного API ключа | |
| def get_random_api_key(): | |
| keys = os.getenv("KEYS", "").split(",") | |
| if keys and keys[0]: # Проверяем, что KEYS установлен и не пуст | |
| return random.choice(keys).strip() | |
| else: | |
| raise ValueError("API ключи не найдены. Пожалуйста, установите переменную окружения KEYS.") | |
| # Ссылка на файл CSS | |
| css_url = "https://neurixyufi-aihub.static.hf.space/style.css" | |
| # Получение CSS по ссылке (с обработкой ошибок) | |
| try: | |
| response = requests.get(css_url, timeout=10) # Добавлено timeout | |
| response.raise_for_status() | |
| css = response.text + " h1{text-align:center}" | |
| except requests.exceptions.RequestException as e: | |
| print(f"Ошибка при загрузке CSS: {e}") | |
| css = " h1{text-align:center}" # Используем базовый стиль | |
| # Функция для обработки изображения и текста через API | |
| def process_image_and_text(image, text): | |
| try: | |
| # Проверка и перевод текста на английский, если необходимо | |
| language = detect(text) | |
| if language != 'en': | |
| text = GoogleTranslator(source=language, target='en').translate(text) | |
| # Сохранение изображения во временный файл | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".png") as temp_file: | |
| image.save(temp_file.name) | |
| image_path = temp_file.name | |
| # Загрузка изображения в кеш и получение ссылки | |
| image_url = handle_file(image_path) | |
| # Получение случайного API ключа | |
| api_key = get_random_api_key() | |
| # Инициализация клиента (обработка ошибок) | |
| client = Client("Yuanshi/OminiControl", hf_token=api_key) | |
| result = client.predict(image=image_url, text=text, api_name="/predict") | |
| if result is None: | |
| return None | |
| elif isinstance(result, Image.Image): | |
| return result | |
| elif isinstance(result, str) and result.startswith("/tmp"): | |
| try: | |
| return Image.open(result) | |
| except FileNotFoundError: | |
| print(f"Файл не найден: {result}") | |
| return None | |
| except Exception as e: | |
| print(f"Ошибка при открытии файла: {e}, путь: {result}") | |
| return None | |
| else: | |
| print(f"Неизвестный тип результата: {type(result)}, данные: {result}") | |
| return None | |
| except Exception as e: | |
| print(f"Ошибка при обработке: {e}") | |
| return None | |
| # Функция для загрузки изображения из URL | |
| def load_image_from_url(url): | |
| try: | |
| response = requests.get(url, timeout=10) | |
| response.raise_for_status() | |
| image = Image.open(BytesIO(response.content)) | |
| return image | |
| except Exception as e: | |
| print(f"Ошибка при загрузке изображения из URL {url}: {e}") | |
| return None | |
| # Функция для получения примеров | |
| def get_samples(): | |
| sample_list = [ | |
| { | |
| "image": "https://huggingface.co/spaces/NeurixYUFI/Omini/resolve/main/img/pear.png", | |
| "text": "Луна, данный предмет лежит на поверхности луны — груша. На заднем плане Земля возвышается на переднем плане, ультра реализм", | |
| }, | |
| { | |
| "image": "https://huggingface.co/spaces/NeurixYUFI/Omini/resolve/main/img/oranges.jpg", | |
| "text": "Очень крупный план этого предмета. Он размещен на деревянном столе. Фон — темная комната, включен телевизор, на экране кулинарное шоу. На экране надпись: «Neurix»", | |
| }, | |
| { | |
| "image": "https://huggingface.co/spaces/NeurixYUFI/Omini/resolve/main/img/rc_car.jpg", | |
| "text": "Кинематографичный кадр. На Луне эта вещь едет по лунной поверхности. На заднем плане видна гигантская Земля", | |
| }, | |
| ] | |
| samples_with_images = [] | |
| for sample in sample_list: | |
| image_url = sample["image"] | |
| image = load_image_from_url(image_url) | |
| if image: | |
| samples_with_images.append([image, sample["text"]]) | |
| return samples_with_images | |
| # Интерфейс Gradio с использованием gr.Blocks | |
| with gr.Blocks(css=css) as demo: | |
| gr.Markdown("# Замена фона") | |
| with gr.Row(): | |
| with gr.Column(): | |
| image_input = gr.Image(type="pil", label="Входное изображение") | |
| text_input = gr.Textbox(lines=2, label="Описание") | |
| submit_button = gr.Button("Обработать", variant="primary") # Добавили variant='primary' | |
| with gr.Column(): | |
| output_image = gr.Image(type="pil", label="Результат", show_share_button=False) | |
| submit_button.click( | |
| fn=process_image_and_text, | |
| inputs=[image_input, text_input], | |
| outputs=output_image, | |
| concurrency_limit=250 | |
| ) | |
| # Добавление примеров | |
| examples = get_samples() | |
| if examples: | |
| with gr.Row(): | |
| gr.Examples(label="Примеры", examples=examples, fn=process_image_and_text, inputs=[image_input, text_input], outputs=output_image) | |
| # Запуск интерфейса | |
| if __name__ == "__main__": | |
| demo.launch( | |
| show_api=False, | |
| share=False | |
| ) |