handaru2002 commited on
Commit
92bcc3d
Β·
verified Β·
1 Parent(s): 19ce21c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +141 -50
app.py CHANGED
@@ -1,97 +1,188 @@
1
  # ============================================================
2
- # Mesin Translasi Bahasa Jawa β†’ Indonesia β†’ English
3
- # MODEL: Argos Translate (Offline NMT)
4
- # CPU SAFE | NO TOKEN | HF SPACES READY
5
  # ============================================================
6
 
7
- import subprocess, sys
 
 
 
 
8
 
9
- def install(pkg):
10
- subprocess.check_call(
11
- [sys.executable, "-m", "pip", "install", pkg, "--quiet", "--root-user-action=ignore"]
12
- )
13
 
14
- install("pytz")
15
- install("gradio")
16
- install("argostranslate")
17
 
18
- import gradio as gr
19
- import argostranslate.package
20
- import argostranslate.translate
21
 
22
  # ============================================================
23
- # Install language packages (auto-download)
24
  # ============================================================
25
 
26
- def install_lang(from_code, to_code):
27
- packages = argostranslate.package.get_available_packages()
28
- pkg = next(
29
- p for p in packages
30
- if p.from_code == from_code and p.to_code == to_code
31
- )
32
- argostranslate.package.install_from_path(pkg.download())
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
- # Jawa β†’ Indonesia
35
- install_lang("jv", "id")
 
36
 
37
- # Indonesia β†’ English
38
- install_lang("id", "en")
 
 
39
 
40
  # ============================================================
41
- # Translation Function
42
  # ============================================================
43
 
44
- def translate_jawa(text):
45
  if not text.strip():
46
  return "", ""
47
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  # Jawa β†’ Indonesia
49
- indo = argostranslate.translate.translate(
50
- text,
51
- from_code="jv",
52
- to_code="id"
 
 
 
 
 
 
 
 
 
 
53
  )
54
 
 
 
 
 
 
 
55
  # Indonesia β†’ English
56
- eng = argostranslate.translate.translate(
57
- indo,
58
- from_code="id",
59
- to_code="en"
 
 
 
 
 
 
 
 
 
 
60
  )
61
 
62
- return indo, eng
 
 
 
 
 
63
 
64
  # ============================================================
65
  # Gradio UI
66
  # ============================================================
67
 
68
- with gr.Blocks(title="Mesin Translasi Bahasa Jawa") as demo:
 
69
  gr.Markdown("""
70
- ## 🌾 Mesin Translasi Bahasa Jawa
71
- **Jawa β†’ Indonesia β†’ English**
72
-
73
- βœ” Offline Neural MT (Argos)
74
- βœ” Tanpa API Key
75
- βœ” CPU-only
76
- βœ” Stabil & deterministik
77
- βœ” Cocok untuk penelitian & produksi
78
  """)
79
 
80
  input_text = gr.Textbox(
81
  label="Input Bahasa Jawa",
82
- placeholder="Contoh: Aku seneng sinau basa Jawa amarga iku warisan budaya.",
83
  lines=4
84
  )
85
 
86
  with gr.Row():
87
- output_id = gr.Textbox(label="Bahasa Indonesia", lines=4)
88
- output_en = gr.Textbox(label="English", lines=4)
89
 
90
  btn = gr.Button("πŸ”„ Terjemahkan")
 
91
  btn.click(
92
- fn=translate_jawa,
93
  inputs=input_text,
94
  outputs=[output_id, output_en]
95
  )
96
 
97
  demo.launch()
 
 
1
  # ============================================================
2
+ # FINAL β€” NLLB + RAG TRANSLATION SYSTEM
3
+ # Jawa β†’ Indonesia β†’ English
 
4
  # ============================================================
5
 
6
+ import gradio as gr
7
+ import pandas as pd
8
+ import numpy as np
9
+ import faiss
10
+ import torch
11
 
12
+ from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
13
+ from sentence_transformers import SentenceTransformer
 
 
14
 
15
+ # ============================================================
16
+ # Device
17
+ # ============================================================
18
 
19
+ device = "cuda" if torch.cuda.is_available() else "cpu"
 
 
20
 
21
  # ============================================================
22
+ # Load NLLB Model
23
  # ============================================================
24
 
25
+ MODEL_NAME = "facebook/nllb-200-distilled-600M"
26
+
27
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
28
+ model = AutoModelForSeq2SeqLM.from_pretrained(MODEL_NAME)
29
+
30
+ model.to(device)
31
+ model.eval()
32
+
33
+ # ============================================================
34
+ # Language Codes (NLLB official)
35
+ # ============================================================
36
+
37
+ JAV = "jav_Latn"
38
+ IND = "ind_Latn"
39
+ ENG = "eng_Latn"
40
+
41
+ # ============================================================
42
+ # Load Knowledge Base (Parallel Corpus)
43
+ # ============================================================
44
+
45
+ kb = pd.read_csv("kb_jawa_ngoko_krama_indonesia_100k.csv")
46
+
47
+ kb["jv"] = kb["jv"].astype(str)
48
+ kb["id"] = kb["id"].astype(str)
49
+
50
+ kb_texts = (
51
+ "Jawa: " + kb["jv"] +
52
+ " | Indonesia: " + kb["id"]
53
+ ).tolist()
54
+
55
+ # ============================================================
56
+ # Embedding Model (multilingual)
57
+ # ============================================================
58
+
59
+ embedder = SentenceTransformer(
60
+ "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
61
+ )
62
+
63
+ embeddings = embedder.encode(
64
+ kb_texts,
65
+ convert_to_numpy=True,
66
+ show_progress_bar=True
67
+ )
68
+
69
+ # ============================================================
70
+ # FAISS Index
71
+ # ============================================================
72
+
73
+ index = faiss.IndexFlatL2(embeddings.shape[1])
74
+ index.add(embeddings)
75
 
76
+ # ============================================================
77
+ # Retrieve Context
78
+ # ============================================================
79
 
80
+ def retrieve_context(text, k=3):
81
+ vec = embedder.encode([text])
82
+ _, I = index.search(vec, k)
83
+ return [kb_texts[i] for i in I[0]]
84
 
85
  # ============================================================
86
+ # Translation Function (RAG-Aware)
87
  # ============================================================
88
 
89
+ def translate_javanese(text):
90
  if not text.strip():
91
  return "", ""
92
 
93
+ # -------------------------------
94
+ # RAG Retrieval
95
+ # -------------------------------
96
+ contexts = retrieve_context(text, k=3)
97
+
98
+ rag_prompt = (
99
+ "Berikut adalah contoh terjemahan bahasa Jawa:\n"
100
+ + "\n".join(contexts)
101
+ + "\n\nTerjemahkan kalimat berikut dengan gaya formal dan alami:\n"
102
+ + text
103
+ )
104
+
105
+ # -------------------------------
106
  # Jawa β†’ Indonesia
107
+ # -------------------------------
108
+ tokenizer.src_lang = JAV
109
+
110
+ inputs = tokenizer(
111
+ rag_prompt,
112
+ return_tensors="pt",
113
+ truncation=True,
114
+ max_length=512
115
+ ).to(device)
116
+
117
+ gen_id = model.generate(
118
+ **inputs,
119
+ forced_bos_token_id=tokenizer.convert_tokens_to_ids(IND),
120
+ max_length=256
121
  )
122
 
123
+ id_text = tokenizer.batch_decode(
124
+ gen_id,
125
+ skip_special_tokens=True
126
+ )[0]
127
+
128
+ # -------------------------------
129
  # Indonesia β†’ English
130
+ # -------------------------------
131
+ tokenizer.src_lang = IND
132
+
133
+ inputs_en = tokenizer(
134
+ id_text,
135
+ return_tensors="pt",
136
+ truncation=True,
137
+ max_length=512
138
+ ).to(device)
139
+
140
+ gen_en = model.generate(
141
+ **inputs_en,
142
+ forced_bos_token_id=tokenizer.convert_tokens_to_ids(ENG),
143
+ max_length=256
144
  )
145
 
146
+ en_text = tokenizer.batch_decode(
147
+ gen_en,
148
+ skip_special_tokens=True
149
+ )[0]
150
+
151
+ return id_text, en_text
152
 
153
  # ============================================================
154
  # Gradio UI
155
  # ============================================================
156
 
157
+ with gr.Blocks(title="NLLB + RAG Javanese Translator") as demo:
158
+
159
  gr.Markdown("""
160
+ ## 🌾 Mesin Translasi Bahasa Jawa
161
+ **NLLB + Retrieval-Augmented Generation**
162
+
163
+ βœ” Parallel corpus 100.000 kalimat
164
+ βœ” Ngoko + Krama
165
+ βœ” Tanpa API key
166
+ βœ” Cocok penelitian, tesis, jurnal
 
167
  """)
168
 
169
  input_text = gr.Textbox(
170
  label="Input Bahasa Jawa",
171
+ placeholder="Kula badhe sowan dhateng griya eyang sesuk.",
172
  lines=4
173
  )
174
 
175
  with gr.Row():
176
+ output_id = gr.Textbox(label="Terjemahan Bahasa Indonesia", lines=4)
177
+ output_en = gr.Textbox(label="Translation to English", lines=4)
178
 
179
  btn = gr.Button("πŸ”„ Terjemahkan")
180
+
181
  btn.click(
182
+ fn=translate_javanese,
183
  inputs=input_text,
184
  outputs=[output_id, output_en]
185
  )
186
 
187
  demo.launch()
188
+