Yermek68 commited on
Commit
206e908
·
verified ·
1 Parent(s): 0a66e53

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +43 -41
app.py CHANGED
@@ -7,13 +7,11 @@ from docx import Document
7
  from fpdf import FPDF
8
  from langdetect import detect
9
  import urllib.request
10
- import gradio.themes as gt
11
 
12
- # === 🗂️ Создание папок и установка шрифта ===
13
  os.makedirs("/app/models", exist_ok=True)
14
  FONT_PATH = "DejaVuSans.ttf"
15
 
16
- # Если шрифт отсутствует — скачиваем
17
  if not os.path.exists(FONT_PATH):
18
  print("⬇️ Загружаю шрифт DejaVuSans.ttf ...")
19
  urllib.request.urlretrieve(
@@ -21,7 +19,7 @@ if not os.path.exists(FONT_PATH):
21
  FONT_PATH
22
  )
23
 
24
- # === ⚙️ Загрузка моделей один раз при запуске ===
25
  def load_model(task, model_name):
26
  print(f"🔹 Загружается модель: {model_name}")
27
  return pipeline(task, model=model_name, cache_dir="/app/models")
@@ -32,13 +30,12 @@ summarizers = {
32
  "kz": load_model("summarization", "csebuetnlp/mT5_multilingual_XLSum")
33
  }
34
 
35
- # === 📄 Функция чтения текстов из файлов ===
36
  def read_file(file):
37
  if not file:
38
  return ""
39
  filename = file.name.lower()
40
  text = ""
41
-
42
  try:
43
  if filename.endswith(".pdf"):
44
  with pdfplumber.open(file.name) as pdf:
@@ -52,7 +49,6 @@ def read_file(file):
52
  text = file.read().decode("utf-8", errors="ignore")
53
  except Exception as e:
54
  return f"⚠️ Ошибка при чтении файла: {e}"
55
-
56
  return text.strip()
57
 
58
  # === 🌐 Определение языка ===
@@ -68,18 +64,17 @@ def detect_language(text):
68
  except:
69
  return "en"
70
 
71
- # === 🧠 Суммаризация текста ===
72
  def summarize_text(text):
73
  if not text or len(text) < 50:
74
  return "⚠️ Недостаточно текста для анализа.", "❌", "❌", 0, 0, "❌"
75
 
76
  lang = detect_language(text)
77
  model = summarizers.get(lang, summarizers["en"])
78
-
79
  flags = {"ru": "🇷🇺 Русский", "kz": "🇰🇿 Қазақ тілі", "en": "🇬🇧 English"}
80
  lang_label = flags.get(lang, "🌍 Unknown")
81
-
82
  model_label = model.model.name_or_path if hasattr(model.model, "name_or_path") else "Custom"
 
83
  chunk_size = 2500
84
  overlap = 200
85
  summaries = []
@@ -99,7 +94,7 @@ def summarize_text(text):
99
 
100
  return summary, lang_label, model_label, src_len, sum_len, f"{compression}%"
101
 
102
- # === 💾 Сохранение файлов ===
103
  def save_summary_as_txt(summary_text):
104
  path = "summary.txt"
105
  with open(path, "w", encoding="utf-8") as f:
@@ -124,7 +119,7 @@ def save_summary_as_pdf(summary_text):
124
  pdf.output(path)
125
  return path
126
 
127
- # === 🚀 Главная функция обработки ===
128
  def summarize_file(file):
129
  text = read_file(file)
130
  if text.startswith("⚠️"):
@@ -141,34 +136,41 @@ def summarize_file(file):
141
 
142
  return summary, lang_label, model_label, src_len, sum_len, compression, txt_path, docx_path, pdf_path
143
 
144
- # === 🎨 Интерфейс Gradio ===
145
- custom_theme = gt.Default(
146
- primary_hue="purple",
147
- secondary_hue="violet",
148
- ).set(
149
- body_background_fill="#f8f6ff",
150
- button_primary_background_fill="linear-gradient(90deg, #7e3ff2, #c084fc)",
151
- button_primary_background_fill_hover="linear-gradient(90deg, #6b21a8, #9333ea)",
152
- )
153
-
154
- demo = gr.Interface(
155
- fn=summarize_file,
156
- inputs=gr.File(label="📂 Загрузите документ (.pdf, .docx, .txt)"),
157
- outputs=[
158
- gr.Textbox(label="🧾 Краткое резюме"),
159
- gr.Textbox(label="🌍 Определённый язык"),
160
- gr.Textbox(label="🧠 Используемая модель"),
161
- gr.Number(label="📄 Длина исходного текста"),
162
- gr.Number(label="📝 Длина резюме"),
163
- gr.Textbox(label="📉 Степень сокращения"),
164
- gr.File(label="📄 Скачать TXT"),
165
- gr.File(label="📘 Скачать DOCX"),
166
- gr.File(label="📕 Скачать PDF"),
167
- ],
168
- title="🧠 Eroha Summarizer PRO (Автономная версия)",
169
- description="🚀 Определяет язык (🇷🇺 / 🇰🇿 / 🇬🇧), создаёт краткое резюме и сохраняет в TXT, DOCX, PDF с поддержкой кириллицы.",
170
- theme=custom_theme,
171
- allow_flagging="never"
172
- )
 
 
 
 
 
 
 
173
 
174
  demo.launch(server_name="0.0.0.0", server_port=7860)
 
7
  from fpdf import FPDF
8
  from langdetect import detect
9
  import urllib.request
 
10
 
11
+ # === 🗂️ Подготовка окружения и шрифта ===
12
  os.makedirs("/app/models", exist_ok=True)
13
  FONT_PATH = "DejaVuSans.ttf"
14
 
 
15
  if not os.path.exists(FONT_PATH):
16
  print("⬇️ Загружаю шрифт DejaVuSans.ttf ...")
17
  urllib.request.urlretrieve(
 
19
  FONT_PATH
20
  )
21
 
22
+ # === ⚙️ Загрузка моделей ===
23
  def load_model(task, model_name):
24
  print(f"🔹 Загружается модель: {model_name}")
25
  return pipeline(task, model=model_name, cache_dir="/app/models")
 
30
  "kz": load_model("summarization", "csebuetnlp/mT5_multilingual_XLSum")
31
  }
32
 
33
+ # === 📄 Чтение документов ===
34
  def read_file(file):
35
  if not file:
36
  return ""
37
  filename = file.name.lower()
38
  text = ""
 
39
  try:
40
  if filename.endswith(".pdf"):
41
  with pdfplumber.open(file.name) as pdf:
 
49
  text = file.read().decode("utf-8", errors="ignore")
50
  except Exception as e:
51
  return f"⚠️ Ошибка при чтении файла: {e}"
 
52
  return text.strip()
53
 
54
  # === 🌐 Определение языка ===
 
64
  except:
65
  return "en"
66
 
67
+ # === 🧠 Суммаризация ===
68
  def summarize_text(text):
69
  if not text or len(text) < 50:
70
  return "⚠️ Недостаточно текста для анализа.", "❌", "❌", 0, 0, "❌"
71
 
72
  lang = detect_language(text)
73
  model = summarizers.get(lang, summarizers["en"])
 
74
  flags = {"ru": "🇷🇺 Русский", "kz": "🇰🇿 Қазақ тілі", "en": "🇬🇧 English"}
75
  lang_label = flags.get(lang, "🌍 Unknown")
 
76
  model_label = model.model.name_or_path if hasattr(model.model, "name_or_path") else "Custom"
77
+
78
  chunk_size = 2500
79
  overlap = 200
80
  summaries = []
 
94
 
95
  return summary, lang_label, model_label, src_len, sum_len, f"{compression}%"
96
 
97
+ # === 💾 Сохранение результатов ===
98
  def save_summary_as_txt(summary_text):
99
  path = "summary.txt"
100
  with open(path, "w", encoding="utf-8") as f:
 
119
  pdf.output(path)
120
  return path
121
 
122
+ # === 🚀 Основная функция ===
123
  def summarize_file(file):
124
  text = read_file(file)
125
  if text.startswith("⚠️"):
 
136
 
137
  return summary, lang_label, model_label, src_len, sum_len, compression, txt_path, docx_path, pdf_path
138
 
139
+ # === 🧩 Современный интерфейс через Blocks (Gradio 4.44+) ===
140
+ with gr.Blocks(css=".gradio-container {max-width: 900px !important}") as demo:
141
+ gr.Markdown("## 🧠 Eroha Summarizer PRO (автономная версия)")
142
+ gr.Markdown("🚀 Определяет язык (🇷🇺 / 🇰🇿 / 🇬🇧), создаёт краткое резюме и сохраняет в TXT, DOCX, PDF с поддержкой кириллицы.")
143
+
144
+ with gr.Row():
145
+ file_input = gr.File(label="📂 Загрузите документ (.pdf, .docx, .txt)")
146
+
147
+ with gr.Row():
148
+ summary_output = gr.Textbox(label="🧾 Краткое резюме", lines=10)
149
+
150
+ with gr.Row():
151
+ lang_output = gr.Textbox(label="🌍 Определённый язык")
152
+ model_output = gr.Textbox(label="🧠 Используемая модель")
153
+
154
+ with gr.Row():
155
+ src_len = gr.Number(label="📄 Длина исходного текста")
156
+ sum_len = gr.Number(label="📝 Длина резюме")
157
+ compression = gr.Textbox(label="📉 Степень сокращения")
158
+
159
+ with gr.Row():
160
+ txt_file = gr.File(label="📄 TXT файл")
161
+ docx_file = gr.File(label="📘 DOCX файл")
162
+ pdf_file = gr.File(label="📕 PDF файл")
163
+
164
+ run_btn = gr.Button("🔍 Сгенерировать резюме", variant="primary")
165
+
166
+ run_btn.click(
167
+ summarize_file,
168
+ inputs=[file_input],
169
+ outputs=[
170
+ summary_output, lang_output, model_output,
171
+ src_len, sum_len, compression,
172
+ txt_file, docx_file, pdf_file
173
+ ]
174
+ )
175
 
176
  demo.launch(server_name="0.0.0.0", server_port=7860)