File size: 8,454 Bytes
dc149ba
 
 
 
 
 
 
 
 
 
 
 
 
 
3ad5346
 
 
dc149ba
8c5885d
 
158e38e
8c5885d
 
dc149ba
 
 
90b34d1
93baa69
dc149ba
90b34d1
 
 
e939d89
b0ae3fd
 
 
b2d474f
7239594
 
 
90b34d1
93baa69
9e1c3ab
 
90b34d1
9e1c3ab
dc149ba
8c5885d
 
 
 
46abd0a
8c5885d
46abd0a
8c5885d
 
 
 
 
 
5e8469e
 
 
8c5885d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98b9978
31097f0
3ad5346
5e8469e
98b9978
 
 
 
 
 
 
5e8469e
98b9978
8c5885d
 
98b9978
dc149ba
 
 
 
 
 
 
 
 
 
 
 
90b34d1
592978b
dc149ba
 
2866119
dc149ba
 
 
 
 
2866119
dc149ba
 
2866119
dc149ba
de3cada
b52f918
8112e48
f010b24
 
 
 
31097f0
592978b
 
 
3ad5346
 
 
 
 
592978b
9215493
dc149ba
 
cc4bac3
a71436a
bccf7be
 
33e3967
 
 
5b11a3e
bccf7be
33e3967
 
bccf7be
33e3967
bccf7be
 
 
 
 
 
 
 
 
 
 
33e3967
bccf7be
a71436a
 
93baa69
 
c603514
 
 
 
93baa69
90b34d1
 
 
e3d64dc
c603514
93baa69
765a96d
90b34d1
765a96d
93baa69
e3a8bf2
90b34d1
765a96d
9e1c3ab
90b34d1
d895aa7
 
9e1c3ab
 
 
 
 
f64ffeb
9c13f88
f64ffeb
9c13f88
765a96d
90b34d1
 
 
e3d64dc
9c13f88
b2974e9
90b34d1
b2974e9
9e1c3ab
90b34d1
d895aa7
 
9e1c3ab
93baa69
 
de3cada
e3d64dc
 
72801d9
 
e3d64dc
93baa69
9e1c3ab
 
33e3967
 
de3cada
 
8c5885d
 
 
90e8b1d
76ef102
b2974e9
76ef102
90e8b1d
 
65fbb2d
de3cada
 
 
d895aa7
de3cada
8c5885d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
"""
translation program for simple text
1. detect language from langdetect
2. translate to target language given by user

Example from
https://www.thepythoncode.com/article/machine-translation-using-huggingface-transformers-in-python 

user_input:
    string: string to be translated
    target_lang: language to be translated to

Returns:
    string: translated string of text

try this : https://pypi.org/project/EasyNMT/
and this : https://huggingface.co/IDEA-CCNL/Randeng-Deltalm-362M-En-Zh
"""
from __future__ import annotations
from typing import Iterable
import gradio as gr
from gradio.themes.base import Base
from gradio.themes.utils import colors, fonts, sizes
import argparse

import langid
from transformers import pipeline, AutoModelForSeq2SeqLM, AutoTokenizer, logging
from easynmt import EasyNMT

# Initialize logging
logging.set_verbosity_info()
logger = logging.get_logger("transformers")

# # Initialize nllb-200 models
# tokenizer = AutoTokenizer.from_pretrained("facebook/nllb-200-distilled-600M")
# model = AutoModelForSeq2SeqLM.from_pretrained("facebook/nllb-200-distilled-600M")

# Initialize mbart50 models
mbart_m2en_model = EasyNMT("mbart50_m2en")
mbart_en2m_model = EasyNMT("mbart50_en2m")
logger.info("mbart50 models initialized")

# Initialize m2m_100 models
m2m_model = EasyNMT("m2m_100_1.2B")
logger.info("m2m_100 models initialized")


class myTheme(Base):
    def __init__(
        self,
        *,
        primary_hue: colors.Color | str = colors.red,
        secondary_hue: colors.Color | str = colors.blue,
        neutral_hue: colors.Color | str = colors.orange,
        spacing_size: sizes.Size | str = sizes.spacing_md,
        radius_size: sizes.Size | str = sizes.radius_md,
        text_size: sizes.Size | str = sizes.text_lg,
        font: fonts.Font
        | str
        | Iterable[fonts.Font | str] = (
            fonts.GoogleFont("handjet"),
            "cursive",
            # "sans-serif",
        ),
        font_mono: fonts.Font
        | str
        | Iterable[fonts.Font | str] = (
            fonts.GoogleFont("IBM Plex Mono"),
            "ui-monospace",
            "monospace",
        ),
    ):
        super().__init__(
            primary_hue=primary_hue,
            secondary_hue=secondary_hue,
            neutral_hue=neutral_hue,
            spacing_size=spacing_size,
            radius_size=radius_size,
            text_size=text_size,
            font=font,
            font_mono=font_mono,
        )
        super().set(
            body_background_fill="repeating-linear-gradient(135deg, *primary_800, *primary_800 10px, *primary_900 10px, *primary_900 20px)",
            button_primary_background_fill="linear-gradient(90deg, *primary_600, *secondary_800)",
            button_primary_background_fill_hover="linear-gradient(45deg, *primary_200, *secondary_300)",
            button_primary_text_color="white",
            slider_color="*secondary_300",
            slider_color_dark="*secondary_600",
            block_title_text_weight="600",
            block_border_width="3px",
            block_shadow="*shadow_drop_lg",
            button_shadow="*shadow_drop_lg",
            button_large_padding="24px",
        )


def detect_lang(article):
    """
    Language Detection using library langid

    Args:
        article (string): article that user wish to translate
        target_lang (string): language user want to translate article into

    Returns:
        string: detected language short form
    """

    result_lang = langid.classify(article)
    logger.info(f"language detected as {result_lang}")
    return result_lang[0]


def opus_trans(article, target_language):
    """
    Translation by Helsinki-NLP model

    Args:
        article (string): article that user wishes to translate
        target_language (string): language that user wishes to translate article into

    Returns:
        string: translated piece of article based off target_language
    """

    result_lang = detect_lang(article)

    if target_language == "English":
        target_lang = "en"
    elif target_language == "Chinese":
        target_lang = "zh"

    if result_lang != target_lang:
        task_name = f"translation_{result_lang}_to_{target_lang}"
        model_name = f"Helsinki-NLP/opus-mt-{result_lang}-{target_lang}"
        try:
            translator = pipeline(task_name, model=model_name, tokenizer=model_name)
            translated = translator(article)[0]["translation_text"]
        except:
            translated = "Error: Model doesn't exist"
    else:
        translated = "Error: You chose the same language as the article detected language. Please reselect language and try again."
    return translated


def nllb_trans(article, target_language):
    result_lang = detect_lang(article)

    inputs = tokenizer(article, return_tensors="pt")

    if target_language == "English":
        target_lang = "eng_Latn"
        target_language = "en"
    elif target_language == "Chinese":
        target_lang = "zho_Hans"
        target_language = "zh"

    if result_lang != target_language:
        translated_tokens = model.generate(
            **inputs,
            forced_bos_token_id=tokenizer.lang_code_to_id[target_lang],
            max_length=30,
        )
        translated = tokenizer.batch_decode(
            translated_tokens, skip_special_tokens=True
        )[0]
    else:
        translated = "Error: You chose the same language as the article detected language. Please reselect language and try again."

    return translated


def mbart_trans(article, target_language):
    result_lang = detect_lang(article)
    if target_language == "English":
        target_lang = "en"
    elif target_language == "Chinese":
        target_lang = "zh"

    logger.info(f"Article to translate : {article}")
    logger.info(f"Chose which translation model: mbart model")
    logger.info(f"Language selected: {target_language}")

    if result_lang != target_lang:
        if target_language == "English":
            translated = mbart_m2en_model.translate(article, target_lang="en")
            logger.info(f"Translated Result: {translated}")
            return translated
        else:
            translated = mbart_en2m_model.translate(article, target_lang="zh")
            logger.info(f"Translated Result: {translated}")
            return translated
    else:
        logger.warning(
            "Error: You chose the same language as the article detected language. Please reselect language and try again."
        )
        return "Error: You chose the same language as the article detected language. Please reselect language and try again."


def m2m_trans(article, target_language):
    result_lang = detect_lang(article)
    if target_language == "English":
        target_lang = "en"
    elif target_language == "Chinese":
        target_lang = "zh"

    logger.info(f"Article to translate : {article}")
    logger.info(f"Chose which translation model: m2m model")
    logger.info(f"Language selected: {target_language}")

    if result_lang != target_lang:
        translated = m2m_model.translate(article, target_lang)
        logger.info(f"Translation Result: {translated}")
        return translated
    else:
        logger.warning(
            f"Error: You chose the same language as the article detected language. Please reselect language and try again."
        )
        return "Error: You chose the same language as the article detected language. Please reselect language and try again."


def translate(article, toolkit, target_language):
    if toolkit == "OPUS":
        translated = opus_trans(article, target_language)
    # if toolkit == "NLLB":
    #     translated = nllb_trans(article, target_language)
    elif toolkit == "MBART":
        translated = mbart_trans(article, target_language)
    elif toolkit == "M2M":
        translated = m2m_trans(article, target_language)

    return translated


myTheme = myTheme()

with gr.Blocks(theme=myTheme) as demo:
    article = gr.Textbox(label="Article")
    toolkit_select = gr.Radio(
        ["OPUS", "MBART", "M2M"], label="Select Translation Model", value="MBART"
    )
    lang_select = gr.Radio(["English", "Chinese"], label="Select Desired Language")
    result = gr.Textbox(label="Translated Result")
    trans_btn = gr.Button("Translate")
    trans_btn.click(
        fn=translate, inputs=[article, toolkit_select, lang_select], outputs=result
    )


demo.launch()