masadonline commited on
Commit
b28101a
·
verified ·
1 Parent(s): 6213d8d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +104 -93
app.py CHANGED
@@ -1,46 +1,63 @@
1
  import streamlit as st
2
  import os
3
- import requests
 
 
4
 
5
- # --- CONFIG ---
6
  SIGN_IMAGE_FOLDER = "sign_images"
7
- HF_TOKEN = os.getenv("HF_API_TOKEN")
8
- if not HF_TOKEN:
9
- st.error("Hugging Face API token not found. Please set 'HF_API_TOKEN' in your environment.")
10
- st.stop()
11
 
12
- HF_MODEL = "facebook/mbart-large-50-many-to-many-mmt"
13
-
14
- # --- STREAMLIT UI ---
15
  st.set_page_config(page_title="DeafTranslator", layout="centered")
16
  st.title("🤟 DeafTranslator")
17
- st.markdown("""
18
- Translate **Urdu ↔ English** and view it in **Sign Language** (ASL).
19
-
20
- You can also input ASL signs manually to reverse translate them into English and then Urdu.
21
- """)
22
 
23
- # --- HELPER FUNCTIONS ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
- def hf_translate(text, src_lang, tgt_lang):
26
- headers = {"Authorization": f"Bearer {HF_TOKEN}"}
27
- payload = {
28
- "inputs": text,
29
- "parameters": {"src_lang": src_lang, "tgt_lang": tgt_lang},
30
- "options": {"wait_for_model": True}
31
- }
32
- url = f"https://api-inference.huggingface.co/models/{HF_MODEL}"
33
  try:
34
- response = requests.post(url, headers=headers, json=payload)
35
- # Check if the response is empty or invalid
36
- if response.status_code != 200:
37
- return f"Error: Received status code {response.status_code}"
38
- result = response.json()
39
- if not result or not isinstance(result, list):
40
- return f"Error: Invalid response format. {response.text}"
41
- return result[0]["translation_text"]
42
- except Exception as e:
43
- return f"Error: {e}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
  def find_image_path(name):
46
  for ext in ["jpg", "JPG"]:
@@ -49,72 +66,66 @@ def find_image_path(name):
49
  return path
50
  return None
51
 
52
- def display_sign_language(text):
53
  st.markdown("### 👐 Sign Language Representation")
54
- if not text:
55
- st.warning("No translation available to display in ASL.")
56
- return
57
- words = text.lower().split()
58
-
59
  for word in words:
60
  st.markdown(f"**{word}**")
61
  cols = st.columns(len(word))
62
- for i, char in enumerate(word):
63
- if char.isalpha():
64
- img_path = find_image_path(char)
65
- if img_path:
66
- cols[i].image(img_path, caption=char.upper(), width=70)
67
- else:
68
- cols[i].warning(f"Missing: {char.upper()}")
69
- # Show space image between words
70
- space_img = find_image_path("space")
71
- if space_img:
72
- st.image(space_img, width=40)
73
 
74
- def render_sign_input():
75
- st.markdown("### Manual Sign Input (A–Z & Space)")
76
- selected_chars = st.multiselect(
77
- "Select ASL Signs in Order",
78
- options=[chr(i) for i in range(65, 91)] + ["space"],
79
- default=[]
80
- )
81
- return selected_chars
 
 
 
 
82
 
83
- # --- TRANSLATION SECTION ---
84
- tab1, tab2 = st.tabs(["Urdu English → ASL", "ASL English → Urdu"])
 
 
85
 
86
- with tab1:
87
- urdu_text = st.text_area("📝 Enter Urdu Text", height=150)
88
- if st.button("🔄 Translate & Show Signs"):
89
- if not urdu_text.strip():
90
- st.warning("Please enter Urdu text.")
91
- else:
92
- with st.spinner("Translating to English..."):
93
- english = hf_translate(urdu_text, "ur_PK", "en_XX")
94
- if "Error" in english or "Translation failed" in english:
95
- st.error(f"Translation failed: {english}")
96
- else:
97
- st.markdown("### English Translation")
98
- st.success(english)
99
- display_sign_language(english)
100
 
101
- with tab2:
102
- sign_sequence = render_sign_input()
103
- if st.button("🔁 Translate Signs"):
104
- if not sign_sequence:
105
- st.warning("Please select at least one sign.")
106
- else:
107
- english_text = " ".join(
108
- ''.join(c.lower() for c in group) if "space" not in group else ''.join(c.lower() for c in group if c != "space")
109
- for group in "".join(sign_sequence).split("space")
110
- )
111
- st.markdown("### 🔡 Interpreted English")
112
- st.success(english_text)
113
 
114
- with st.spinner("Translating to Urdu..."):
115
- urdu = hf_translate(english_text, "en_XX", "ur_PK")
116
- if "Error" in urdu or "Translation failed" in urdu:
117
- st.error(f"Translation failed: {urdu}")
118
- else:
119
- st.markdown("### 🌐 Urdu Translation")
120
- st.success(urdu)
 
 
 
 
 
 
1
  import streamlit as st
2
  import os
3
+ from PIL import Image
4
+ import argostranslate.package
5
+ import argostranslate.translate
6
 
 
7
  SIGN_IMAGE_FOLDER = "sign_images"
 
 
 
 
8
 
 
 
 
9
  st.set_page_config(page_title="DeafTranslator", layout="centered")
10
  st.title("🤟 DeafTranslator")
11
+ st.markdown("Translate **Urdu** text to **English** and view it in **Sign Language** (ASL). Or enter signs manually to reverse translate back to Urdu.")
 
 
 
 
12
 
13
+ @st.cache_resource
14
+ def load_argos_urdu_to_english():
15
+ try:
16
+ argostranslate.package.update_package_index()
17
+ available_packages = argostranslate.package.get_available_packages()
18
+ for pkg in available_packages:
19
+ if pkg.from_code == "ur" and pkg.to_code == "en":
20
+ argostranslate.package.install_from_path(pkg.download())
21
+ break
22
+ except Exception:
23
+ pass
24
+ installed_languages = argostranslate.translate.get_installed_languages()
25
+ from_lang = next((lang for lang in installed_languages if lang.code == "ur"), None)
26
+ to_lang = next((lang for lang in installed_languages if lang.code == "en"), None)
27
+ if from_lang and to_lang:
28
+ return from_lang.get_translation(to_lang)
29
+ return None
30
 
31
+ @st.cache_resource
32
+ def load_argos_english_to_urdu():
 
 
 
 
 
 
33
  try:
34
+ argostranslate.package.update_package_index()
35
+ available_packages = argostranslate.package.get_available_packages()
36
+ for pkg in available_packages:
37
+ if pkg.from_code == "en" and pkg.to_code == "ur":
38
+ argostranslate.package.install_from_path(pkg.download())
39
+ break
40
+ except Exception:
41
+ pass
42
+ installed_languages = argostranslate.translate.get_installed_languages()
43
+ from_lang = next((lang for lang in installed_languages if lang.code == "en"), None)
44
+ to_lang = next((lang for lang in installed_languages if lang.code == "ur"), None)
45
+ if from_lang and to_lang:
46
+ return from_lang.get_translation(to_lang)
47
+ return None
48
+
49
+ translator_ur_en = load_argos_urdu_to_english()
50
+ translator_en_ur = load_argos_english_to_urdu()
51
+
52
+ def translate_urdu_to_english(text):
53
+ if translator_ur_en:
54
+ return translator_ur_en.translate(text)
55
+ return ""
56
+
57
+ def translate_english_to_urdu(text):
58
+ if translator_en_ur:
59
+ return translator_en_ur.translate(text)
60
+ return ""
61
 
62
  def find_image_path(name):
63
  for ext in ["jpg", "JPG"]:
 
66
  return path
67
  return None
68
 
69
+ def display_sign_language(english_text):
70
  st.markdown("### 👐 Sign Language Representation")
71
+ words = english_text.lower().split()
 
 
 
 
72
  for word in words:
73
  st.markdown(f"**{word}**")
74
  cols = st.columns(len(word))
75
+ for i, c in enumerate(word):
76
+ img_path = find_image_path(c)
77
+ if img_path:
78
+ with cols[i]:
79
+ st.image(img_path, caption=c.upper(), width=80)
80
+ else:
81
+ st.warning(f"Missing image for: {c.upper()}")
82
+ space_path = find_image_path("space")
83
+ if space_path:
84
+ st.image(space_path, caption="", width=40)
 
85
 
86
+ # Urdu to Sign Language
87
+ st.header("🔹 Urdu to Sign Language")
88
+ urdu_text = st.text_area("📝 Enter Urdu Text", height=150)
89
+ if st.button("🔄 Translate & Show Signs"):
90
+ if urdu_text.strip():
91
+ english_translation = translate_urdu_to_english(urdu_text)
92
+ if english_translation:
93
+ st.markdown("### ✅ Translated English")
94
+ st.success(english_translation)
95
+ display_sign_language(english_translation)
96
+ else:
97
+ st.warning("Please enter some Urdu text.")
98
 
99
+ # Manual Input for Reverse
100
+ st.header("🔹 Manual ASL Input (A–Z & Space)")
101
+ if "manual_signs" not in st.session_state:
102
+ st.session_state.manual_signs = ""
103
 
104
+ cols1 = st.columns(13)
105
+ for i, c in enumerate("ABCDEFGHIJKLM"):
106
+ with cols1[i]:
107
+ if st.button(c):
108
+ st.session_state.manual_signs += c.lower()
109
+ cols2 = st.columns(14)
110
+ for i, c in enumerate("NOPQRSTUVWXYZ "):
111
+ label = "Space" if c == " " else c
112
+ val = " " if c == " " else c.lower()
113
+ with cols2[i]:
114
+ if st.button(label):
115
+ st.session_state.manual_signs += val
 
 
116
 
117
+ st.markdown("### 🔠 Current ASL Input")
118
+ st.code(st.session_state.manual_signs.strip())
 
 
 
 
 
 
 
 
 
 
119
 
120
+ if st.button("🔁 Translate Signs → English → Urdu"):
121
+ asl_input = st.session_state.manual_signs.strip()
122
+ if asl_input:
123
+ english_text = asl_input.replace(" ", " ")
124
+ st.markdown("### ✅ Detected English")
125
+ st.success(english_text)
126
+ urdu_text = translate_english_to_urdu(english_text)
127
+ if urdu_text:
128
+ st.markdown("### 🇵🇰 Urdu Translation")
129
+ st.success(urdu_text)
130
+ else:
131
+ st.warning("Please input some ASL letters.")