Spaces:
Sleeping
Sleeping
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 | |
) |