Tuwili adalah model Neural Machine Translation (NMT) yang di-fine-tune dari
mBART-50 untuk menerjemahkan secara
dua arah (bidirectional) antara:
Bahasa Gorontalo adalah bahasa daerah yang digunakan oleh masyarakat di Provinsi Gorontalo, Sulawesi, Indonesia. Sebagai bahasa dengan sumber daya rendah (low-resource language), model ini bertujuan membantu pelestarian dan digitalisasi bahasa Gorontalo melalui teknologi AI.
1from transformers import MBartForConditionalGeneration, MBart50TokenizerFast
2
3# Muat model
4model_name = "datanikah9/tuwili"
5tokenizer = MBart50TokenizerFast.from_pretrained(model_name)
6model = MBartForConditionalGeneration.from_pretrained(model_name)
7
8tokenizer.src_lang = "id_ID"
9
10def translate(text, direction="id2gor"):
11 """
12 Terjemahkan teks.
13 direction: "id2gor" (Indonesia → Gorontalo) atau "gor2id" (sebaliknya)
14 """
15 if direction == "id2gor":
16 prompt = f"Terjemahkan kata atau kalimat berikut dari bahasa Indonesia ke bahasa Gorontalo. {text}"
17 else:
18 prompt = f"Terjemahkan kata atau kalimat berikut dari bahasa Gorontalo ke bahasa Indonesia. {text}"
19
20 inputs = tokenizer(prompt, return_tensors="pt", max_length=128, truncation=True)
21 generated = model.generate(
22 **inputs,
23 max_length=64,
24 num_beams=5,
25 forced_bos_token_id=tokenizer.lang_code_to_id["id_ID"],
26 )
27 return tokenizer.decode(generated[0], skip_special_tokens=True)
28
29# Contoh penggunaan
30print(translate("Selamat pagi", direction="id2gor"))
31print(translate("kumando", direction="gor2id"))
32print(translate("Saya makan nasi", direction="id2gor"))
1def translate_batch(texts, direction="id2gor", batch_size=16):
2 results = []
3 for i in range(0, len(texts), batch_size):
4 batch = texts[i:i+batch_size]
5 if direction == "id2gor":
6 prompts = [f"Terjemahkan kata atau kalimat berikut dari bahasa Indonesia ke bahasa Gorontalo. {t}" for t in batch]
7 else:
8 prompts = [f"Terjemahkan kata atau kalimat berikut dari bahasa Gorontalo ke bahasa Indonesia. {t}" for t in batch]
9
10 inputs = tokenizer(prompts, return_tensors="pt", max_length=128, truncation=True, padding=True)
11 generated = model.generate(**inputs, max_length=64, num_beams=5, forced_bos_token_id=tokenizer.lang_code_to_id["id_ID"])
12 results.extend(tokenizer.batch_decode(generated, skip_special_tokens=True))
13 return results
14
15# Terjemahkan banyak kata sekaligus
16words = ["Rumah", "Air", "Terima kasih", "Selamat malam"]
17translations = translate_batch(words)
1import gradio as gr
2import torch
3from transformers import MBartForConditionalGeneration, MBart50TokenizerFast
4
5# Muat model
6print("⏳ Memuat model Tuwili...")
7model_name = "datanikah9/tuwili"
8tokenizer = MBart50TokenizerFast.from_pretrained(model_name)
9model = MBartForConditionalGeneration.from_pretrained(
10 model_name,
11 torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32
12)
13device = "cuda" if torch.cuda.is_available() else "cpu"
14model = model.to(device)
15model.eval()
16tokenizer.src_lang = "id_ID"
17print("✅ Model siap!")
18
19def terjemahkan(teks, arah):
20 if not teks.strip():
21 return "⚠️ Masukkan teks terlebih dahulu."
22
23 if arah == "🇮🇩 Indonesia → Gorontalo":
24 prompt = f"Terjemahkan kata atau kalimat berikut dari bahasa Indonesia ke bahasa Gorontalo. {teks}"
25 else:
26 prompt = f"Terjemahkan kata atau kalimat berikut dari bahasa Gorontalo ke bahasa Indonesia. {teks}"
27
28 inputs = tokenizer(prompt, return_tensors="pt", max_length=128, truncation=True).to(device)
29 with torch.no_grad():
30 generated = model.generate(
31 **inputs,
32 max_length=64,
33 num_beams=5,
34 forced_bos_token_id=tokenizer.lang_code_to_id["id_ID"],
35 )
36 return tokenizer.decode(generated[0], skip_special_tokens=True)
37
38# Bangun antarmuka Gradio
39demo = gr.Interface(
40 fn=terjemahkan,
41 inputs=[
42 gr.Textbox(
43 label="Teks",
44 placeholder="Ketik kata atau kalimat di sini...",
45 lines=3,
46 ),
47 gr.Radio(
48 choices=["🇮🇩 Indonesia → Gorontalo", "🏝️ Gorontalo → Indonesia"],
49 value="🇮🇩 Indonesia → Gorontalo",
50 label="Arah Terjemahan",
51 ),
52 ],
53 outputs=gr.Textbox(label="Hasil Terjemahan", lines=3),
54 title="🌺 Tuwili — Penerjemah Indonesia ↔ Gorontalo",
55 description="Model AI untuk menerjemahkan antara Bahasa Indonesia dan Bahasa Gorontalo (Hulontalo).",
56 examples=[
57 ["Selamat pagi", "🇮🇩 Indonesia → Gorontalo"],
58 ["Terima kasih", "🇮🇩 Indonesia → Gorontalo"],
59 ["Saya makan nasi", "🇮🇩 Indonesia → Gorontalo"],
60 ["kumando", "🏝️ Gorontalo → Indonesia"],
61 ["bele", "🏝️ Gorontalo → Indonesia"],
62 ],
63 theme=gr.themes.Soft(),
64 flagging_mode="never",
65)
66
67demo.launch(share=True) # share=True untuk mendapatkan link publik
1{
2 "instruction": "Terjemahkan kata atau kalimat berikut dari bahasa Indonesia ke bahasa Gorontalo.",
3 "input": "bergotong royong",
4 "output": "mohuyula"
5}
Setiap entri memiliki pasangan terbalik (Indonesia→Gorontalo dan Gorontalo→Indonesia) untuk memastikan kemampuan terjemahan dua arah.
-
Bahasa Gorontalo bukan bahasa resmi di mBART-50 — Model menggunakan language code id_ID sebagai proxy karena mBART-50 tidak memiliki language code khusus untuk bahasa Gorontalo. Ini berarti model belajar "menerjemahkan" melalui mekanisme instruksi, bukan melalui language token yang sebenarnya.
-
Kualitas terjemahan bervariasi — Performa terbaik pada kata/frasa pendek yang ada di dataset training. Kalimat panjang atau kompleks mungkin kurang akurat.
-
Kata serapan dominan — Sebagian besar entri KBBI (~59%) adalah kata serapan yang dipertahankan bentuk aslinya. Ini berguna untuk cakupan kosakata tetapi bukan terjemahan "asli" Gorontalo.
-
Hardware training — Dilatih di Google Colab dengan Tesla T4 (15 GB VRAM) menggunakan gradient checkpointing dan mixed precision (FP16).
Model ini dirilis di bawah lisensi
CC BY-NC-SA 4.0.
Jika ada pertanyaan atau masukan, silakan buka
Issue di halaman model ini.