File size: 2,027 Bytes
684aa3e
b912ba6
122790b
b912ba6
a6fc19e
 
 
 
 
 
e22e364
 
a6fc19e
122790b
 
 
b912ba6
 
dc03f7a
b912ba6
2c29438
111af19
dc03f7a
122790b
 
 
82cd661
a6fc19e
02a14aa
b912ba6
1dc6086
122790b
a6fc19e
122790b
 
ff2efaa
 
a6fc19e
122790b
 
 
 
dc03f7a
 
 
 
 
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
import streamlit as st
from transformers import MarianTokenizer, MarianMTModel
import torch

LANGUAGES = {
    "en": ("English", "English"), "fr": ("Français", "French"), "es": ("Español", "Spanish"),
    "de": ("Deutsch", "German"), "hi": ("हिन्दी", "Hindi"), "zh": ("中文", "Chinese"),
    "ar": ("العربية", "Arabic"), "ru": ("Русский", "Russian"), "ja": ("日本語", "Japanese")
}

@st.cache_resource
def _load_default_model():
    model_name = "Helsinki-NLP/opus-mt-en-hi"  
    tokenizer = MarianTokenizer.from_pretrained(model_name)
    model = MarianMTModel.from_pretrained(model_name)
    return tokenizer, model

@st.cache_resource
def load_model(source_lang, target_lang):
    try:
        if source_lang == target_lang:
            return _load_default_model()
        model_name = f"Helsinki-NLP/opus-mt-{source_lang}-{target_lang}"
        tokenizer = MarianTokenizer.from_pretrained(model_name)
        model = MarianMTModel.from_pretrained(model_name)
        return tokenizer, model
    except Exception as e:
        st.warning(f"No direct model for {source_lang} to {target_lang}. Using en-hi fallback.")
        return _load_default_model()

@st.cache_data(ttl=3600)
def translate_cached(text, source_lang, target_lang):
    tokenizer, model = load_model(source_lang, target_lang)
    inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True, max_length=500)
    with torch.no_grad():
        translated = model.generate(**inputs, max_length=500, num_beams=2, early_stopping=True)
    translated_text = tokenizer.decode(translated[0], skip_special_tokens=True)
    return translated_text if translated_text.strip() and len(translated_text.split()) >= 2 else text

def translate(text, source_lang, target_lang):
    if not text:
        return "No text provided."
    try:
        return translate_cached(text, source_lang, target_lang)
    except Exception as e:
        st.error(f"Translation error: {str(e)}. Using input as fallback.")
        return text