signlanguage / app.py
walaa2022's picture
Update app.py
3504203 verified
raw
history blame
6.42 kB
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()