DonWare's picture
Update app.py
5132e53 verified
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()