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 | |
) |