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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +32 -15
app.py CHANGED
@@ -1,3 +1,4 @@
 
1
  import gradio as gr
2
  from transformers import pipeline
3
  import pdfplumber
@@ -6,14 +7,30 @@ from docx import Document
6
  from fpdf import FPDF
7
  from langdetect import detect
8
 
9
- # === Загрузка моделей один раз при старте ===
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  summarizers = {
11
- "en": pipeline("summarization", model="facebook/bart-large-cnn"),
12
- "ru": pipeline("summarization", model="IlyaGusev/mbart_ru_sum_gazeta"),
13
- "kz": pipeline("summarization", model="csebuetnlp/mT5_multilingual_XLSum")
14
  }
15
 
16
- # === Чтение файла ===
17
  def read_file(file):
18
  if not file:
19
  return ""
@@ -34,7 +51,7 @@ def read_file(file):
34
  return f"Ошибка при чтении файла: {e}"
35
  return text.strip()
36
 
37
- # === Определение языка ===
38
  def detect_language(text):
39
  try:
40
  lang = detect(text)
@@ -47,7 +64,7 @@ def detect_language(text):
47
  except:
48
  return "en"
49
 
50
- # === Суммаризация текста ===
51
  def summarize_text(text):
52
  if not text or len(text) < 50:
53
  return "⚠️ Недостаточно текста для анализа.", "❌", "❌", 0, 0, "❌"
@@ -77,7 +94,7 @@ def summarize_text(text):
77
 
78
  return summary, lang_label, model_label, src_len, sum_len, f"{compression}%"
79
 
80
- # === Сохранение файлов ===
81
  def save_summary_as_txt(summary_text):
82
  path = "summary.txt"
83
  with open(path, "w", encoding="utf-8") as f:
@@ -97,7 +114,7 @@ def save_summary_as_pdf(summary_text):
97
  pdf = FPDF()
98
  pdf.add_page()
99
  try:
100
- pdf.add_font('DejaVu', '', 'DejaVuSans.ttf', uni=True)
101
  pdf.set_font('DejaVu', '', 12)
102
  except:
103
  pdf.set_font("Arial", size=12)
@@ -105,7 +122,7 @@ def save_summary_as_pdf(summary_text):
105
  pdf.output(path)
106
  return path
107
 
108
- # === Основная функция ===
109
  def summarize_file(file):
110
  text = read_file(file)
111
  if text.startswith("Ошибка"):
@@ -118,7 +135,7 @@ def summarize_file(file):
118
 
119
  return summary, lang_label, model_label, src_len, sum_len, compression, txt_path, docx_path, pdf_path
120
 
121
- # === Интерфейс ===
122
  demo = gr.Interface(
123
  fn=summarize_file,
124
  inputs=gr.File(label="📁 Загрузите документ (.pdf, .docx, .txt)"),
@@ -126,15 +143,15 @@ demo = gr.Interface(
126
  gr.Textbox(label="🧾 Краткое резюме"),
127
  gr.Textbox(label="🌍 Определённый язык"),
128
  gr.Textbox(label="🧠 Используемая модель"),
129
- gr.Number(label="📄 Длина исходного текста (символов)"),
130
- gr.Number(label="📝 Длина резюме (символов)"),
131
  gr.Textbox(label="📉 Степень сокращения"),
132
  gr.File(label="📄 Скачать TXT"),
133
  gr.File(label="📘 Скачать DOCX"),
134
  gr.File(label="📕 Скачать PDF"),
135
  ],
136
- title="🧠 Eroha Summarizer PRO",
137
- description=" Автоматически определяет язык (🇷🇺 / 🇬🇧 / 🇰🇿), создаёт краткое резюме и сохраняет в TXT, DOCX, PDF. Поддерживает кириллицу в PDF.",
138
  )
139
 
140
  demo.launch(server_name="0.0.0.0", server_port=7860)
 
1
+ import os
2
  import gradio as gr
3
  from transformers import pipeline
4
  import pdfplumber
 
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 = {
28
+ "en": load_model("summarization", "facebook/bart-large-cnn"),
29
+ "ru": load_model("summarization", "IlyaGusev/mbart_ru_sum_gazeta"),
30
+ "kz": load_model("summarization", "csebuetnlp/mT5_multilingual_XLSum")
31
  }
32
 
33
+ # === 4. Чтение файла ===
34
  def read_file(file):
35
  if not file:
36
  return ""
 
51
  return f"Ошибка при чтении файла: {e}"
52
  return text.strip()
53
 
54
+ # === 5. Определение языка ===
55
  def detect_language(text):
56
  try:
57
  lang = detect(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, "❌"
 
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:
 
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)
 
122
  pdf.output(path)
123
  return path
124
 
125
+ # === 8. Основная функция ===
126
  def summarize_file(file):
127
  text = read_file(file)
128
  if text.startswith("Ошибка"):
 
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)"),
 
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)