Spaces:
Running
Running
File size: 13,398 Bytes
42bcb30 |
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 |
# 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
import re
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/xcl-en-crowdsource",
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.")
def switch_languages(src, tgt, input_text, output_text):
new_src = tgt
new_tgt = src
new_input = output_text if output_text else input_text
return [new_src, new_tgt, new_input, None]
def detect_language(text):
"""Detect language based on script ratio"""
armenian_pattern = r'[\u0531-\u0587\u0589\u058A\u058F]'
non_armenian_pattern = r'[a-zA-Z]'
armenian_chars = len(re.findall(armenian_pattern, text))
non_armenian_chars = len(re.findall(non_armenian_pattern, text))
if armenian_chars > non_armenian_chars:
return "Գրաբար Հայոց | Classical Armenian", "Անգլերէն | English"
elif non_armenian_chars > 0:
return "Անգլերէն | English", "Գրաբար Հայոց | Classical Armenian"
return [gr.update(), gr.update()] # No clear dominance, reset dropdowns
def update_languages(text):
if not text:
return [gr.update(), gr.update()]
src, tgt = detect_language(text)
return [gr.update(value=src), gr.update(value=tgt)]
theme = gr.themes.Default().set(
block_info_text_size="*text_xxs" # for info text
)
with gr.Blocks(title="Գրաբար-Անգլերէն Մեքենական Թարգմանիչ | Classical Armenian-English Machine Translation",
theme=theme,
) as demo:
gr.HTML("""
<h2 style='margin-bottom: 5px'>Գրաբար-Անգլերէն Մեքենական Թարգմանիչ | Classical Armenian-English Machine Translation</h2>
<h3>Տարբերակ | Version: 1.0</h3>
<h3 style='margin-bottom: 5px'>Ստեղծող՝ | Created By: <a href='https://www.arinubar.com' target='_blank'>Ari Nubar Boyacıoğlu</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 Classical 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",
every=1.5 # Trigger event 1.5 seconds after last keystroke
)
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.Row():
switch_btn = gr.Button("🔄 Լեզուները Փոխէ | Switch Languages")
def switch_languages(src, tgt, input_text, output_text):
# Swap languages
new_src = tgt
new_tgt = src
# Move output to input if exists and clear output
new_input = output_text if output_text else input_text
return [new_src, new_tgt, new_input, None]
text.change(fn=update_languages,
inputs=[text],
outputs=[src_lang, tgt_lang])
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.")
switch_btn.click(switch_languages, inputs=[src_lang, tgt_lang, text, translated], outputs=[src_lang, tgt_lang, text, translated])
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"]) |