junaid17 commited on
Commit
8b1322e
·
verified ·
1 Parent(s): 71ed056

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +142 -33
main.py CHANGED
@@ -1,62 +1,171 @@
1
  import streamlit as st
 
2
  from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipeline
3
  from peft import PeftModel
4
 
5
- st.set_page_config(page_title="Kurdish Translator", layout="centered")
6
- st.title("Kurdish English Translator (NLLB + LoRA)")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
 
8
- # HuggingFace model repos
 
 
 
 
 
 
 
9
  BASE_MODEL = "facebook/nllb-200-distilled-600M"
10
- LORA_REPO = "junaid17/nllb-kurdish-lora" # <-- use HF model repo, NOT local folder
11
 
12
 
13
  @st.cache_resource
14
- def load_translation_pipeline(direction):
15
- # Load tokenizer
16
  tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL)
 
 
 
17
 
18
- # Load base NLLB model
19
- base_model = AutoModelForSeq2SeqLM.from_pretrained(BASE_MODEL)
20
 
21
- # Load LoRA adapter from HuggingFace Hub
22
- model = PeftModel.from_pretrained(base_model, LORA_REPO)
23
 
24
- # Language codes for NLLB
25
- if direction == "English → Kurdish":
26
- src = "eng_Latn"
27
- tgt = "ckb_Arab"
28
- else:
29
- src = "ckb_Arab"
30
- tgt = "eng_Latn"
31
 
32
- # Build translation pipeline
 
 
 
33
  translator = pipeline(
34
  "translation",
35
  model=model,
36
  tokenizer=tokenizer,
37
  src_lang=src,
38
  tgt_lang=tgt,
39
- max_length=256,
40
  )
 
 
41
 
42
- return translator
43
 
 
 
 
 
44
 
45
- # UI
46
- direction = st.selectbox(
47
- "Select Translation Direction",
48
- ["English Kurdish", "Kurdish → English"]
49
- )
50
 
51
- text = st.text_area("Enter your text:", height=180)
 
 
52
 
53
- if st.button("Translate"):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  if not text.strip():
55
- st.warning("Please enter some text.")
56
  else:
57
- with st.spinner("Translating..."):
58
- translator = load_translation_pipeline(direction)
59
- result = translator(text)[0]["translation_text"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
 
61
- st.subheader("Translation:")
62
- st.success(result)
 
 
1
  import streamlit as st
2
+ import torch
3
  from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipeline
4
  from peft import PeftModel
5
 
6
+ # -----------------------------
7
+ # PAGE CONFIG + CUSTOM CSS
8
+ # -----------------------------
9
+ st.set_page_config(page_title="Kurdish Translator", layout="wide")
10
+
11
+ # Dark/Light Mode
12
+ THEME = st.session_state.get("theme", "light")
13
+
14
+ if THEME == "dark":
15
+ bg_color = "#111111"
16
+ text_color = "#ffffff"
17
+ else:
18
+ bg_color = "#ffffff"
19
+ text_color = "#000000"
20
+
21
+ st.markdown(
22
+ f"""
23
+ <style>
24
+ body {{
25
+ background-color: {bg_color};
26
+ color: {text_color};
27
+ }}
28
+
29
+ /* 3 bouncing dots loader */
30
+ .dots-loader {{
31
+ display: flex;
32
+ justify-content: center;
33
+ margin-top: 20px;
34
+ }}
35
+ .dots-loader div {{
36
+ width: 12px;
37
+ height: 12px;
38
+ margin: 4px;
39
+ background-color: #4A90E2;
40
+ border-radius: 50%;
41
+ animation: bounce 0.6s infinite alternate;
42
+ }}
43
+ .dots-loader div:nth-child(2) {{ animation-delay: 0.2s; }}
44
+ .dots-loader div:nth-child(3) {{ animation-delay: 0.4s; }}
45
+
46
+ @keyframes bounce {{
47
+ from {{ transform: translateY(0); }}
48
+ to {{ transform: translateY(-12px); }}
49
+ }}
50
+
51
+ .output-box {{
52
+ padding: 20px;
53
+ border-radius: 12px;
54
+ background: rgba(0,0,0,0.05);
55
+ font-size: 18px;
56
+ min-height: 120px;
57
+ }}
58
 
59
+ </style>
60
+ """,
61
+ unsafe_allow_html=True
62
+ )
63
+
64
+ # -----------------------------
65
+ # LOAD MODEL ONCE (CACHED)
66
+ # -----------------------------
67
  BASE_MODEL = "facebook/nllb-200-distilled-600M"
68
+ LORA_REPO = "junaid17/nllb-kurdish-lora"
69
 
70
 
71
  @st.cache_resource
72
+ def load_model():
 
73
  tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL)
74
+ base = AutoModelForSeq2SeqLM.from_pretrained(BASE_MODEL)
75
+ model = PeftModel.from_pretrained(base, LORA_REPO)
76
+ return model, tokenizer
77
 
 
 
78
 
79
+ model, tokenizer = load_model()
 
80
 
 
 
 
 
 
 
 
81
 
82
+ # -----------------------------
83
+ # TRANSLATION FUNCTION
84
+ # -----------------------------
85
+ def translate(text, src, tgt):
86
  translator = pipeline(
87
  "translation",
88
  model=model,
89
  tokenizer=tokenizer,
90
  src_lang=src,
91
  tgt_lang=tgt,
92
+ max_length=256
93
  )
94
+ out = translator(text)[0]["translation_text"]
95
+ return out
96
 
 
97
 
98
+ # -----------------------------
99
+ # UI LOGIC
100
+ # -----------------------------
101
+ st.title("Kurdish ↔ English Translator (NLLB + LoRA)")
102
 
103
+ col1, col2, col3 = st.columns([1, 1, 1])
104
+
105
+ # Language options
106
+ LANG1 = st.session_state.get("LANG1", "English")
107
+ LANG2 = st.session_state.get("LANG2", "Kurdish")
108
 
109
+ with col1:
110
+ st.subheader("From:")
111
+ src_lang = st.selectbox("", ["English", "Kurdish"], index=0 if LANG1 == "English" else 1)
112
 
113
+ with col2:
114
+ st.write("")
115
+ swap = st.button("⇆ Swap Languages", key="swap_lang")
116
+
117
+ with col3:
118
+ st.subheader("To:")
119
+ tgt_lang = st.selectbox("", ["Kurdish", "English"], index=0 if LANG2 == "Kurdish" else 1)
120
+
121
+ # Swap action
122
+ if swap:
123
+ LANG1, LANG2 = LANG2, LANG1
124
+ st.session_state["LANG1"] = LANG1
125
+ st.session_state["LANG2"] = LANG2
126
+ st.rerun()
127
+
128
+ # Map language codes (NLLB)
129
+ lang_map = {
130
+ "English": "eng_Latn",
131
+ "Kurdish": "ckb_Arab"
132
+ }
133
+
134
+ src_code = lang_map[src_lang]
135
+ tgt_code = lang_map[tgt_lang]
136
+
137
+ # Input area
138
+ text = st.text_area("Enter text:", height=180)
139
+
140
+ # Translation button
141
+ translate_btn = st.button("Translate")
142
+
143
+ # -----------------------------
144
+ # TRANSLATION OUTPUT
145
+ # -----------------------------
146
+ if translate_btn:
147
  if not text.strip():
148
+ st.warning("Please enter some text...")
149
  else:
150
+ st.markdown("<div class='dots-loader'><div></div><div></div><div></div></div>", unsafe_allow_html=True)
151
+
152
+ output = translate(text, src_code, tgt_code)
153
+
154
+ st.subheader("Output")
155
+
156
+ st.markdown(
157
+ f"<div class='output-box'>{output}</div>",
158
+ unsafe_allow_html=True
159
+ )
160
+
161
+ st.button("Copy Translation", on_click=lambda: st.session_state.update({"copied": output}))
162
+
163
+ # -----------------------------
164
+ # DARK / LIGHT MODE BUTTON
165
+ # -----------------------------
166
+ st.write("---")
167
+ toggle = st.button("Toggle Dark / Light Mode")
168
 
169
+ if toggle:
170
+ st.session_state["theme"] = "dark" if THEME == "light" else "light"
171
+ st.rerun()