Rooni commited on
Commit
0478aa2
·
verified ·
1 Parent(s): ca1cdb9

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +111 -0
app.py ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import random
3
+ import sys
4
+ import requests
5
+ from typing import Sequence, Mapping, Any, Union
6
+ import torch
7
+ import gradio as gr
8
+ from deep_translator import GoogleTranslator
9
+ from langdetect import detect
10
+ from gradio_client import Client, handle_file
11
+
12
+ # Функция для получения случайного API ключа
13
+ def get_random_api_key():
14
+ keys = os.getenv("KEYS", "").split(",")
15
+ if keys and keys[0]: # Проверяем, установлены ли ключи и не пусты ли они
16
+ return random.choice(keys).strip()
17
+ else:
18
+ raise ValueError("API ключи не найдены. Пожалуйста, установите переменную окружения KEYS.")
19
+
20
+ # Ссылка на файл CSS
21
+ css_url = "https://neurixyufi-aihub.static.hf.space/style.css"
22
+
23
+ # Получение CSS по ссылке
24
+ try:
25
+ response = requests.get(css_url)
26
+ response.raise_for_status() # Поднимаем исключение, если статус ответа не 200
27
+ css = response.text + " h1{text-align:center} /* Ещё стили, если они есть в оригинале */"
28
+ except requests.exceptions.RequestException as e:
29
+ print(f"Ошибка при загрузке CSS: {e}")
30
+ css = " h1{text-align:center} /* Ещё стили, если они есть в оригинале */" # Используем базовый стиль, если загрузка CSS не удалась
31
+
32
+ # Функция для перевода текста на английский
33
+ def translate_to_english(prompt):
34
+ language = detect(prompt)
35
+ if language != 'en':
36
+ prompt = GoogleTranslator(source=language, target='en').translate(prompt)
37
+ return prompt
38
+
39
+ # Функция для загрузки изображений в кеш и отправки ссылки на API
40
+ def upload_image_to_hf_cache(image):
41
+ if isinstance(image, dict) and 'url' in image:
42
+ return image['url']
43
+ elif isinstance(image, str):
44
+ return image
45
+ else:
46
+ raise ValueError("Неподдерживаемый формат изображения")
47
+
48
+ # Функция для генерации изображения через API
49
+ @spaces.GPU
50
+ def generate_image(prompt, structure_image, style_image, depth_strength=15, style_strength=0.5, progress=gr.Progress(track_tqdm=True)) -> str:
51
+ """Основная функция генерации изображения."""
52
+ prompt = translate_to_english(prompt)
53
+ structure_image_url = upload_image_to_hf_cache(structure_image)
54
+ style_image_url = upload_image_to_hf_cache(style_image)
55
+
56
+ client = Client("multimodalart/flux-style-shaping", huggingface_token=get_random_api_key())
57
+ result = client.predict(
58
+ prompt=prompt,
59
+ structure_image=handle_file(structure_image_url),
60
+ style_image=handle_file(style_image_url),
61
+ depth_strength=depth_strength,
62
+ style_strength=style_strength,
63
+ api_name="/generate_image"
64
+ )
65
+ return result['url']
66
+
67
+ # Примеры для Gradio
68
+ examples = [
69
+ ["", "https://huggingface.co/spaces/multimodalart/flux-style-shaping/resolve/main/mona.png", "https://huggingface.co/spaces/multimodalart/flux-style-shaping/resolve/main/receita-tacos.webp", 15, 0.6],
70
+ ["женщина смотрит на дом, который горит", "https://huggingface.co/spaces/multimodalart/flux-style-shaping/resolve/main/disaster_girl.png", "https://huggingface.co/spaces/multimodalart/flux-style-shaping/resolve/main/abaporu.jpg", 15, 0.15],
71
+ ["история города Истанбул с птичьего полёта", "https://huggingface.co/spaces/multimodalart/flux-style-shaping/resolve/main/natasha.png", "https://huggingface.co/spaces/multimodalart/flux-style-shaping/resolve/main/istambul.jpg", 15, 0.5],
72
+ ]
73
+
74
+ output_image = gr.Image(label="Сгенерированное изображение", show_share_button=False)
75
+
76
+ with gr.Blocks(css=css) as app:
77
+ gr.Markdown("# FLUX Style Shaping")
78
+ gr.Markdown("FLUX[dev] Redux + FLUX[dev] Depth ComfyUI workflow от [Nathan Shipley](https://x.com/CitizenPlain) работает напрямую на Gradio. [workflow](https://gist.github.com/nathanshipley/7a9ac1901adde76feebe58d558026f68) - [как конвертировать любой comfy workflow в gradio (скоро)](#)")
79
+ with gr.Row():
80
+ with gr.Column():
81
+ prompt_input = gr.Textbox(label="Запрос", placeholder="Введите ваш запрос здесь...")
82
+ with gr.Row():
83
+ with gr.Group():
84
+ structure_image = gr.Image(label="Изображение структуры", type="filepath", source="upload", tool="editor")
85
+ depth_strength = gr.Slider(minimum=0, maximum=50, value=15, label="Сила глубины")
86
+ with gr.Group():
87
+ style_image = gr.Image(label="Изображение стиля", type="filepath", source="upload", tool="editor")
88
+ style_strength = gr.Slider(minimum=0, maximum=1, value=0.5, label="Сила стиля")
89
+ generate_btn = gr.Button("Создать", variant='primary')
90
+
91
+ gr.Examples(
92
+ examples=examples,
93
+ inputs=[prompt_input, structure_image, style_image, depth_strength, style_strength],
94
+ outputs=[output_image],
95
+ fn=generate_image,
96
+ cache_examples=True,
97
+ cache_mode="lazy",
98
+ concurrency_limit=25
99
+ )
100
+
101
+ with gr.Column():
102
+ output_image.render()
103
+ generate_btn.click(
104
+ fn=generate_image,
105
+ inputs=[prompt_input, structure_image, style_image, depth_strength, style_strength],
106
+ outputs=[output_image],
107
+ concurrency_limit=25
108
+ )
109
+
110
+ if __name__ == "__main__":
111
+ app.launch(show_api=False, share=False)