lalaru's picture
Update app.py
ba67b2a verified
# app.py
import os
import json
import requests
import gradio as gr
from langdetect import detect, LangDetectException
# Hugging Face Transformers
from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer
# Groq SDK
try:
from groq import Groq
except Exception:
Groq = None
# Config
GROQ_API_KEY = os.getenv("GROQ_API_KEY")
GROQ_MODEL = os.getenv("GROQ_MODEL", "mixtral-8x7b-32768")
HUGGINGFACE_TOKEN = os.getenv("HUGGINGFACE_TOKEN")
# Init Groq
groq_client = None
if GROQ_API_KEY and Groq is not None:
try:
groq_client = Groq(api_key=GROQ_API_KEY)
except Exception as e:
print("Groq client init failed:", repr(e))
# Universal translation model
m2m_model_name = "facebook/m2m100_418M"
m2m_tokenizer = M2M100Tokenizer.from_pretrained(m2m_model_name)
m2m_model = M2M100ForConditionalGeneration.from_pretrained(m2m_model_name)
# UI mapping
LANG_UI_TO_CODE = {"English": "en", "Spanish": "es", "French": "fr"}
SYSTEM_PROMPT = """
You are a multilingual translation assistant.
Task:
1. Detect the input language automatically.
2. Translate into the requested target language.
3. Preserve meaning, tone, and formatting.
4. Keep numbers, symbols, names, and special characters unchanged.
5. If the input is already in the target language, return it unchanged.
"""
def call_groq(user_text, target_lang_ui):
if not groq_client:
raise RuntimeError("Groq client not configured")
messages = [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": f"Target language: {target_lang_ui}\n\n{user_text}"},
]
chat = groq_client.chat.completions.create(
model=GROQ_MODEL,
messages=messages,
temperature=0,
max_tokens=2048,
)
try:
return chat.choices[0].message.content.strip()
except Exception:
try:
return chat["choices"][0]["message"]["content"].strip()
except Exception as e:
print("Unexpected Groq response:", repr(e))
raise
def call_m2m(user_text, target_code):
try:
src_code = detect(user_text)
except LangDetectException:
src_code = "en" # fallback
# if already target language β†’ return as-is
if src_code == target_code:
return user_text
m2m_tokenizer.src_lang = src_code
encoded = m2m_tokenizer(user_text, return_tensors="pt")
generated = m2m_model.generate(
**encoded, forced_bos_token_id=m2m_tokenizer.get_lang_id(target_code)
)
return m2m_tokenizer.decode(generated[0], skip_special_tokens=True)
def translate_text(user_text, target_lang_ui):
user_text = (user_text or "").strip()
if not user_text:
return "⚠️ Please enter some text to translate."
target_code = LANG_UI_TO_CODE.get(target_lang_ui, "en")
# Try Groq first
try:
if groq_client:
out = call_groq(user_text, target_lang_ui)
if out:
return out
except Exception as e:
print("Groq call failed:", repr(e))
# Fallback β†’ M2M100 universal translator
try:
return call_m2m(user_text, target_code)
except Exception as e:
print("M2M100 translation failed:", repr(e))
return "❌ Translation failed. Check logs."
# ----------------- Gradio UI -----------------
with gr.Blocks() as demo:
gr.Markdown("## 🌐 Hackathon Translator (Universal)")
with gr.Row():
txt = gr.Textbox(label="Enter your text", lines=6, placeholder="Type or paste text here...")
tgt = gr.Dropdown(choices=["English","Spanish","French"], value="English", label="Target Language")
out = gr.Textbox(label="Translated Output", lines=6)
btn = gr.Button("Translate")
btn.click(fn=translate_text, inputs=[txt, tgt], outputs=[out])
if __name__ == "__main__":
demo.launch()