Spaces:
Running
on
Zero
Running
on
Zero
import gradio as gr | |
from transformers import AutoModelForSeq2SeqLM, NllbTokenizer | |
import torch | |
import spaces | |
device = "cuda" if torch.cuda.is_available() else "cpu" | |
model_id = "leks-forever/nllb-200-distilled-600M-v1" | |
tokenizer = NllbTokenizer.from_pretrained(model_id) | |
model = AutoModelForSeq2SeqLM.from_pretrained(model_id).to(device) | |
def translate(text, src_lang='lez_Cyrl', tgt_lang='rus_Cyrl', a=32, b=3, max_input_length=1024, num_beams=1, **kwargs): | |
global tokenizer | |
if src_lang in language_codes: | |
src_lang = language_codes[src_lang] | |
if tgt_lang in language_codes: | |
tgt_lang = language_codes[tgt_lang] | |
tokenizer.src_lang = src_lang | |
tokenizer.tgt_lang = tgt_lang | |
inputs = tokenizer(text, return_tensors='pt', padding=True, truncation=True, max_length=max_input_length) | |
result = model.generate( | |
**inputs.to(model.device), | |
forced_bos_token_id=tokenizer.convert_tokens_to_ids(tgt_lang), | |
max_new_tokens=int(a + b * inputs.input_ids.shape[1]), | |
num_beams=num_beams, | |
**kwargs | |
) | |
return tokenizer.batch_decode(result, skip_special_tokens=True)[0] | |
src_lang, tgt_lang = "Русский", "Лезги чlал" | |
interface = { | |
"Лезги чlал": { | |
"title": 'Лезги-урус чlалар', | |
'placeholder': 'кхьих лезги чlалал', | |
'translate_btn': 'Элкъурун', | |
'lang_swap_btn': 'чlал Дегишрун', | |
}, | |
"Русский": { | |
"title": 'русско-лезгинский переводчик', | |
'placeholder': 'введите текст на русском для перевода', | |
'translate_btn': 'перевести', | |
'lang_swap_btn': 'сменить язык', | |
}, | |
} | |
language_codes = { | |
"Русский": "rus_Cyrl", | |
"Лезги чlал": "lez_Cyrl", | |
} | |
def swap_languages(src_lang, tgt_lang, src_text): | |
new_src_lang = tgt_lang | |
new_tgt_lang = src_lang | |
return ( | |
new_src_lang, | |
new_tgt_lang, | |
gr.Textbox(placeholder=interface[new_src_lang]['placeholder'], value=''), | |
gr.Markdown(f"# {interface[tgt_lang]['title']}"), | |
gr.Button(value=interface[new_src_lang]['translate_btn']), | |
gr.Button(value=interface[new_src_lang]['lang_swap_btn']) | |
) | |
with gr.Blocks() as demo: | |
title = gr.Markdown(f"# {interface[src_lang]['title']}") | |
with gr.Row(): | |
with gr.Column(): | |
src_text = gr.Textbox(label='', placeholder=interface[src_lang]['placeholder']) | |
with gr.Column(): | |
tgt_text = gr.Textbox(label='', interactive=False) | |
src_lang_state = gr.State(value=src_lang) | |
tgt_lang_state = gr.State(value=tgt_lang) | |
translate_btn = gr.Button(interface[src_lang]['translate_btn']) | |
swap_button = gr.Button(interface[src_lang]['lang_swap_btn']) | |
translate_btn.click( | |
fn=translate, | |
inputs=[src_text, src_lang_state, tgt_lang_state], | |
outputs=tgt_text | |
) | |
swap_button.click( | |
fn=swap_languages, | |
inputs=[src_lang_state, tgt_lang_state, src_text], | |
outputs=[src_lang_state, tgt_lang_state, src_text, title, translate_btn, swap_button] | |
) | |
# Adding the markdown at the bottom | |
gr.Markdown( | |
""" | |
# Вун атуй - рагъ атуй! 👋 | |
✍ Примите участие в сборе данных для обучения переводчика. | |
🎯 Нас ждет два этапа: | |
1. Сбор пар предложений русский-лезгинский (>600 тысяч предложений) | |
2. Голосование за лучший перевод | |
🕓 Для того, чтобы сделать весомый вклад, достаточно всего 5 минут в день! | |
Жмите 🆕 Добавить перевод | |
[Ссылка на бота для перевода и разметки в тг](https://t.me/lek_translator_bot) | |
[Канал с обновлениями по боту](https://t.me/lek_translator_info) | |
""" | |
) | |
if __name__ == "__main__": | |
demo.launch() |