File size: 3,855 Bytes
c65f390
16af00e
fd505dd
 
c65f390
fd505dd
 
ba67b2a
 
 
 
fd505dd
 
 
 
 
ba67b2a
 
fd505dd
ba67b2a
fd505dd
ba67b2a
fd505dd
 
 
 
 
 
 
ba67b2a
 
 
 
 
 
fd505dd
 
 
 
 
 
ba67b2a
fd505dd
ba67b2a
fd505dd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c65f390
fd505dd
 
 
 
 
 
ba67b2a
fd505dd
 
ba67b2a
fd505dd
ba67b2a
fd505dd
ba67b2a
 
 
 
 
 
 
 
 
 
 
 
fd505dd
 
 
 
 
 
 
ba67b2a
fd505dd
 
 
 
 
 
 
 
ba67b2a
fd505dd
ba67b2a
fd505dd
ba67b2a
 
fd505dd
 
030831c
ba67b2a
030831c
 
fd505dd
 
030831c
fd505dd
 
 
030831c
c65f390
 
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
# 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()