Spaces:
Sleeping
Sleeping
File size: 6,420 Bytes
52881b0 30e8ad8 52881b0 30e8ad8 3504203 30e8ad8 3504203 30e8ad8 3504203 52881b0 3504203 52881b0 30e8ad8 3504203 30e8ad8 3504203 52881b0 3504203 30e8ad8 3504203 30e8ad8 3504203 30e8ad8 3504203 30e8ad8 3504203 30e8ad8 3504203 30e8ad8 3504203 52881b0 30e8ad8 3504203 30e8ad8 3504203 30e8ad8 3504203 30e8ad8 3504203 30e8ad8 3504203 30e8ad8 3504203 30e8ad8 52881b0 30e8ad8 52881b0 30e8ad8 3504203 30e8ad8 3504203 30e8ad8 52881b0 3504203 52881b0 30e8ad8 3504203 30e8ad8 3504203 30e8ad8 3504203 30e8ad8 3504203 52881b0 30e8ad8 52881b0 30e8ad8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
import os
import sys
import gradio as gr
# Install required packages if not already installed
try:
import sign_language_translator as slt
import requests
except ImportError:
print("Installing required packages...")
os.system("pip install sign-language-translator requests --quiet")
import sign_language_translator as slt
import requests
TITLE = "English to Pakistan Sign Language Translator"
DESCRIPTION = """This app translates English text to Pakistan Sign Language by first converting English to Urdu (which may improve vocabulary coverage), then using the Urdu text to generate sign language videos.
**NOTE:**
- The initial translation to Urdu uses a simple API-based translation
- First-time loading may take a moment as the model downloads
- For best results, use simple sentences
"""
# Global model variable
model = None
def get_model():
"""Initialize the sign language translation model"""
try:
return slt.models.ConcatenativeSynthesis("ur", "pk-sl", "video")
except Exception as e:
print(f"Error initializing model: {str(e)}")
return None
def initialize_model():
"""Ensure model is loaded"""
global model
if model is None:
model = get_model()
return model is not None
def english_to_urdu(text):
"""Translate English text to Urdu using a translation API"""
if not text:
return "", "Please enter text to translate"
try:
# Using MyMemory translation API (free and doesn't require auth)
url = f"https://api.mymemory.translated.net/get?q={text}&langpair=en|ur"
response = requests.get(url)
data = response.json()
if "responseData" in data and "translatedText" in data["responseData"]:
urdu_text = data["responseData"]["translatedText"]
return urdu_text, f"Translated to Urdu: {urdu_text}"
else:
return "", "Error: Could not translate to Urdu"
except Exception as e:
print(f"Translation API error: {str(e)}")
return "", f"Error during Urdu translation: {str(e)}"
def urdu_to_sign(urdu_text, format_type):
"""Translate Urdu text to Pakistan Sign Language"""
if not urdu_text:
return None, "No Urdu text to translate"
# Initialize model if not already done
if not initialize_model():
return None, "Failed to initialize the translation model"
try:
# Configure model
model.text_language = "ur" # Urdu
model.sign_language = "pk-sl" # Pakistan Sign Language
model.sign_format = format_type
if format_type == "landmarks":
model.sign_embedding_model = "mediapipe-world"
# Translate
output_path = "output.mp4"
sign = model.translate(urdu_text)
# Save output
if isinstance(sign, slt.Landmarks):
# Position hands correctly
sign.data[:, 33:54, :3] += -sign.data[:, 33:34, :3] + sign.data[:, 15:16, :3]
sign.data[:, 54:, :3] += -sign.data[:, 54:55, :3] + sign.data[:, 16:17, :3]
sign.save_animation(output_path, overwrite=True)
else:
sign.save(output_path, overwrite=True, codec="mp4v")
return output_path, f"Successfully created sign language video"
except Exception as e:
error_msg = str(e)
print(f"Sign generation error: {error_msg}")
return None, f"Error generating signs: {error_msg}"
def translate_english_to_sign(english_text, format_type):
"""Complete translation pipeline: English → Urdu → Sign Language"""
if not english_text:
return None, ""
# Step 1: Translate English to Urdu
urdu_text, urdu_status = english_to_urdu(english_text)
if not urdu_text:
return None, urdu_status
# Step 2: Translate Urdu to Sign Language
video, sign_status = urdu_to_sign(urdu_text, format_type)
# Combine status messages
status = f"English: \"{english_text}\"\nUrdu: \"{urdu_text}\"\n{sign_status}"
return video, status
# Create the Gradio interface
with gr.Blocks(title=TITLE) as demo:
gr.Markdown(f"# {TITLE}")
gr.Markdown(DESCRIPTION)
with gr.Row():
with gr.Column():
# Input area
english_input = gr.Textbox(
lines=4,
placeholder="Enter English text here...",
label="English Text"
)
format_dropdown = gr.Dropdown(
choices=["video", "landmarks"],
value="video",
label="Output Format"
)
with gr.Row():
clear_btn = gr.Button("Clear")
translate_btn = gr.Button("Translate", variant="primary")
# Intermediate Urdu translation
urdu_output = gr.Textbox(label="Urdu Translation", interactive=False)
# Status area
status_output = gr.Textbox(label="Status", interactive=False)
with gr.Column():
# Output video
video_output = gr.Video(
label="Sign Language Output",
format="mp4",
autoplay=True,
show_download_button=True
)
# Examples
gr.Examples(
examples=[
["How are you?", "video"],
["My name is John.", "video"],
["Thank you for your help.", "video"],
["I want to learn sign language.", "video"]
],
inputs=[english_input, format_dropdown],
outputs=[video_output, urdu_output, status_output],
fn=lambda text, fmt: (*translate_english_to_sign(text, fmt), english_to_urdu(text)[0])
)
# Event handlers
def handle_translation(text, fmt):
video, status = translate_english_to_sign(text, fmt)
urdu = english_to_urdu(text)[0] if text else ""
return video, urdu, status
translate_btn.click(
fn=handle_translation,
inputs=[english_input, format_dropdown],
outputs=[video_output, urdu_output, status_output]
)
clear_btn.click(
fn=lambda: ("", "", "Input cleared"),
inputs=None,
outputs=[english_input, urdu_output, status_output]
)
# Launch the app
if __name__ == "__main__":
demo.launch() |