junaid17 commited on
Commit
44060ba
·
verified ·
1 Parent(s): 8b1322e

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +85 -98
main.py CHANGED
@@ -4,65 +4,59 @@ 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"
@@ -70,9 +64,13 @@ LORA_REPO = "junaid17/nllb-kurdish-lora"
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
 
@@ -89,83 +87,72 @@ def translate(text, src, tgt):
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()
 
4
  from peft import PeftModel
5
 
6
  # -----------------------------
7
+ # PAGE CONFIG + STYLE
8
  # -----------------------------
9
  st.set_page_config(page_title="Kurdish Translator", layout="wide")
10
 
 
11
  THEME = st.session_state.get("theme", "light")
12
 
13
+ bg = "#111111" if THEME == "dark" else "#ffffff"
14
+ fg = "#ffffff" if THEME == "dark" else "#000000"
15
+ card_bg = "rgba(255,255,255,0.07)" if THEME == "dark" else "rgba(0,0,0,0.05)"
 
 
 
16
 
17
  st.markdown(
18
  f"""
19
+ <style>
20
+ body {{
21
+ background-color: {bg};
22
+ color: {fg};
23
+ }}
24
+
25
+ .dots-loader {{
26
+ display: flex;
27
+ justify-content: center;
28
+ margin-top: 10px;
29
+ }}
30
+ .dots-loader div {{
31
+ width: 12px;
32
+ height: 12px;
33
+ margin: 4px;
34
+ background-color: #4A90E2;
35
+ border-radius: 50%;
36
+ animation: bounce 0.6s infinite alternate;
37
+ }}
38
+ .dots-loader div:nth-child(2) {{ animation-delay: 0.2s; }}
39
+ .dots-loader div:nth-child(3) {{ animation-delay: 0.4s; }}
40
+
41
+ @keyframes bounce {{
42
+ from {{ transform: translateY(0); }}
43
+ to {{ transform: translateY(-12px); }}
44
+ }}
45
+
46
+ .output-box {{
47
+ padding: 20px;
48
+ border-radius: 12px;
49
+ background: {card_bg};
50
+ font-size: 18px;
51
+ min-height: 120px;
52
+ }}
53
+ </style>
54
+ """,
 
 
55
  unsafe_allow_html=True
56
  )
57
 
58
  # -----------------------------
59
+ # LOAD MODEL WITH LOADER
60
  # -----------------------------
61
  BASE_MODEL = "facebook/nllb-200-distilled-600M"
62
  LORA_REPO = "junaid17/nllb-kurdish-lora"
 
64
 
65
  @st.cache_resource
66
  def load_model():
67
+ with st.spinner(""):
68
+ st.markdown("<div class='dots-loader'><div></div><div></div><div></div></div>", unsafe_allow_html=True)
69
+
70
+ tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL)
71
+ base = AutoModelForSeq2SeqLM.from_pretrained(BASE_MODEL)
72
+ model = PeftModel.from_pretrained(base, LORA_REPO)
73
+
74
  return model, tokenizer
75
 
76
 
 
87
  tokenizer=tokenizer,
88
  src_lang=src,
89
  tgt_lang=tgt,
90
+ max_length=256,
91
  )
92
+ return translator(text)[0]["translation_text"]
 
93
 
94
 
95
  # -----------------------------
96
+ # UI
97
  # -----------------------------
98
  st.title("Kurdish ↔ English Translator (NLLB + LoRA)")
99
 
100
+ col1, colSwap, colTheme, col2 = st.columns([1, 0.6, 0.8, 1])
 
 
 
 
101
 
102
  with col1:
103
+ src_lang = st.selectbox("From:", ["English", "Kurdish"])
104
+
105
+ with colSwap:
106
+ swap = st.button("⇆ Swap", use_container_width=True)
107
+
108
+ with colTheme:
109
+ toggle = st.button("🌙" if THEME == "light" else "☀️", use_container_width=True)
110
 
111
  with col2:
112
+ tgt_lang = st.selectbox("To:", ["Kurdish", "English"])
 
113
 
 
 
 
114
 
115
+ # Handle swap
116
  if swap:
117
+ src_lang, tgt_lang = tgt_lang, src_lang
118
+ st.session_state["LANG1"] = src_lang
119
+ st.session_state["LANG2"] = tgt_lang
120
  st.rerun()
121
 
122
+ # Handle dark/light switch
123
+ if toggle:
124
+ st.session_state["theme"] = "dark" if THEME == "light" else "light"
125
+ st.rerun()
126
+
127
+
128
+ # Language mapping
129
+ lang_codes = {
130
  "English": "eng_Latn",
131
  "Kurdish": "ckb_Arab"
132
  }
133
 
134
+ src_code = lang_codes[src_lang]
135
+ tgt_code = lang_codes[tgt_lang]
136
 
 
137
  text = st.text_area("Enter text:", height=180)
138
 
 
 
 
139
  # -----------------------------
140
+ # TRANSLATE BUTTON
141
  # -----------------------------
142
+ if st.button("Translate"):
143
  if not text.strip():
144
+ st.warning("Please enter some text.")
145
  else:
146
+ # Show 3-dot loader ONLY during translation
147
+ loader = st.markdown("<div class='dots-loader'><div></div><div></div><div></div></div>", unsafe_allow_html=True)
148
 
149
  output = translate(text, src_code, tgt_code)
150
 
151
+ # Remove loader
152
+ loader.empty()
 
 
 
 
 
 
153
 
154
+ st.subheader("Output")
155
+ st.markdown(f"<div class='output-box'>{output}</div>", unsafe_allow_html=True)
 
 
 
156
 
157
+ # Copy button
158
+ st.button("Copy Output", on_click=lambda: st.session_state.update({"copied": output}))