Yermek68 commited on
Commit
d93b7e1
·
verified ·
1 Parent(s): 2b1b52c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -27
app.py CHANGED
@@ -6,22 +6,20 @@ import docx2txt
6
  from docx import Document
7
  from fpdf import FPDF
8
  from langdetect import detect
 
9
 
10
- # === 1. Подготовка директорий ===
11
  os.makedirs("/app/models", exist_ok=True)
12
  FONT_PATH = "DejaVuSans.ttf"
13
-
14
- # === 2. Проверяем, есть ли шрифт, если нет — скачиваем ===
15
  if not os.path.exists(FONT_PATH):
16
- import urllib.request
17
- print("🪶 Загружаю шрифт DejaVuSans.ttf...")
18
  urllib.request.urlretrieve(
19
  "https://github.com/dejavu-fonts/dejavu-fonts/raw/master/ttf/DejaVuSans.ttf",
20
  FONT_PATH
21
  )
22
 
23
- # === 3. Подгружаем модели с кэшем ===
24
  def load_model(task, model_name):
 
25
  return pipeline(task, model=model_name, cache_dir="/app/models")
26
 
27
  summarizers = {
@@ -30,7 +28,7 @@ summarizers = {
30
  "kz": load_model("summarization", "csebuetnlp/mT5_multilingual_XLSum")
31
  }
32
 
33
- # === 4. Чтение файла ===
34
  def read_file(file):
35
  if not file:
36
  return ""
@@ -48,10 +46,10 @@ def read_file(file):
48
  else:
49
  text = file.read().decode("utf-8", errors="ignore")
50
  except Exception as e:
51
- return f"Ошибка при чтении файла: {e}"
52
  return text.strip()
53
 
54
- # === 5. Определение языка ===
55
  def detect_language(text):
56
  try:
57
  lang = detect(text)
@@ -64,7 +62,7 @@ def detect_language(text):
64
  except:
65
  return "en"
66
 
67
- # === 6. Суммаризация текста ===
68
  def summarize_text(text):
69
  if not text or len(text) < 50:
70
  return "⚠️ Недостаточно текста для анализа.", "❌", "❌", 0, 0, "❌"
@@ -73,8 +71,8 @@ def summarize_text(text):
73
  model = summarizers.get(lang, summarizers["en"])
74
  flags = {"ru": "🇷🇺 Русский", "kz": "🇰🇿 Қазақ тілі", "en": "🇬🇧 English"}
75
  lang_label = flags.get(lang, "🌍 Unknown")
76
-
77
  model_label = model.model.name_or_path if hasattr(model.model, "name_or_path") else "Custom"
 
78
  chunk_size = 2500
79
  overlap = 200
80
  summaries = []
@@ -94,7 +92,7 @@ def summarize_text(text):
94
 
95
  return summary, lang_label, model_label, src_len, sum_len, f"{compression}%"
96
 
97
- # === 7. Сохранение файлов ===
98
  def save_summary_as_txt(summary_text):
99
  path = "summary.txt"
100
  with open(path, "w", encoding="utf-8") as f:
@@ -113,45 +111,48 @@ def save_summary_as_pdf(summary_text):
113
  path = "summary.pdf"
114
  pdf = FPDF()
115
  pdf.add_page()
116
- try:
117
- pdf.add_font('DejaVu', '', FONT_PATH, uni=True)
118
- pdf.set_font('DejaVu', '', 12)
119
- except:
120
- pdf.set_font("Arial", size=12)
121
  pdf.multi_cell(0, 10, summary_text)
122
  pdf.output(path)
123
  return path
124
 
125
- # === 8. Основная функция ===
126
  def summarize_file(file):
127
  text = read_file(file)
128
- if text.startswith("Ошибка"):
129
  return text, "❌", "❌", 0, 0, "❌", None, None, None
130
 
131
- summary, lang_label, model_label, src_len, sum_len, compression = summarize_text(text)
 
 
 
 
132
  txt_path = save_summary_as_txt(summary)
133
  docx_path = save_summary_as_docx(summary)
134
  pdf_path = save_summary_as_pdf(summary)
135
 
136
  return summary, lang_label, model_label, src_len, sum_len, compression, txt_path, docx_path, pdf_path
137
 
138
- # === 9. Интерфейс Gradio ===
139
  demo = gr.Interface(
140
  fn=summarize_file,
141
- inputs=gr.File(label="📁 Загрузите документ (.pdf, .docx, .txt)"),
142
  outputs=[
143
  gr.Textbox(label="🧾 Краткое резюме"),
144
  gr.Textbox(label="🌍 Определённый язык"),
145
  gr.Textbox(label="🧠 Используемая модель"),
146
  gr.Number(label="📄 Длина исходного текста"),
147
  gr.Number(label="📝 Длина резюме"),
148
- gr.Textbox(label="📉 Степень сокращения"),
149
- gr.File(label="📄 Скачать TXT"),
150
- gr.File(label="📘 Скачать DOCX"),
151
- gr.File(label="📕 Скачать PDF"),
152
  ],
153
  title="🧠 Eroha Summarizer PRO (автономная версия)",
154
- description="🚀 Работает офлайн. Определяет язык (🇷🇺 / 🇰🇿 / 🇬🇧), создаёт краткое резюме и сохраняет в TXT, DOCX, PDF с поддержкой кириллицы.",
 
 
155
  )
156
 
157
  demo.launch(server_name="0.0.0.0", server_port=7860)
 
6
  from docx import Document
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
  if not os.path.exists(FONT_PATH):
 
 
15
  urllib.request.urlretrieve(
16
  "https://github.com/dejavu-fonts/dejavu-fonts/raw/master/ttf/DejaVuSans.ttf",
17
  FONT_PATH
18
  )
19
 
20
+ # === Загрузка моделей ===
21
  def load_model(task, model_name):
22
+ print(f"🔹 Загружается модель: {model_name}")
23
  return pipeline(task, model=model_name, cache_dir="/app/models")
24
 
25
  summarizers = {
 
28
  "kz": load_model("summarization", "csebuetnlp/mT5_multilingual_XLSum")
29
  }
30
 
31
+ # === Чтение файлов ===
32
  def read_file(file):
33
  if not file:
34
  return ""
 
46
  else:
47
  text = file.read().decode("utf-8", errors="ignore")
48
  except Exception as e:
49
+ return f"⚠️ Ошибка при чтении файла: {e}"
50
  return text.strip()
51
 
52
+ # === Определение языка ===
53
  def detect_language(text):
54
  try:
55
  lang = detect(text)
 
62
  except:
63
  return "en"
64
 
65
+ # === Суммаризация ===
66
  def summarize_text(text):
67
  if not text or len(text) < 50:
68
  return "⚠️ Недостаточно текста для анализа.", "❌", "❌", 0, 0, "❌"
 
71
  model = summarizers.get(lang, summarizers["en"])
72
  flags = {"ru": "🇷🇺 Русский", "kz": "🇰🇿 Қазақ тілі", "en": "🇬🇧 English"}
73
  lang_label = flags.get(lang, "🌍 Unknown")
 
74
  model_label = model.model.name_or_path if hasattr(model.model, "name_or_path") else "Custom"
75
+
76
  chunk_size = 2500
77
  overlap = 200
78
  summaries = []
 
92
 
93
  return summary, lang_label, model_label, src_len, sum_len, f"{compression}%"
94
 
95
+ # === Сохранение результатов ===
96
  def save_summary_as_txt(summary_text):
97
  path = "summary.txt"
98
  with open(path, "w", encoding="utf-8") as f:
 
111
  path = "summary.pdf"
112
  pdf = FPDF()
113
  pdf.add_page()
114
+ pdf.add_font('DejaVu', '', FONT_PATH, uni=True)
115
+ pdf.set_font('DejaVu', '', 12)
 
 
 
116
  pdf.multi_cell(0, 10, summary_text)
117
  pdf.output(path)
118
  return path
119
 
120
+ # === Главная функция ===
121
  def summarize_file(file):
122
  text = read_file(file)
123
+ if text.startswith("⚠️"):
124
  return text, "❌", "❌", 0, 0, "❌", None, None, None
125
 
126
+ with gr.Progress(track_tqdm=True) as progress:
127
+ progress(0, desc="🧠 Анализ текста...")
128
+ summary, lang_label, model_label, src_len, sum_len, compression = summarize_text(text)
129
+ progress(1, desc="✅ Готово!")
130
+
131
  txt_path = save_summary_as_txt(summary)
132
  docx_path = save_summary_as_docx(summary)
133
  pdf_path = save_summary_as_pdf(summary)
134
 
135
  return summary, lang_label, model_label, src_len, sum_len, compression, txt_path, docx_path, pdf_path
136
 
137
+ # === Интерфейс ===
138
  demo = gr.Interface(
139
  fn=summarize_file,
140
+ inputs=gr.File(label="📂 Загрузите документ (.pdf, .docx, .txt)"),
141
  outputs=[
142
  gr.Textbox(label="🧾 Краткое резюме"),
143
  gr.Textbox(label="🌍 Определённый язык"),
144
  gr.Textbox(label="🧠 Используемая модель"),
145
  gr.Number(label="📄 Длина исходного текста"),
146
  gr.Number(label="📝 Длина резюме"),
147
+ gr.Textbox(label="📉 Сжатие"),
148
+ gr.File(label="�� TXT"),
149
+ gr.File(label="📘 DOCX"),
150
+ gr.File(label="📕 PDF"),
151
  ],
152
  title="🧠 Eroha Summarizer PRO (автономная версия)",
153
+ description="🚀 Определяет язык (🇷🇺 / 🇰🇿 / 🇬🇧), создаёт краткое резюме и сохраняет в TXT, DOCX, PDF.",
154
+ theme="soft",
155
+ allow_flagging="never"
156
  )
157
 
158
  demo.launch(server_name="0.0.0.0", server_port=7860)