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 )