github-actions[bot]
Sync from GitHub (HuggingFaceIntegerations)
c341525
from functools import lru_cache
from typing import Literal, Any
import gradio as gr
from transformers import pipeline
from indic_transliteration import sanscript
from indic_transliteration.sanscript import transliterate
import os
os.environ["TF_ENABLE_ONEDNN_OPTS"] = "0" # silences oneDNN
# Model identifiers (Helsinki-NLP MarianMT models)
HI_EN_MODEL = "Helsinki-NLP/opus-mt-hi-en"
EN_HI_MODEL = "Helsinki-NLP/opus-mt-en-hi"
TaskType = Literal[
"Hindi → English",
"English → Hindi",
"Hindi → Hinglish (transliteration)",
]
@lru_cache(maxsize=None)
def get_hi_en_pipe() -> pipeline:
"""Lazy-load Hindi → English translation pipeline"""
return pipeline("translation", model=HI_EN_MODEL)
@lru_cache(maxsize=None)
def get_en_hi_pipe() -> pipeline:
"""Lazy-load English → Hindi translation pipeline"""
return pipeline("translation", model=EN_HI_MODEL)
def translate(
text: str | None,
task: TaskType,
max_length: int = 256,
) -> str:
"""
Main translation function used by the Gradio interface.
Handles empty input gracefully and supports three tasks.
"""
text = (text or "").strip()
if not text:
return ""
try:
if task == "Hindi → English":
pipe = get_hi_en_pipe()
result = pipe(
text,
max_length=max_length,
num_beams=4,
early_stopping=True,
)
return result[0]["translation_text"]
if task == "English → Hindi":
pipe = get_en_hi_pipe()
result = pipe(
text,
max_length=max_length,
num_beams=4,
early_stopping=True,
)
return result[0]["translation_text"]
if task == "Hindi → Hinglish (transliteration)":
return transliterate(text, sanscript.DEVANAGARI, sanscript.ITRANS)
return "Unsupported task selected"
except (ValueError, RuntimeError, OSError) as e:
return f"Translation error: {str(e)}"
except Exception as e: # pylint: disable=broad-exception-caught
return f"Unexpected error during translation: {str(e)}"
def build_demo() -> gr.Blocks:
"""Build and configure the Gradio interface"""
with gr.Blocks(title="Hindi ↔ English + Hinglish Translator") as demo:
gr.Markdown(
"""
# Hindi ↔ English + Hinglish Translator
- **Hindi → English** & **English → Hindi**: Neural machine translation
- **Hindi → Hinglish**: Roman transliteration (Devanagari → ITRANS)
"""
)
with gr.Row():
task = gr.Dropdown(
choices=[
"Hindi → English",
"English → Hindi",
"Hindi → Hinglish (transliteration)",
],
value="Hindi → English",
label="Task",
interactive=True,
)
max_len = gr.Slider(
32, 512, value=256, step=16,
label="Max output length",
info="Higher values allow longer translations (slower)",
)
input_text = gr.Textbox(
label="Input text",
lines=5,
placeholder="नमस्ते दुनिया! या Hello world...",
)
translate_btn = gr.Button("Translate", variant="primary")
output_text = gr.Textbox(
label="Output",
lines=5,
interactive=False,
)
translate_btn.click(
fn=translate,
inputs=[input_text, task, max_len],
outputs=output_text,
)
gr.Examples(
examples=[
["नमस्ते! सब ठीक है?", "Hindi → English", 128],
["How are you today?", "English → Hindi", 128],
["नमस्ते भाई, क्या हाल है?", "Hindi → Hinglish (transliteration)", 128],
["खुश रहो और मुस्कुराते रहो", "Hindi → Hinglish (transliteration)", 128],
],
inputs=[input_text, task, max_len],
label="Quick examples",
)
return demo
demo = build_demo()
if __name__ == "__main__":
# pragma: no cover - UI launch not tested
demo.launch(
# share=False,
# inbrowser=False,
# server_name="0.0.0.0",
# server_port=7860,
)