cointegrated commited on
Commit
e45d7fa
1 Parent(s): c11b6b1

add v0 code

Browse files
Files changed (2) hide show
  1. app.py +110 -0
  2. requirements.txt +5 -0
app.py ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import torch
3
+ import numpy as np
4
+ import fasttext
5
+ import os
6
+ import urllib
7
+ import huggingface_hub
8
+ from transformers import NllbTokenizer, AutoModelForSeq2SeqLM
9
+
10
+
11
+ MODEL_URL = 'slone/nllb-rus-tyv-v1'
12
+
13
+
14
+ lang_to_code = {
15
+ 'Русский | Russian': 'rus_Cyrl',
16
+ 'Тувинский | Tyvan': 'tyv_Cyrl',
17
+ }
18
+
19
+
20
+ def fix_tokenizer(tokenizer, new_lang='tyv_Cyrl'):
21
+ """ Add a new language token to the tokenizer vocabulary (this should be done each time after its initialization) """
22
+ old_len = len(tokenizer) - int(new_lang in tokenizer.added_tokens_encoder)
23
+ tokenizer.lang_code_to_id[new_lang] = old_len-1
24
+ tokenizer.id_to_lang_code[old_len-1] = new_lang
25
+ # always move "mask" to the last position
26
+ tokenizer.fairseq_tokens_to_ids["<mask>"] = len(tokenizer.sp_model) + len(tokenizer.lang_code_to_id) + tokenizer.fairseq_offset
27
+
28
+ tokenizer.fairseq_tokens_to_ids.update(tokenizer.lang_code_to_id)
29
+ tokenizer.fairseq_ids_to_tokens = {v: k for k, v in tokenizer.fairseq_tokens_to_ids.items()}
30
+ if new_lang not in tokenizer._additional_special_tokens:
31
+ tokenizer._additional_special_tokens.append(new_lang)
32
+ # clear the added token encoder; otherwise a new token may end up there by mistake
33
+ tokenizer.added_tokens_encoder = {}
34
+ tokenizer.added_tokens_decoder = {}
35
+
36
+
37
+ def translate(
38
+ text,
39
+ model,
40
+ tokenizer,
41
+ src_lang='rus_Cyrl',
42
+ tgt_lang='tyv_Cyrl',
43
+ max_length='auto',
44
+ num_beams=4,
45
+ no_repeat_ngram_size=4,
46
+ n_out=None,
47
+ **kwargs
48
+ ):
49
+ tokenizer.src_lang = src_lang
50
+ encoded = tokenizer(text, return_tensors="pt", truncation=True, max_length=512)
51
+ if max_length == 'auto':
52
+ max_length = int(32 + 2.0 * encoded.input_ids.shape[1])
53
+ model.eval()
54
+ generated_tokens = model.generate(
55
+ **encoded.to(model.device),
56
+ forced_bos_token_id=tokenizer.lang_code_to_id[tgt_lang],
57
+ max_length=max_length,
58
+ num_beams=num_beams,
59
+ no_repeat_ngram_size=no_repeat_ngram_size,
60
+ num_return_sequences=n_out or 1,
61
+ **kwargs
62
+ )
63
+ out = tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
64
+ if isinstance(text, str) and n_out is None:
65
+ return out[0]
66
+ return out
67
+
68
+
69
+ def translate_wrapper(text, src, trg, correct=None):
70
+ src = lang_to_code.get(src)
71
+ trg = lang_to_code.get(trg)
72
+ if src == trg:
73
+ return 'Please choose two different languages'
74
+ print(text, src, trg)
75
+ result = translate(
76
+ text=text,
77
+ model=model,
78
+ tokenizer=tokenizer,
79
+ src=src,
80
+ trg=trg,
81
+ )
82
+ return result
83
+
84
+
85
+ article = """
86
+ Please wait until I publish all the details
87
+ """
88
+
89
+
90
+ interface = gr.Interface(
91
+ translate_wrapper,
92
+ [
93
+ gr.Textbox(label="Text", lines=2, placeholder='text to translate '),
94
+ gr.Dropdown(list(lang_to_code.keys()), type="value", label='source language', value=list(lang_to_code.keys())[0]),
95
+ gr.Dropdown(list(lang_to_code.keys()), type="value", label='target language', value=list(lang_to_code.keys())[1]),
96
+ ],
97
+ "text",
98
+ title='Tyvan-Russian translaton',
99
+ article=article,
100
+ )
101
+
102
+
103
+ if __name__ == '__main__':
104
+ model = AutoModelForSeq2SeqLM.from_pretrained(MODEL_URL)
105
+ if torch.cuda.is_available():
106
+ model.cuda()
107
+ tokenizer = NllbTokenizer.from_pretrained(MODEL_URL)
108
+ fix_tokenizer(tokenizer)
109
+
110
+ interface.launch()
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ transformers
2
+ sentencepiece
3
+ numpy
4
+ gradio>=3.18.0
5
+ torch