img2txt / app.py
Rooni's picture
Update app.py
2e4a93b verified
import gradio as gr
import requests
import os
import random
from io import BytesIO
from PIL import Image
import base64
# Получение списка API ключей из переменной окружения
api_keys = os.getenv("HF_API_KEYS", "").split(",")
if not api_keys or not all(api_keys):
raise ValueError("HF_API_KEYS environment variable is not set or contains invalid keys.")
# Выбор случайного API ключа
api_key = random.choice(api_keys)
headers = {
"Authorization": f"Bearer {api_key}"
}
# Ссылка на API Hugging Face
api_url = "https://api-inference.huggingface.co/models/Salesforce/blip-image-captioning-large"
# Функция для генерации описания изображения
def caption_image(image):
if image is None:
return ""
# Преобразование изображения в байтовый формат
buffered = BytesIO()
try:
image.save(buffered, format="PNG") # Используем PNG
except Exception as e:
return f"Error: Failed to save image - {str(e)}"
image_bytes = buffered.getvalue()
# Логирование размера байтового объекта
print(f"Image size: {len(image_bytes)} bytes")
# Отправка изображения в base64
image_base64 = base64.b64encode(image_bytes).decode('utf-8')
data = {"inputs": image_base64}
response = requests.post(api_url, headers=headers, json=data, timeout=150)
# Логирование ответа
if response.status_code == 200:
return response.json()[0]['generated_text']
else:
print(f"Error: {response.status_code} - {response.text}")
return f"Error: {response.status_code} - {response.text}"
# Ссылка на файл CSS (опционально)
css_url = "https://neurixyufi-aihub.static.hf.space/style.css"
try:
response = requests.get(css_url)
css = response.text + ".gradio-container{max-width: 700px !important} h1{text-align:center}"
except requests.exceptions.RequestException as e:
print(f"Warning: Could not load CSS from {css_url}: {e}")
# Создание интерфейса Gradio
with gr.Blocks(css=css) as demo:
gr.Markdown("# Описание изображения")
with gr.Row():
with gr.Column():
image_input = gr.Image(type="pil", label="Ваше изображение")
with gr.Column():
caption_output = gr.Textbox(label="Описание")
image_input.change(fn=caption_image, inputs=image_input, outputs=caption_output)
# Запуск интерфейса
demo.launch(share=False, debug=False, show_error=False, show_api=False).queue(max_size=150)