Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -26,17 +26,44 @@ try:
|
|
26 |
except ImportError:
|
27 |
print("Устанавливаем необходимые пакеты...")
|
28 |
install_packages()
|
29 |
-
|
30 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
|
32 |
# Настройки модели
|
33 |
MODEL_NAME = "7-Sky/skyopus-pol-rus"
|
34 |
DEFAULT_TRANSLATIONS = 3
|
35 |
MAX_TRANSLATIONS = 5
|
36 |
|
37 |
-
# Загрузка модели
|
38 |
-
|
39 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
|
41 |
def translate_text(source_text, num_translations):
|
42 |
if not source_text.strip():
|
@@ -44,53 +71,59 @@ def translate_text(source_text, num_translations):
|
|
44 |
|
45 |
try:
|
46 |
num_translations = min(int(num_translations), MAX_TRANSLATIONS)
|
47 |
-
|
48 |
|
49 |
-
|
50 |
-
|
51 |
-
translated_tokens = model.generate(
|
52 |
**inputs,
|
53 |
num_return_sequences=num_translations,
|
54 |
num_beams=num_translations,
|
55 |
max_length=512
|
56 |
)
|
57 |
|
58 |
-
|
59 |
-
|
60 |
-
for tokens in translated_tokens:
|
61 |
-
decoded = tokenizer.decode(tokens, skip_special_tokens=True)
|
62 |
-
# Удаляем >>rus<< если он есть в начале строки
|
63 |
-
if decoded.startswith(">>rus<<"):
|
64 |
-
decoded = decoded[7:].strip()
|
65 |
-
translations.append(decoded)
|
66 |
-
|
67 |
-
return translations
|
68 |
except Exception as e:
|
69 |
-
return [f"
|
70 |
|
71 |
-
#
|
72 |
-
with gr.Blocks(title="Польско-русский переводчик") as app:
|
73 |
-
gr.Markdown("##
|
74 |
-
gr.Markdown(f"
|
75 |
|
76 |
with gr.Row():
|
77 |
with gr.Column():
|
78 |
-
input_text = gr.Textbox(
|
79 |
-
|
80 |
-
|
81 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
|
83 |
with gr.Column():
|
84 |
-
output_text = gr.Textbox(
|
85 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
|
87 |
def update_outputs(text, num):
|
88 |
translations = translate_text(text, num)
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
return main_translation, all_variants
|
94 |
|
95 |
translate_btn.click(
|
96 |
fn=update_outputs,
|
@@ -98,14 +131,21 @@ with gr.Blocks(title="Польско-русский переводчик") as ap
|
|
98 |
outputs=[output_text, variants]
|
99 |
)
|
100 |
|
101 |
-
|
102 |
examples=[
|
103 |
["Powiedzieć a zrobić to nie to samo.", 3],
|
104 |
["O jego propozycji nawet nie warto mówić.", 3],
|
105 |
-
["Nie od razu Rzym zbudowano.", 2]
|
|
|
106 |
],
|
107 |
-
inputs=[input_text, num_translations]
|
|
|
108 |
)
|
109 |
|
110 |
if __name__ == "__main__":
|
111 |
-
app.launch(
|
|
|
|
|
|
|
|
|
|
|
|
26 |
except ImportError:
|
27 |
print("Устанавливаем необходимые пакеты...")
|
28 |
install_packages()
|
29 |
+
|
30 |
+
|
31 |
+
import subprocess
|
32 |
+
import sys
|
33 |
+
import warnings
|
34 |
+
from transformers import MarianMTModel, MarianTokenizer
|
35 |
+
import gradio as gr
|
36 |
+
|
37 |
+
# Подавление предупреждений
|
38 |
+
warnings.filterwarnings("ignore", message="Recommended: pip install sacremoses.")
|
39 |
+
|
40 |
+
# Установка недостающих пакетов
|
41 |
+
def install_packages():
|
42 |
+
required = ['sentencepiece', 'sacremoses', 'torch', 'gradio']
|
43 |
+
for package in required:
|
44 |
+
try:
|
45 |
+
__import__(package.split('==')[0])
|
46 |
+
except ImportError:
|
47 |
+
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
|
48 |
+
|
49 |
+
install_packages()
|
50 |
|
51 |
# Настройки модели
|
52 |
MODEL_NAME = "7-Sky/skyopus-pol-rus"
|
53 |
DEFAULT_TRANSLATIONS = 3
|
54 |
MAX_TRANSLATIONS = 5
|
55 |
|
56 |
+
# Загрузка модели с обработкой ошибок
|
57 |
+
try:
|
58 |
+
tokenizer = MarianTokenizer.from_pretrained(MODEL_NAME)
|
59 |
+
model = MarianMTModel.from_pretrained(MODEL_NAME)
|
60 |
+
except Exception as e:
|
61 |
+
print(f"Ошибка загрузки модели: {e}")
|
62 |
+
sys.exit(1)
|
63 |
+
|
64 |
+
def clean_translation(text):
|
65 |
+
"""Очистка перевода от языковых тегов и лишних пробелов"""
|
66 |
+
return text.replace(">>rus<<", "").strip()
|
67 |
|
68 |
def translate_text(source_text, num_translations):
|
69 |
if not source_text.strip():
|
|
|
71 |
|
72 |
try:
|
73 |
num_translations = min(int(num_translations), MAX_TRANSLATIONS)
|
74 |
+
inputs = tokenizer(">>rus<< " + source_text, return_tensors="pt", padding=True)
|
75 |
|
76 |
+
outputs = model.generate(
|
|
|
|
|
77 |
**inputs,
|
78 |
num_return_sequences=num_translations,
|
79 |
num_beams=num_translations,
|
80 |
max_length=512
|
81 |
)
|
82 |
|
83 |
+
return [clean_translation(tokenizer.decode(tokens, skip_special_tokens=True))
|
84 |
+
for tokens in outputs]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85 |
except Exception as e:
|
86 |
+
return [f"Ошибка перевода: {str(e)}"]
|
87 |
|
88 |
+
# Интерфейс Gradio
|
89 |
+
with gr.Blocks(title="Польско-русский переводчик", theme="soft") as app:
|
90 |
+
gr.Markdown("## 🎯 Точный перевод с польского на русский")
|
91 |
+
gr.Markdown(f"**Модель:** `{MODEL_NAME}`")
|
92 |
|
93 |
with gr.Row():
|
94 |
with gr.Column():
|
95 |
+
input_text = gr.Textbox(
|
96 |
+
label="Польский текст",
|
97 |
+
placeholder="Введите текст для перевода...",
|
98 |
+
lines=3
|
99 |
+
)
|
100 |
+
num_translations = gr.Slider(
|
101 |
+
minimum=1,
|
102 |
+
maximum=MAX_TRANSLATIONS,
|
103 |
+
value=DEFAULT_TRANSLATIONS,
|
104 |
+
step=1,
|
105 |
+
label="Количество вариантов"
|
106 |
+
)
|
107 |
+
translate_btn = gr.Button("Перевести", variant="primary")
|
108 |
|
109 |
with gr.Column():
|
110 |
+
output_text = gr.Textbox(
|
111 |
+
label="Лучш��й вариант",
|
112 |
+
interactive=False,
|
113 |
+
lines=3
|
114 |
+
)
|
115 |
+
variants = gr.Textbox(
|
116 |
+
label=f"Все варианты (макс. {MAX_TRANSLATIONS})",
|
117 |
+
interactive=False,
|
118 |
+
lines=5
|
119 |
+
)
|
120 |
|
121 |
def update_outputs(text, num):
|
122 |
translations = translate_text(text, num)
|
123 |
+
return (
|
124 |
+
translations[0] if translations else "",
|
125 |
+
"\n\n".join(f"{i+1}. {t}" for i, t in enumerate(translations)) if translations else ""
|
126 |
+
)
|
|
|
127 |
|
128 |
translate_btn.click(
|
129 |
fn=update_outputs,
|
|
|
131 |
outputs=[output_text, variants]
|
132 |
)
|
133 |
|
134 |
+
gr.Examples(
|
135 |
examples=[
|
136 |
["Powiedzieć a zrobić to nie to samo.", 3],
|
137 |
["O jego propozycji nawet nie warto mówić.", 3],
|
138 |
+
["Nie od razu Rzym zbudowano.", 2],
|
139 |
+
["To jest przykładowe zdanie do tłumaczenia.", 1]
|
140 |
],
|
141 |
+
inputs=[input_text, num_translations],
|
142 |
+
label="Примеры для теста"
|
143 |
)
|
144 |
|
145 |
if __name__ == "__main__":
|
146 |
+
app.launch(
|
147 |
+
server_name="0.0.0.0",
|
148 |
+
server_port=7860,
|
149 |
+
share=False,
|
150 |
+
show_error=True
|
151 |
+
)
|