Update app.py
Browse files
app.py
CHANGED
@@ -27,7 +27,7 @@ client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")
|
|
27 |
model = fasterrcnn_resnet50_fpn(weights="DEFAULT")
|
28 |
model.eval()
|
29 |
|
30 |
-
#
|
31 |
def process_pdf(file):
|
32 |
pdf_reader = PyPDF2.PdfReader(file)
|
33 |
text = ""
|
@@ -35,12 +35,10 @@ def process_pdf(file):
|
|
35 |
text += page.extract_text()
|
36 |
return text
|
37 |
|
38 |
-
# Функция для обработки изображений
|
39 |
def process_image(file):
|
40 |
image = Image.open(file)
|
41 |
return f"Изображение: {image.size[0]}x{image.size[1]} пикселей, формат: {image.format}"
|
42 |
|
43 |
-
# Функция для обработки видео
|
44 |
def process_video(file):
|
45 |
cap = cv2.VideoCapture(file.name)
|
46 |
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
@@ -48,60 +46,45 @@ def process_video(file):
|
|
48 |
cap.release()
|
49 |
return f"Видео: длительность {duration:.2f} секунд, {frame_count} кадров"
|
50 |
|
51 |
-
# Функция для обработки аудио
|
52 |
def process_audio(file):
|
53 |
audio = AudioSegment.from_file(file)
|
54 |
return f"Аудио: длительность {len(audio) / 1000:.2f} секунд, частота {audio.frame_rate} Гц"
|
55 |
|
56 |
-
# Функция для обработки текстового файла
|
57 |
def process_txt(file):
|
58 |
with open(file.name, "r", encoding="utf-8") as f:
|
59 |
text = f.read()
|
60 |
return text
|
61 |
|
62 |
-
# Функция для удаления фона с изображения
|
63 |
def remove_background(image):
|
64 |
if image is None:
|
65 |
return "**Ошибка:** Чем я буду удалять, если ты не загрузил изображение?"
|
66 |
output = remove(image)
|
67 |
return output
|
68 |
|
69 |
-
# Функция для определения количества объектов на изображении
|
70 |
def count_objects(image):
|
71 |
if image is None:
|
72 |
return "Изображение не загружено."
|
73 |
-
|
74 |
-
# Преобразование изображения в формат, подходящий для модели
|
75 |
img = Image.open(image.name).convert("RGB")
|
76 |
img_tensor = F.to_tensor(img).unsqueeze(0)
|
77 |
-
|
78 |
-
# Обнаружение объектов
|
79 |
with torch.no_grad():
|
80 |
predictions = model(img_tensor)
|
81 |
-
|
82 |
-
# Подсчет количества объектов
|
83 |
num_objects = len(predictions[0]['labels'])
|
84 |
return f"Количество объектов на изображении: {num_objects}"
|
85 |
|
86 |
-
# Функция для конвертации изображения
|
87 |
def convert_image(image, target_format):
|
88 |
if image is None:
|
89 |
return None
|
90 |
img = Image.open(image.name)
|
91 |
-
|
92 |
-
# Создаем временный файл
|
93 |
with tempfile.NamedTemporaryFile(delete=False, suffix=f".{target_format.lower()}") as tmp_file:
|
94 |
img.save(tmp_file, format=target_format)
|
95 |
return tmp_file.name
|
96 |
|
97 |
-
# Функция для определения языка текста
|
98 |
def detect_language(text):
|
99 |
try:
|
100 |
return detect(text)
|
101 |
except:
|
102 |
-
return "en"
|
103 |
|
104 |
-
# Функция для обработки сообщений, истории и файлов
|
105 |
def respond(
|
106 |
message,
|
107 |
history: list[tuple[str, str]],
|
@@ -111,7 +94,6 @@ def respond(
|
|
111 |
top_p,
|
112 |
file=None,
|
113 |
):
|
114 |
-
# Если загружен файл, обрабатываем его
|
115 |
if file is not None:
|
116 |
file_type = file.name.split(".")[-1].lower()
|
117 |
if file_type == "pdf":
|
@@ -128,29 +110,21 @@ def respond(
|
|
128 |
file_info = "Неизвестный тип файла"
|
129 |
message += f"\n[Пользователь загрузил файл: {file.name}]\n{file_info}"
|
130 |
|
131 |
-
# Определяем язык сообщения
|
132 |
language = detect_language(message)
|
133 |
-
|
134 |
-
# Добавляем системное сообщение с учетом языка
|
135 |
if language == "ru":
|
136 |
system_message = "Вы дружелюбный чат-бот, который понимает русский язык."
|
137 |
else:
|
138 |
system_message = "You are a friendly chatbot."
|
139 |
|
140 |
-
# Добавляем системное сообщение
|
141 |
messages = [{"role": "system", "content": system_message}]
|
142 |
-
|
143 |
-
# Добавляем историю сообщений
|
144 |
for val in history:
|
145 |
if val[0]:
|
146 |
messages.append({"role": "user", "content": val[0]})
|
147 |
if val[1]:
|
148 |
messages.append({"role": "assistant", "content": val[1]})
|
149 |
|
150 |
-
# Добавляем текущее сообщение пользователя
|
151 |
messages.append({"role": "user", "content": message})
|
152 |
|
153 |
-
# Генерация ответа с использованием модели HuggingFaceH4/zephyr-7b-beta
|
154 |
response = ""
|
155 |
for message in client.chat_completion(
|
156 |
messages,
|
@@ -163,31 +137,24 @@ def respond(
|
|
163 |
response += token
|
164 |
yield response
|
165 |
|
166 |
-
# Функция для сброса истории чата
|
167 |
def reset_chat():
|
168 |
return []
|
169 |
|
170 |
-
# Функция для анализа текстового файла
|
171 |
def analyze_txt(file):
|
172 |
if file is None:
|
173 |
return "**Ошибка:** Ты не загрузил текстовый файл, а значит я не буду анализировать пустой файл."
|
174 |
text = process_txt(file)
|
175 |
return f"Содержимое файла:\n{text}"
|
176 |
|
177 |
-
# Функция для изменения размера изображения
|
178 |
def resize_image(image, width: int, height: int):
|
179 |
if image is None:
|
180 |
return None
|
181 |
-
|
182 |
img = Image.open(image.name)
|
183 |
resized_img = img.resize((width, height))
|
184 |
-
|
185 |
-
# Сохраняем изображение во временный файл
|
186 |
with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as tmp_file:
|
187 |
resized_img.save(tmp_file.name)
|
188 |
return tmp_file.name
|
189 |
|
190 |
-
# Функция для перевода текста
|
191 |
def translate_text(text: str, target_language: str):
|
192 |
translator = Translator()
|
193 |
try:
|
@@ -196,8 +163,63 @@ def translate_text(text: str, target_language: str):
|
|
196 |
except Exception as e:
|
197 |
return f"Ошибка перевода: {str(e)}"
|
198 |
|
199 |
-
#
|
200 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
201 |
# Заголовок с изображением
|
202 |
gr.HTML("""
|
203 |
<div style="text-align: center;">
|
@@ -208,20 +230,20 @@ with gr.Blocks() as demo:
|
|
208 |
# Felguk News
|
209 |
gr.Markdown("""
|
210 |
## Felguk News
|
211 |
-
**Последнее обновление:**
|
212 |
- Добавлена поддержка новых форматов файлов.
|
213 |
- Улучшена производительность обработки изображений.
|
214 |
- Исправлены ошибки в переводе текста.
|
215 |
""")
|
216 |
|
217 |
gr.Markdown("Чат-бот Felguk v0. Отвечает на том же языке, на котором вы написали. Задавайте вопросы и загружайте файлы (PDF, изображения, видео, аудио, txt)!")
|
218 |
-
|
219 |
# Кнопка "Новый чат"
|
220 |
with gr.Row():
|
221 |
new_chat_button = gr.Button("Новый чат", variant="secondary")
|
222 |
|
223 |
# Felguk Tools: Отдельные инструменты
|
224 |
-
with gr.
|
225 |
# Вкладка Txt Analyzer
|
226 |
with gr.Tab("Анализатор текста"):
|
227 |
gr.Markdown("## Анализатор текста")
|
@@ -296,7 +318,7 @@ with gr.Blocks() as demo:
|
|
296 |
step=0.05,
|
297 |
label="Top-p (nucleus sampling)",
|
298 |
),
|
299 |
-
gr.File(label="Загрузите файл (опционально)"),
|
300 |
],
|
301 |
)
|
302 |
|
|
|
27 |
model = fasterrcnn_resnet50_fpn(weights="DEFAULT")
|
28 |
model.eval()
|
29 |
|
30 |
+
# Функции для обработки данных (остаются без изменений)
|
31 |
def process_pdf(file):
|
32 |
pdf_reader = PyPDF2.PdfReader(file)
|
33 |
text = ""
|
|
|
35 |
text += page.extract_text()
|
36 |
return text
|
37 |
|
|
|
38 |
def process_image(file):
|
39 |
image = Image.open(file)
|
40 |
return f"Изображение: {image.size[0]}x{image.size[1]} пикселей, формат: {image.format}"
|
41 |
|
|
|
42 |
def process_video(file):
|
43 |
cap = cv2.VideoCapture(file.name)
|
44 |
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
|
|
46 |
cap.release()
|
47 |
return f"Видео: длительность {duration:.2f} секунд, {frame_count} кадров"
|
48 |
|
|
|
49 |
def process_audio(file):
|
50 |
audio = AudioSegment.from_file(file)
|
51 |
return f"Аудио: длительность {len(audio) / 1000:.2f} секунд, частота {audio.frame_rate} Гц"
|
52 |
|
|
|
53 |
def process_txt(file):
|
54 |
with open(file.name, "r", encoding="utf-8") as f:
|
55 |
text = f.read()
|
56 |
return text
|
57 |
|
|
|
58 |
def remove_background(image):
|
59 |
if image is None:
|
60 |
return "**Ошибка:** Чем я буду удалять, если ты не загрузил изображение?"
|
61 |
output = remove(image)
|
62 |
return output
|
63 |
|
|
|
64 |
def count_objects(image):
|
65 |
if image is None:
|
66 |
return "Изображение не загружено."
|
|
|
|
|
67 |
img = Image.open(image.name).convert("RGB")
|
68 |
img_tensor = F.to_tensor(img).unsqueeze(0)
|
|
|
|
|
69 |
with torch.no_grad():
|
70 |
predictions = model(img_tensor)
|
|
|
|
|
71 |
num_objects = len(predictions[0]['labels'])
|
72 |
return f"Количество объектов на изображении: {num_objects}"
|
73 |
|
|
|
74 |
def convert_image(image, target_format):
|
75 |
if image is None:
|
76 |
return None
|
77 |
img = Image.open(image.name)
|
|
|
|
|
78 |
with tempfile.NamedTemporaryFile(delete=False, suffix=f".{target_format.lower()}") as tmp_file:
|
79 |
img.save(tmp_file, format=target_format)
|
80 |
return tmp_file.name
|
81 |
|
|
|
82 |
def detect_language(text):
|
83 |
try:
|
84 |
return detect(text)
|
85 |
except:
|
86 |
+
return "en"
|
87 |
|
|
|
88 |
def respond(
|
89 |
message,
|
90 |
history: list[tuple[str, str]],
|
|
|
94 |
top_p,
|
95 |
file=None,
|
96 |
):
|
|
|
97 |
if file is not None:
|
98 |
file_type = file.name.split(".")[-1].lower()
|
99 |
if file_type == "pdf":
|
|
|
110 |
file_info = "Неизвестный тип файла"
|
111 |
message += f"\n[Пользователь загрузил файл: {file.name}]\n{file_info}"
|
112 |
|
|
|
113 |
language = detect_language(message)
|
|
|
|
|
114 |
if language == "ru":
|
115 |
system_message = "Вы дружелюбный чат-бот, который понимает русский язык."
|
116 |
else:
|
117 |
system_message = "You are a friendly chatbot."
|
118 |
|
|
|
119 |
messages = [{"role": "system", "content": system_message}]
|
|
|
|
|
120 |
for val in history:
|
121 |
if val[0]:
|
122 |
messages.append({"role": "user", "content": val[0]})
|
123 |
if val[1]:
|
124 |
messages.append({"role": "assistant", "content": val[1]})
|
125 |
|
|
|
126 |
messages.append({"role": "user", "content": message})
|
127 |
|
|
|
128 |
response = ""
|
129 |
for message in client.chat_completion(
|
130 |
messages,
|
|
|
137 |
response += token
|
138 |
yield response
|
139 |
|
|
|
140 |
def reset_chat():
|
141 |
return []
|
142 |
|
|
|
143 |
def analyze_txt(file):
|
144 |
if file is None:
|
145 |
return "**Ошибка:** Ты не загрузил текстовый файл, а значит я не буду анализировать пустой файл."
|
146 |
text = process_txt(file)
|
147 |
return f"Содержимое файла:\n{text}"
|
148 |
|
|
|
149 |
def resize_image(image, width: int, height: int):
|
150 |
if image is None:
|
151 |
return None
|
|
|
152 |
img = Image.open(image.name)
|
153 |
resized_img = img.resize((width, height))
|
|
|
|
|
154 |
with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as tmp_file:
|
155 |
resized_img.save(tmp_file.name)
|
156 |
return tmp_file.name
|
157 |
|
|
|
158 |
def translate_text(text: str, target_language: str):
|
159 |
translator = Translator()
|
160 |
try:
|
|
|
163 |
except Exception as e:
|
164 |
return f"Ошибка перевода: {str(e)}"
|
165 |
|
166 |
+
# Кастомные CSS-стили
|
167 |
+
custom_css = """
|
168 |
+
/* Основной фон */
|
169 |
+
body, .gradio-container {
|
170 |
+
background-color: #f5f5f5;
|
171 |
+
font-family: 'Arial', sans-serif;
|
172 |
+
}
|
173 |
+
|
174 |
+
/* Заголовок */
|
175 |
+
h1, h2, h3 {
|
176 |
+
color: #333;
|
177 |
+
font-weight: bold;
|
178 |
+
}
|
179 |
+
|
180 |
+
/* Кнопки */
|
181 |
+
button {
|
182 |
+
background-color: #4CAF50;
|
183 |
+
color: white;
|
184 |
+
border: none;
|
185 |
+
padding: 10px 20px;
|
186 |
+
border-radius: 5px;
|
187 |
+
cursor: pointer;
|
188 |
+
}
|
189 |
+
|
190 |
+
button:hover {
|
191 |
+
background-color: #45a049;
|
192 |
+
}
|
193 |
+
|
194 |
+
/* Вкладки */
|
195 |
+
.tab-button {
|
196 |
+
background-color: #e0e0e0;
|
197 |
+
color: #333;
|
198 |
+
border-radius: 5px 5px 0 0;
|
199 |
+
}
|
200 |
+
|
201 |
+
.tab-button.selected {
|
202 |
+
background-color: #4CAF50;
|
203 |
+
color: white;
|
204 |
+
}
|
205 |
+
|
206 |
+
/* Текстовые поля */
|
207 |
+
input, textarea {
|
208 |
+
border: 1px solid #ccc;
|
209 |
+
border-radius: 5px;
|
210 |
+
padding: 10px;
|
211 |
+
width: 100%;
|
212 |
+
}
|
213 |
+
|
214 |
+
/* Изображения */
|
215 |
+
img {
|
216 |
+
border-radius: 10px;
|
217 |
+
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
218 |
+
}
|
219 |
+
"""
|
220 |
+
|
221 |
+
# Создание интерфейса с кастомными стилями
|
222 |
+
with gr.Blocks(css=custom_css) as demo:
|
223 |
# Заголовок с изображением
|
224 |
gr.HTML("""
|
225 |
<div style="text-align: center;">
|
|
|
230 |
# Felguk News
|
231 |
gr.Markdown("""
|
232 |
## Felguk News
|
233 |
+
**Последнее обновление:** 2024-01-03
|
234 |
- Добавлена поддержка новых форматов файлов.
|
235 |
- Улучшена производительность обработки изображений.
|
236 |
- Исправлены ошибки в переводе текста.
|
237 |
""")
|
238 |
|
239 |
gr.Markdown("Чат-бот Felguk v0. Отвечает на том же языке, на котором вы написали. Задавайте вопросы и загружайте файлы (PDF, изображения, видео, аудио, txt)!")
|
240 |
+
|
241 |
# Кнопка "Новый чат"
|
242 |
with gr.Row():
|
243 |
new_chat_button = gr.Button("Новый чат", variant="secondary")
|
244 |
|
245 |
# Felguk Tools: Отдельные инструменты
|
246 |
+
with gr.Tabs():
|
247 |
# Вкладка Txt Analyzer
|
248 |
with gr.Tab("Анализатор текста"):
|
249 |
gr.Markdown("## Анализатор текста")
|
|
|
318 |
step=0.05,
|
319 |
label="Top-p (nucleus sampling)",
|
320 |
),
|
321 |
+
gr.File(label="Загрузите файл (опционально)"),
|
322 |
],
|
323 |
)
|
324 |
|