🌺 Tuwili — Model Penerjemah Indonesia ↔ Gorontalo

Model AI pertama untuk menerjemahkan antara Bahasa Indonesia dan Bahasa Gorontalo (Hulontalo)

License: CC BY-NC-SA 4.0 Model: mBART-50 Dataset: 309K


📖 Tentang Tuwili

Tuwili adalah model Neural Machine Translation (NMT) yang di-fine-tune dari mBART-50 untuk menerjemahkan secara dua arah (bidirectional) antara:

  • 🇮🇩 Bahasa IndonesiaBahasa Gorontalo (Hulontalo)
  • 🏝️ Bahasa Gorontalo (Hulontalo) → Bahasa Indonesia

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.


🚀 Cara Menggunakan

Instalasi

pip install transformers sentencepiece protobuf torch gradio

Quick Start (Python)

from transformers import MBartForConditionalGeneration, MBart50TokenizerFast

# Muat model
model_name = "datanikah9/tuwili"
tokenizer = MBart50TokenizerFast.from_pretrained(model_name)
model = MBartForConditionalGeneration.from_pretrained(model_name)

tokenizer.src_lang = "id_ID"

def translate(text, direction="id2gor"):
    """
    Terjemahkan teks.
    direction: "id2gor" (Indonesia → Gorontalo) atau "gor2id" (sebaliknya)
    """
    if direction == "id2gor":
        prompt = f"Terjemahkan kata atau kalimat berikut dari bahasa Indonesia ke bahasa Gorontalo. {text}"
    else:
        prompt = f"Terjemahkan kata atau kalimat berikut dari bahasa Gorontalo ke bahasa Indonesia. {text}"

    inputs = tokenizer(prompt, return_tensors="pt", max_length=128, truncation=True)
    generated = model.generate(
        **inputs,
        max_length=64,
        num_beams=5,
        forced_bos_token_id=tokenizer.lang_code_to_id["id_ID"],
    )
    return tokenizer.decode(generated[0], skip_special_tokens=True)

# Contoh penggunaan
print(translate("Selamat pagi", direction="id2gor"))
print(translate("kumando", direction="gor2id"))
print(translate("Saya makan nasi", direction="id2gor"))

Batch Translation

def translate_batch(texts, direction="id2gor", batch_size=16):
    results = []
    for i in range(0, len(texts), batch_size):
        batch = texts[i:i+batch_size]
        if direction == "id2gor":
            prompts = [f"Terjemahkan kata atau kalimat berikut dari bahasa Indonesia ke bahasa Gorontalo. {t}" for t in batch]
        else:
            prompts = [f"Terjemahkan kata atau kalimat berikut dari bahasa Gorontalo ke bahasa Indonesia. {t}" for t in batch]

        inputs = tokenizer(prompts, return_tensors="pt", max_length=128, truncation=True, padding=True)
        generated = model.generate(**inputs, max_length=64, num_beams=5, forced_bos_token_id=tokenizer.lang_code_to_id["id_ID"])
        results.extend(tokenizer.batch_decode(generated, skip_special_tokens=True))
    return results

# Terjemahkan banyak kata sekaligus
words = ["Rumah", "Air", "Terima kasih", "Selamat malam"]
translations = translate_batch(words)

🎨 Demo Interaktif dengan Gradio

Jalankan aplikasi web lokal untuk mencoba model secara interaktif:

import gradio as gr
import torch
from transformers import MBartForConditionalGeneration, MBart50TokenizerFast

# Muat model
print("⏳ Memuat model Tuwili...")
model_name = "datanikah9/tuwili"
tokenizer = MBart50TokenizerFast.from_pretrained(model_name)
model = MBartForConditionalGeneration.from_pretrained(
    model_name,
    torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32
)
device = "cuda" if torch.cuda.is_available() else "cpu"
model = model.to(device)
model.eval()
tokenizer.src_lang = "id_ID"
print("✅ Model siap!")

def terjemahkan(teks, arah):
    if not teks.strip():
        return "⚠️ Masukkan teks terlebih dahulu."

    if arah == "🇮🇩 Indonesia → Gorontalo":
        prompt = f"Terjemahkan kata atau kalimat berikut dari bahasa Indonesia ke bahasa Gorontalo. {teks}"
    else:
        prompt = f"Terjemahkan kata atau kalimat berikut dari bahasa Gorontalo ke bahasa Indonesia. {teks}"

    inputs = tokenizer(prompt, return_tensors="pt", max_length=128, truncation=True).to(device)
    with torch.no_grad():
        generated = model.generate(
            **inputs,
            max_length=64,
            num_beams=5,
            forced_bos_token_id=tokenizer.lang_code_to_id["id_ID"],
        )
    return tokenizer.decode(generated[0], skip_special_tokens=True)

# Bangun antarmuka Gradio
demo = gr.Interface(
    fn=terjemahkan,
    inputs=[
        gr.Textbox(
            label="Teks",
            placeholder="Ketik kata atau kalimat di sini...",
            lines=3,
        ),
        gr.Radio(
            choices=["🇮🇩 Indonesia → Gorontalo", "🏝️ Gorontalo → Indonesia"],
            value="🇮🇩 Indonesia → Gorontalo",
            label="Arah Terjemahan",
        ),
    ],
    outputs=gr.Textbox(label="Hasil Terjemahan", lines=3),
    title="🌺 Tuwili — Penerjemah Indonesia ↔ Gorontalo",
    description="Model AI untuk menerjemahkan antara Bahasa Indonesia dan Bahasa Gorontalo (Hulontalo).",
    examples=[
        ["Selamat pagi", "🇮🇩 Indonesia → Gorontalo"],
        ["Terima kasih", "🇮🇩 Indonesia → Gorontalo"],
        ["Saya makan nasi", "🇮🇩 Indonesia → Gorontalo"],
        ["kumando", "🏝️ Gorontalo → Indonesia"],
        ["bele", "🏝️ Gorontalo → Indonesia"],
    ],
    theme=gr.themes.Soft(),
    flagging_mode="never",
)

demo.launch(share=True)  # share=True untuk mendapatkan link publik

Setelah dijalankan, buka browser di http://localhost:7860 atau gunakan link publik yang ditampilkan di terminal.

Tip: Di Google Colab, tambahkan demo.launch(share=True, debug=True) agar bisa diakses dari luar.


📊 Detail Training

Konfigurasi Model

Parameter Nilai
Base Model facebook/mbart-large-50-many-to-many-mmt
Arsitektur MBartForConditionalGeneration (Encoder-Decoder Transformer)
Total Parameter 611 Juta
Encoder/Decoder Layers 12 / 12
Attention Heads 16
Hidden Size (d_model) 1024
FFN Dim 4096
Vocab Size 250.054
Format Weights SafeTensors

Hyperparameters Training

Parameter Nilai
Epochs 3
Batch Size 8 (per device)
Gradient Accumulation 4 steps
Effective Batch Size 32
Learning Rate 5e-5
LR Scheduler Cosine
Warmup Steps 500
Weight Decay 0.01
Max Source Length 128 tokens
Max Target Length 64 tokens
Precision FP16 (Mixed Precision)
Gradient Checkpointing ✅ (saat training)
Optimizer AdamW

Hasil Training

Metrik Nilai
Total Training Steps 27.591
Train Loss (awal) 25.52
Train Loss (akhir) 1.54
Penurunan Loss 94%
Best Eval Loss 0.6733
Total FLOPs 2.39 × 10¹⁷

Kurva Konvergensi

Training menunjukkan konvergensi yang baik:

  • Loss turun drastis pada 500 step pertama (dari 25.5 ke ~4.5)
  • Stabil konvergen di sekitar step 20.000+
  • Eval loss stabil di ~0.673 pada 3 evaluasi terakhir → tidak ada tanda overfitting

📁 Dataset {#dataset}

Model ini dilatih menggunakan 309.788 instruksi fine-tuning dua arah (bidirectional) dalam format Alpaca:

Komposisi Dataset

Sumber Jumlah Entri Deskripsi
Kamus Gorontalo-Indonesia (bidirectional) 102.782 Kosa kata dan frasa asli bahasa Gorontalo
KBBI v6.1.0 — Mapped 24.628 Kata KBBI yang ditemukan padanan Gorontalo-nya
KBBI v6.1.0 — Loanwords (Serapan) 182.378 Istilah teknis/akademik yang dipertahankan sebagai kata serapan
Total 309.788

Format Data (Alpaca)

{
  "instruction": "Terjemahkan kata atau kalimat berikut dari bahasa Indonesia ke bahasa Gorontalo.",
  "input": "bergotong royong",
  "output": "mohuyula"
}

Setiap entri memiliki pasangan terbalik (Indonesia→Gorontalo dan Gorontalo→Indonesia) untuk memastikan kemampuan terjemahan dua arah.


⚠️ Batasan & Catatan

  1. 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.

  2. Kualitas terjemahan bervariasi — Performa terbaik pada kata/frasa pendek yang ada di dataset training. Kalimat panjang atau kompleks mungkin kurang akurat.

  3. 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.

  4. Hardware training — Dilatih di Google Colab dengan Tesla T4 (15 GB VRAM) menggunakan gradient checkpointing dan mixed precision (FP16).


🏷️ Informasi Teknis

  • Framework: PyTorch + Hugging Face Transformers v5.13.1
  • Tokenizer: MBart50TokenizerFast (SentencePiece-based)
  • Format: SafeTensors (lebih aman dan cepat dari PyTorch .bin)
  • Ukuran Model: ~2.44 GB
  • Kompatibilitas: Transformers ≥ 4.30.0

📜 Lisensi

Model ini dirilis di bawah lisensi CC BY-NC-SA 4.0.

  • ✅ Boleh digunakan untuk riset dan edukasi
  • ✅ Boleh dimodifikasi dan didistribusikan ulang (dengan atribusi)
  • ❌ Tidak boleh digunakan untuk tujuan komersial tanpa izin
  • ⚠️ Data KBBI adalah milik Badan Pengembangan dan Pembinaan Bahasa, Kemdikbudristek RI

🙏 Ucapan Terima Kasih


📧 Kontak

Jika ada pertanyaan atau masukan, silakan buka Issue di halaman model ini.

Downloads last month
24
Safetensors
Model size
0.6B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for datanikah9/tuwili

Finetuned
(266)
this model

Space using datanikah9/tuwili 1

Evaluation results