skyopus-pol-rus / app.py
7-Sky's picture
Update app.py
cda14dc verified
import subprocess
import sys
import platform
def install_packages():
# Определяем систему для правильной установки SentencePiece
system = platform.system().lower()
packages = ['transformers', 'torch', 'gradio', 'sentencepiece']
# Для Linux/Unix систем может потребоваться установка libsentencepiece
if system == 'linux':
try:
subprocess.run(['apt-get', 'update'], check=True)
subprocess.run(['apt-get', 'install', '-y', 'libsentencepiece-dev'], check=True)
except:
print("Не удалось установить libsentencepiece-dev через apt-get")
# Устанавливаем Python-пакеты
for package in packages:
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
try:
from transformers import MarianMTModel, MarianTokenizer
import gradio as gr
except ImportError:
print("Устанавливаем необходимые пакеты...")
install_packages()
import subprocess
import sys
import warnings
from transformers import MarianMTModel, MarianTokenizer
import gradio as gr
# Подавление предупреждений
warnings.filterwarnings("ignore", message="Recommended: pip install sacremoses.")
# Установка недостающих пакетов
def install_packages():
required = ['sentencepiece', 'sacremoses', 'torch', 'gradio']
for package in required:
try:
__import__(package.split('==')[0])
except ImportError:
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
install_packages()
# Настройки модели
MODEL_NAME = "7-Sky/skyopus-pol-rus"
DEFAULT_TRANSLATIONS = 3
MAX_TRANSLATIONS = 5
# Загрузка модели с обработкой ошибок
try:
tokenizer = MarianTokenizer.from_pretrained(MODEL_NAME)
model = MarianMTModel.from_pretrained(MODEL_NAME)
except Exception as e:
print(f"Ошибка загрузки модели: {e}")
sys.exit(1)
def clean_translation(text):
"""Очистка перевода от языковых тегов и лишних пробелов"""
return text.replace(">>rus<<", "").strip()
def translate_text(source_text, num_translations):
if not source_text.strip():
return ["Пожалуйста, введите текст для перевода"]
try:
num_translations = min(int(num_translations), MAX_TRANSLATIONS)
inputs = tokenizer(">>rus<< " + source_text, return_tensors="pt", padding=True)
outputs = model.generate(
**inputs,
num_return_sequences=num_translations,
num_beams=num_translations,
max_length=512
)
return [clean_translation(tokenizer.decode(tokens, skip_special_tokens=True))
for tokens in outputs]
except Exception as e:
return [f"Ошибка перевода: {str(e)}"]
# Интерфейс Gradio
with gr.Blocks(title="Польско-русский переводчик", theme="soft") as app:
gr.Markdown("## 🎯 Точный перевод с польского на русский")
gr.Markdown(f"**Модель:** `{MODEL_NAME}`")
with gr.Row():
with gr.Column():
input_text = gr.Textbox(
label="Польский текст",
placeholder="Введите текст для перевода...",
lines=3
)
num_translations = gr.Slider(
minimum=1,
maximum=MAX_TRANSLATIONS,
value=DEFAULT_TRANSLATIONS,
step=1,
label="Количество вариантов"
)
translate_btn = gr.Button("Перевести", variant="primary")
with gr.Column():
output_text = gr.Textbox(
label="Лучший вариант",
interactive=False,
lines=3
)
variants = gr.Textbox(
label=f"Все варианты (макс. {MAX_TRANSLATIONS})",
interactive=False,
lines=5
)
def update_outputs(text, num):
translations = translate_text(text, num)
return (
translations[0] if translations else "",
"\n\n".join(f"{i+1}. {t}" for i, t in enumerate(translations)) if translations else ""
)
translate_btn.click(
fn=update_outputs,
inputs=[input_text, num_translations],
outputs=[output_text, variants]
)
gr.Examples(
examples=[
["Powiedzieć a zrobić to nie to samo.", 3],
["O jego propozycji nawet nie warto mówić.", 3],
["Nie od razu Rzym zbudowano.", 2],
["To jest przykładowe zdanie do tłumaczenia.", 1]
],
inputs=[input_text, num_translations],
label="Примеры для теста"
)
if __name__ == "__main__":
app.launch(
server_name="0.0.0.0",
server_port=7860,
share=False,
show_error=True
)