File size: 6,353 Bytes
02b7cd5
 
 
 
 
 
 
 
 
 
 
 
 
4f9dbf3
02b7cd5
 
be0f011
02b7cd5
 
 
 
35a3c7f
 
62d7088
 
 
35a3c7f
 
 
 
d8d593d
35a3c7f
 
62d7088
 
35a3c7f
 
 
 
d8d593d
35a3c7f
 
62d7088
 
 
 
 
a1a6d46
62d7088
 
 
 
 
a1a6d46
 
 
35a3c7f
 
a1a6d46
 
 
35a3c7f
 
 
 
 
a1a6d46
 
 
 
62d7088
 
35a3c7f
 
62d7088
35a3c7f
 
 
 
 
 
 
 
 
 
62d7088
 
 
35a3c7f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62d7088
 
a1a6d46
35a3c7f
62d7088
 
 
35a3c7f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62d7088
 
 
35a3c7f
62d7088
a1a6d46
 
35a3c7f
 
a1a6d46
2dcbdfc
 
 
 
62d7088
 
02b7cd5
35a3c7f
50a5fc4
 
 
 
 
 
 
 
5ceed64
50a5fc4
35a3c7f
62d7088
d310c5d
 
62d7088
 
 
 
a1a6d46
62d7088
 
 
 
 
 
68a3dad
02b7cd5
512ac41
 
fb5e317
f4f3e14
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
import gradio as gr
from transformers import pipeline


# Load model once
model = pipeline("text2text-generation", model = "crossroderick/dalat5")


def transliterate(text: str) -> str:
    """
    Prediction function.
    """
    if text.strip() == "":
        return ""
    
    input_text = f"Cyrillic2Latin: {text.strip()}"
    output = model(input_text, max_length = 128, do_sample = False)[0]["generated_text"]
    
    return output.strip()


# HTML code for the description
description_html = """
<div class="flip-card">
    <div class="flip-card-inner">
        <div class="flip-card-front">
            <button class="EN">EN</button>
            <h3>Қазақша (KZ)</h3><br>
            <p>
                <span><strong>DalaT5</strong> - <b>кириллицада</b> жазылған табиғи қазақ тілін еркін <b>латын графикасына</b> ауыстыру үшін дайындалған T5 негізіндегі модель, Қазақстанның 2021 жылғы ресми әліпби реформасына негізделген.</span>
                <br>
                <span>Бұл модель құрмет пен қызығушылықтың мәдени қимылы ретінде ұсынылады. Ол қазіргі қазақ тілін бүгінгі адамдар қалай жазады, солай қабылдайды - және оның болашағының тілінде жауап береді.</span>
            </p>
        </div>
        <div class="flip-card-back">
            <button class="KZ">KZ</button>
            <h3>English (EN)</h3><br>
            <p>
                <span><strong>DalaT5</strong> is a T5-based model trained to convert natural Kazakh written in <b>Cyrillic</b> into fluent <b>Latin script</b>, based on the official 2021 alphabet reform of Kazakhstan.</span>
                <br>
                <span>This model is offered as a cultural gesture of respect and curiosity. It accepts modern Kazakh as people write it today - and answers in the language of its future.</span>
            </p>
        </div>
    </div>
</div>

<div style="text-align: center; font-size: 1rem;">
<p>🧠 <a href="https://huggingface.co/crossroderick/dalat5" target="_blank">Model page</a> | 🔤 <a href="https://astanatimes.com/2021/02/kazakhstan-presents-new-latin-alphabet-plans-gradual-transition-through-2031/" target="_blank">Kazakhstan 2021 alphabet reform</a></p>

<br>

<p>Егер сіз үлес қосқыңыз, бірлесіп жұмыс жасағыңыз немесе жай ғана пікір бөліскіңіз келсе – байланысыңыз / If you'd like to contribute, collaborate, or just share feedback – feel free to connect with <a href="https://www.linkedin.com/in/rpereiracruz/" target="_blank">Rodrigo Pereira Cruz</a>. 🇧🇷🇰🇿</p>
</div>

<script>
document.addEventListener("DOMContentLoaded", function() {
    const en = document.querySelector(".EN");
    const kz = document.querySelector(".KZ");
    const card = document.querySelector(".flip-card");
    const inner = document.querySelector(".flip-card-inner");

    en.addEventListener("click", function() {
        inner.classList.toggle("flipped");
    });

    kz.addEventListener("click", function() {
        inner.classList.toggle("flipped");
    });
});
</script>
"""

# Custom CSS
description_css = """
.flip-card {
    position: relative;
    display: flex;
    justify-content: center;
    align-items: center;
    background-color: transparent;
    width: 100%;
    max-width: 900px;
    height: 250px;
    margin: 0 auto 2rem auto;
    overflow: hidden;
}

.flip-card-inner {
    position: relative;
    width: 95%;
    height: 99%;
    transition: transform 0.8s;
    display: flex;
    justify-content: center;
    align-items: center;
    transform-style: preserve-3d;
    border: 1px solid rgba(255, 255, 255, 0.2);
    border-radius: 15px;
    z-index: 1;
}

.flip-card .flip-card-inner .EN,
.flip-card .flip-card-inner .KZ {
    position: absolute;
    top: 10px;
    right: 10px;
    background: none;
    border: 1px solid white;
    padding: 6px;
    border-radius: 5px;
    font-weight: bold;
    cursor: pointer;
    transition: 0.5s;
    z-index: 3;
}

.flip-card .flip-card-inner .EN:hover,
.flip-card .flip-card-inner .KZ:hover {
    box-shadow: 5px 5px white;
    top: 13px;
    right: 13px;
}

.flip-card-inner.flipped {
    transform: rotateY(180deg);
}

.flip-card-front, .flip-card-back {
    position: absolute;
    width: 100%;
    height: 100%;
    backface-visibility: hidden;
    background-color: transparent;
    color: inherit;
    font-size: 16px;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
}

.flip-card-front p, .flip-card-back p{
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
}

.flip-card-front p span, .flip-card-back p span {
    width: 95%;
    margin: 0 10px;
}

.flip-card-back {
    transform: rotateY(180deg);
}

a {
    color: inherit;
    text-decoration: underline;
}

.lg.primary {
    background: #00AFC3;
}
"""

# Interface
with gr.Blocks(css = description_css) as demo:
    gr.HTML("<center><h1>🇰🇿 DalaT5</h1><h2>Қазақша кириллица → латын графикасының транслитераторы</h2><h3>Kazakh Cyrillic → Latin Script Transliterator</h3></center>")
    gr.Image(
        value = "./img/line_sep.png", 
        show_label = False, 
        width = 800, 
        height = 40, 
        show_download_button = False, 
        show_fullscreen_button = False,
        show_share_button = False
    )
    gr.HTML(description_html)
    gr.Interface(
        fn = transliterate,
        inputs = gr.Textbox(
            label = "Қазақ тілінде теріңіз (кириллица) / Type in Kazakh (Cyrillic script)",
            placeholder = "Мен қазақ тілінде сөйлеймін.",
            lines = 6
        ),

        outputs = gr.Textbox(
            label = "Латын графикасының шығуы / Latin script output",
        ),

        theme = "default",
        flagging_mode = "never"
    )


if __name__ == "__main__":
    demo.queue(default_concurrency_limit = 2)
    demo.launch()