File size: 11,688 Bytes
23c1bff
67e0b37
 
faa4b4b
23c1bff
 
94c498e
23c1bff
 
67e0b37
23c1bff
 
67e0b37
07d263c
67e0b37
23c1bff
 
94c498e
23c1bff
 
 
 
67e0b37
16d2b11
 
 
bfb3dda
 
 
 
 
67e0b37
 
 
 
 
 
 
faa4b4b
23c1bff
 
 
 
 
 
 
 
94c498e
23c1bff
 
 
 
 
 
 
 
 
 
650e5db
23c1bff
650e5db
23c1bff
 
 
650e5db
23c1bff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ba40889
bfb3dda
 
 
 
67e0b37
 
bfb3dda
 
 
39ace14
4cb8d88
 
 
313528a
253223d
4cb8d88
82a88c2
 
 
 
 
 
 
 
 
39ace14
bfb3dda
 
9e4d1ef
bfb3dda
 
 
 
9e4d1ef
bfb3dda
 
 
 
 
 
 
 
 
82a88c2
bfb3dda
 
 
 
 
5d1ba60
 
9e4d1ef
bfb3dda
 
 
23c1bff
67e0b37
23c1bff
 
 
bfb3dda
e0b5089
 
 
 
 
 
 
 
 
 
 
 
 
 
82a88c2
 
d96c106
82a88c2
 
e0b5089
993af87
82a88c2
 
 
d96c106
e0b5089
 
 
 
 
bfb3dda
 
 
 
e0b5089
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
# coding: utf-8

import gradio as gr
import os
import json
from pathlib import Path
from uuid import uuid4
from datetime import datetime
from huggingface_hub import CommitScheduler
from translation import Translator, LANGUAGES


LANGUAGES_LIST = list(LANGUAGES.keys())
HF_TOKEN = os.environ.get('HF_TOKEN')

JSON_DATASET_DIR = Path("flagged_data")
JSON_DATASET_DIR.mkdir(exist_ok=True, parents=True)
JSON_DATASET_PATH = JSON_DATASET_DIR / f"dataset-session-{uuid4()}.json"




def translate_wrapper(text, src_lang, tgt_lang, by_sentence=True, clean=True, num_beams=4):
    if text in ["", None, []]:
        return "Մուտքագրումը պարապ է։ | Input is empty."

    if src_lang in ["", None, []] or tgt_lang in ["", None, []]:
        return "Ընտրեցէք թարգմանութեան կողմերը | Please select source and target languages"

    if src_lang == tgt_lang:
        return "Ընտրուած լեզուները նոյնն են։ | Source and target languages are identical."

    src_lang = LANGUAGES.get(src_lang)
    tgt_lang = LANGUAGES.get(tgt_lang)

    result = translator.translate(text, src_lang, tgt_lang, by_sentence=by_sentence, clean=clean, num_beams=num_beams)
    return result


# hf_writer = gr.HuggingFaceDatasetSaver(HF_TOKEN, "AriNubar/hyw-en-crowd-source")

scheduler = CommitScheduler(
    repo_id="AriNubar/hyw-en-crowd-source",
    repo_type="dataset",
    folder_path=JSON_DATASET_DIR,
    path_in_repo="collected_data",
    token=HF_TOKEN,
    every=30 # every 30 minute
)

TQS = {
    "😊 Լաւ | Good": "good",
    "😐 Միջակ | Average": "average",
    "☹️ Վատ | Bad": "bad"
}

def save_json(src_lang, tgt_lang, input_text, output_text, by_sentence, clean, num_beams, translation_quality):
    if any([src_lang in ["", None, []], tgt_lang in ["", None, []], input_text in ["", None, []], output_text in ["", None, []]]):
        gr.Warning("Տուեալին մէկ մասը պարապ է։ Ձեր գնահատութիւնը չպահուեցաւ։ | Some part of the data is missing. Your feedback has not been saved.")
        return 
    
    src_lang = LANGUAGES.get(src_lang)
    tgt_lang = LANGUAGES.get(tgt_lang)
    translation_quality = TQS.get(translation_quality)
    
    # print(src_lang, tgt_lang, input_text, output_text, by_sentence, clean, num_beams, translation_quality)
    # print(type(src_lang), type(tgt_lang), type(input_text), type(output_text), type(by_sentence), type(clean), type(num_beams), type(translation_quality))
    data = {
        "src_lang": src_lang,
        "tgt_lang": tgt_lang,
        "original": input_text,
        "translation": output_text,
        "by_sentence": by_sentence,
        "clean": clean,
        "num_beams": num_beams,
        "translation_quality": translation_quality,
        "timestamp": datetime.now().isoformat()
    }
    with scheduler.lock:
        with open(JSON_DATASET_PATH, "a", encoding="utf8") as f:
            f.write(json.dumps(data, ensure_ascii=False) + "\n")

    gr.Info("Ձեր գնահանութիւնը պահուեցաւ։ Շատ շնորհակալութի՛ւն։ | Your feedback has been saved. Thank you.")


theme = gr.themes.Default().set(
    block_info_text_size="*text_xxs" # for info text
)

with gr.Blocks(title="Արեւմտահայերէն-Անգլերէն Մեքենական Թարգմանիչ | Western Armenian-English Machine Translation", 
               theme=theme,
               ) as demo:
    
    gr.HTML("""
        <h2 style='margin-bottom: 5px'>Արեւմտահայերէն-Անգլերէն Մեքենական Թարգմանիչ | Western Armenian-English Machine Translation</h2>
        <h3 style='margin-bottom: 5px'>Ստեղծող՝ | Created By: <a href='https://www.arinubar.com' target='_blank'>Ari Nubar Boyacıoğlu</a></h3>
        <h3 style='margin-bottom: 5px'>Փորձեցէ՛ք թարգմանիչին նոր տարբերակը. | Try out the newest version of the translator: <a href='https://www.arinubar.com/translate.php' target='_blank'>v2.0</a></h3>
        <p style="font-size: 0.7rem">Եթէ այս գործիքը կարողացաւ ձեզ օգտակար հանդիսանալ, բարելաւելու համար հաճեցէք սուրճի մը փոխարժէքը նուիրել․ | If this tool has proven useful to you, please consider making a donation. <a href='https://www.paypal.com/donate/?hosted_button_id=RRBCV3GQJ7D8N' target='_blank'>PayPal</a> | <a href='https://buymeacoffee.com/arinubar' target='_blank'>Buy Me a Coffee</a></p>
    """)

    with gr.Accordion("Թարգմանիչի Մասին | Information about the Translator", open=False):
        gr.HTML("""
            <p>Հոս կը ցուցադրուի առաջին արեւմտահայերէն-անգլերէն մեքենական թարգմանիչը, որ կարուցուած է Մեթայի (Ֆեյսպուքի) 'No Language Left Behind' տիպարի հիման վրայ։ Թարգմանութեան տիպարը կ'աշխատի CPU-ի մը մէջ, ուրեմն նախադասութեան մը թարգմանութիւնը կրնայ տեւել մօտաւորապէս <strong>40-60 երկվայրկեան</strong>։ Ձեր գնահատութիւնները եւ քննադատութիւնները շատ կարեւոր են տիպարի թարգմանութեան որակը բարելաւելու համար։</p>
            <p>Դուք թարգմանութեան որակին մասին ձեր գնահատութիւնը կրնաք տալ երեք գնահատութեան կոճակներէ մէկուն սեղմելով։ Լեզուի, մուտքի եւ ելքի գրութիւններու, յարաչափերու եւ ձեր գնահատութեան մասին տուեալները պիտի պահուին։ Գնահատութիւնը պարտաւոր չէ։</p>
            <hr style='margin-top: 5px; margin-bottom: 5px'>
            <p>This is the demo of the first Western Armenian-English neural machine translation system which is based on Meta's 'No Language Left Behind' model. The model runs on a CPU, so it might take approximately <strong>40-60 seconds</strong> to translate a single sentence. Your feedback and comments are very important for us to improve the quality of the translation.</p>
            <p>You can give your feedback about the quality of the translation by clicking one of the three feedback buttons. Information about source, target languages, input and output texts, parameters and your feedback about quality will be saved. It is not mandatory to give feedback.</p>
        """)
    
    with gr.Row():
        with gr.Column():
            text = gr.Textbox(lines=5, label="Մուտքագրում | Input Text")
            with gr.Row():
                src_lang = gr.Dropdown(LANGUAGES_LIST, type="value", label="Թարգմանէ Այս Լեզուէ | Source Language")
                tgt_lang = gr.Dropdown(LANGUAGES_LIST, type="value", label="Թարգմանէ Այս Լեզուի | Target Language")
        with gr.Column():
            translated = gr.Textbox(lines=5, label="Ելքագրում | Output Text", interactive=False)
            translate_btn = gr.Button(value="Թարգմանէ | Translate", variant="primary")
            with gr.Row():
                with gr.Column():
                    gr.Markdown("""
                    ### Թարգմանութեան Որակ | Translation Quality
                    """)                
                    flag_good_btn = gr.Button(value="😊 Լաւ | Good", size="sm")
                    flag_average_btn = gr.Button(value="😐 Միջակ | Average", size="sm")
                    flag_bad_btn = gr.Button(value="☹️ Վատ | Bad", size="sm")

    with gr.Row():
        gr.Markdown("""
            ## Յարաչափեր | Parameters
        """
        )
        by_sentence = gr.Checkbox(label="Նախադասութիւններու Բաժնէ | Split into Sentences", value=True, info="Տուփը նշանագրեցէք եթէ կ'ուզէք ձեր մուտքագրումը թարգմանուի նախադասութիւն առ նախադասութիւն։ Այս կերպով թարգմանուած նախադասութիւններուն որակը ընդհանրապէս աւելի լաւ կ'ըլլան։ | Check this box if you want to split your input text into sentences. This way the quality of the translation will be better.")
        clean = gr.Checkbox(label="Մշակէ | Preprocess", value=True, info="Տուփը նշանագրեցէք եթէ կ'ուզէք ձեր մուտքագրումը կանոնաւորուի ծրագրի կողմէ թարգմանութենէ առաջ։ Կանոնաւորումը թարգմանութեան որակի բարելաւման համար օգտակար է։ | Check this box if you want to preprocess your input text before translation. This way the quality of the translation will be better.")
        num_beams = gr.Dropdown([1, 2, 3, 4, 5], type="value", label="Որոնման Շողեր | Number of Beams", value=4, info="Աւելի բարձր թիւը ընդհանրապէս կը պատճառէ աւելի բարձր որակի, բայց նոյնիսկ երկարատեւ թարգմանութեան։ | Higher beam size will result in better quality translation, but also longer translation time.")

    translate_btn.click(translate_wrapper, inputs=[text, src_lang, tgt_lang, by_sentence, clean, num_beams], outputs=translated)
    
    # hf_writer.setup([src_lang, tgt_lang, text, translated, by_sentence, clean, num_beams, flag_bad_btn], "flagged_data_points")
    
    flag_good_btn.click(save_json, inputs=[src_lang, tgt_lang, text, translated, by_sentence, clean, num_beams, flag_good_btn], outputs=None)
    flag_average_btn.click(save_json, inputs=[src_lang, tgt_lang, text, translated, by_sentence, clean, num_beams, flag_average_btn], outputs=None)
    flag_bad_btn.click(save_json, inputs=[src_lang, tgt_lang, text, translated, by_sentence, clean, num_beams, flag_bad_btn], outputs=None)

    visitor_badge_html = """
        <a href="https://visitorbadge.io/status?path=https%3A%2F%2Farinubar-hyw-en-demo.hf.space%2F">
            <img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Farinubar-hyw-en-demo.hf.space%2F&label=%D4%B1%D5%B5%D6%81%D5%A5%D5%AC%D5%B8%D6%82%D5%B6%D5%A5%D6%80%20%7C%20Visitors&countColor=%23f97316&style=flat" />
        </a>
    """
    
    gr.HTML(visitor_badge_html)



    sponsors_html = """
        <div style="display: flex; justify-content: center; align-items: center; margin-bottom: 5px;">
            <h3>Աջակցութեամբ՝ | Supported By: </h3>
        </div>
        <div style="display: flex; justify-content: center; align-items: center; background-color: #0000007a; border-radius: 20px;">
            <a href="#">
                <img src="/file=./img/mkhitaryan-varjaran.png" alt="Pangalti Mkhitaryan School" style="padding: 10px; margin: 20px; width: 150px;" />
            </a>

            <a href="https://gulbenkian.pt/armenian-communities/">
                <img src="/file=./img/gulbenkian.png" alt="Calouste Gulbenkian Foundation - Armenian Communities" style="padding: 10px; margin: 20px;" />
            </a>

            <a href="http://www.teaov.org/">
                <img src="/file=./img/teaov.png" alt="Turkish-Armenian Minority Schools Teachers Foundation" style="padding: 10px; margin: 20px; width: 200px; padding-right:35px;" />
            </a>
        </div>

    """
    gr.HTML(sponsors_html)


if __name__ == "__main__":
    translator = Translator()
    demo.launch(favicon_path="img/translate.png", share=True, allowed_paths=["./img"])