Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from transformers import MarianMTModel, MarianTokenizer | |
| import torch | |
| # Limitar threads de CPU para optimizar | |
| torch.set_num_threads(4) | |
| # Diccionario de modelos multilenguaje OPUS-MT (origen -> destino) | |
| modelos = { | |
| ("mul", "en"): "Helsinki-NLP/opus-mt-mul-en", | |
| ("en", "es"): "Helsinki-NLP/opus-mt-en-es", | |
| ("es", "en"): "Helsinki-NLP/opus-mt-es-en", | |
| ("en", "fr"): "Helsinki-NLP/opus-mt-en-fr", | |
| ("fr", "en"): "Helsinki-NLP/opus-mt-fr-en", | |
| } | |
| # Cache de modelos cargados | |
| modelo_cache = {} | |
| # Función para cargar modelo y tokenizer según idioma (caché) | |
| def cargar_modelo(origen, destino): | |
| key = (origen, destino) | |
| if key in modelo_cache: | |
| return modelo_cache[key] | |
| model_name = modelos.get(key, "Helsinki-NLP/opus-mt-mul-en") | |
| tokenizer = MarianTokenizer.from_pretrained(model_name) | |
| model = MarianMTModel.from_pretrained(model_name) | |
| modelo_cache[key] = (tokenizer, model) | |
| return tokenizer, model | |
| # Dividir texto en fragmentos ≤512 tokens | |
| def dividir_texto(texto, max_len=512): | |
| palabras = texto.split() | |
| fragmentos = [] | |
| fragmento = [] | |
| for palabra in palabras: | |
| fragmento.append(palabra) | |
| if len(fragmento) >= max_len: | |
| fragmentos.append(" ".join(fragmento)) | |
| fragmento = [] | |
| if fragmento: | |
| fragmentos.append(" ".join(fragmento)) | |
| return fragmentos | |
| # Función de traducción optimizada para textos largos | |
| def traducir_fragmentos(texto, idioma_origen, idioma_destino): | |
| tokenizer, model = cargar_modelo(idioma_origen, idioma_destino) | |
| fragmentos = dividir_texto(texto, max_len=512) | |
| traduccion = [] | |
| for frag in fragmentos: | |
| inputs = tokenizer(frag, return_tensors="pt", padding=True, truncation=True) | |
| translated = model.generate(**inputs, max_length=512) | |
| traduccion.append(tokenizer.decode(translated[0], skip_special_tokens=True)) | |
| return " ".join(traduccion) | |
| # Lista de idiomas disponibles | |
| idiomas = ["mul", "en", "es", "fr"] | |
| # Crear interfaz Gradio | |
| iface = gr.Interface( | |
| fn=traducir_fragmentos, | |
| inputs=[ | |
| gr.Textbox(label="Texto a traducir", lines=8, placeholder="Escribe aquí..."), | |
| gr.Dropdown(idiomas, label="Idioma origen", value="mul"), | |
| gr.Dropdown(idiomas, label="Idioma destino", value="en") | |
| ], | |
| outputs=gr.Textbox(label="Traducción"), | |
| title="Traductor Multilenguaje OPUS-MT", | |
| description="Traduce textos largos entre múltiples idiomas usando OPUS-MT en CPU. Optimizado para uso comercial." | |
| ) | |
| iface.launch() | |