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

@st.cache_resource
def _load_default_model():
    model_name = "Helsinki-NLP/opus-mt-en-fr"
    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 cached en-fr.")
        return _load_default_model()

@st.cache_data(ttl=3600)
def translate_cached(text, source_lang, target_lang):
    src_code = {"English": "en", "French": "fr", "Spanish": "es", "German": "de",
                "Hindi": "hi", "Chinese": "zh", "Arabic": "ar", "Russian": "ru", "Japanese": "ja"}.get(source_lang, "en")
    tgt_code = {"English": "en", "French": "fr", "Spanish": "es", "German": "de",
                "Hindi": "hi", "Chinese": "zh", "Arabic": "ar", "Russian": "ru", "Japanese": "ja"}.get(target_lang, "fr")
    tokenizer, model = load_model(src_code, tgt_code)
    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=4, early_stopping=True)  # Increased beams for speed
    return tokenizer.decode(translated[0], skip_special_tokens=True)

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

LANGUAGES = {"English": "en", "French": "fr", "Spanish": "es", "German": "de",
             "Hindi": "hi", "Chinese": "zh", "Arabic": "ar", "Russian": "ru", "Japanese": "ja"}