Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,5 +1,9 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
from transformers import MarianMTModel, MarianTokenizer
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
|
| 4 |
# Diccionario de modelos multilenguaje OPUS-MT (origen -> destino)
|
| 5 |
modelos = {
|
|
@@ -10,35 +14,59 @@ modelos = {
|
|
| 10 |
("fr", "en"): "Helsinki-NLP/opus-mt-fr-en",
|
| 11 |
}
|
| 12 |
|
| 13 |
-
#
|
|
|
|
|
|
|
|
|
|
| 14 |
def cargar_modelo(origen, destino):
|
| 15 |
key = (origen, destino)
|
|
|
|
|
|
|
| 16 |
model_name = modelos.get(key, "Helsinki-NLP/opus-mt-mul-en")
|
| 17 |
tokenizer = MarianTokenizer.from_pretrained(model_name)
|
| 18 |
model = MarianMTModel.from_pretrained(model_name)
|
|
|
|
| 19 |
return tokenizer, model
|
| 20 |
|
| 21 |
-
#
|
| 22 |
-
def
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
tokenizer, model = cargar_modelo(idioma_origen, idioma_destino)
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
|
| 28 |
# Lista de idiomas disponibles
|
| 29 |
idiomas = ["mul", "en", "es", "fr"]
|
| 30 |
|
| 31 |
# Crear interfaz Gradio
|
| 32 |
iface = gr.Interface(
|
| 33 |
-
fn=
|
| 34 |
inputs=[
|
| 35 |
-
gr.Textbox(label="Texto a traducir", lines=
|
| 36 |
gr.Dropdown(idiomas, label="Idioma origen", value="mul"),
|
| 37 |
gr.Dropdown(idiomas, label="Idioma destino", value="en")
|
| 38 |
],
|
| 39 |
outputs=gr.Textbox(label="Traducción"),
|
| 40 |
title="Traductor Multilenguaje OPUS-MT",
|
| 41 |
-
description="Traduce textos entre múltiples idiomas usando OPUS-MT en CPU."
|
| 42 |
)
|
| 43 |
|
| 44 |
iface.launch()
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
from transformers import MarianMTModel, MarianTokenizer
|
| 3 |
+
import torch
|
| 4 |
+
|
| 5 |
+
# Limitar threads de CPU para optimizar
|
| 6 |
+
torch.set_num_threads(4)
|
| 7 |
|
| 8 |
# Diccionario de modelos multilenguaje OPUS-MT (origen -> destino)
|
| 9 |
modelos = {
|
|
|
|
| 14 |
("fr", "en"): "Helsinki-NLP/opus-mt-fr-en",
|
| 15 |
}
|
| 16 |
|
| 17 |
+
# Cache de modelos cargados
|
| 18 |
+
modelo_cache = {}
|
| 19 |
+
|
| 20 |
+
# Función para cargar modelo y tokenizer según idioma (caché)
|
| 21 |
def cargar_modelo(origen, destino):
|
| 22 |
key = (origen, destino)
|
| 23 |
+
if key in modelo_cache:
|
| 24 |
+
return modelo_cache[key]
|
| 25 |
model_name = modelos.get(key, "Helsinki-NLP/opus-mt-mul-en")
|
| 26 |
tokenizer = MarianTokenizer.from_pretrained(model_name)
|
| 27 |
model = MarianMTModel.from_pretrained(model_name)
|
| 28 |
+
modelo_cache[key] = (tokenizer, model)
|
| 29 |
return tokenizer, model
|
| 30 |
|
| 31 |
+
# Dividir texto en fragmentos ≤512 tokens
|
| 32 |
+
def dividir_texto(texto, max_len=512):
|
| 33 |
+
palabras = texto.split()
|
| 34 |
+
fragmentos = []
|
| 35 |
+
fragmento = []
|
| 36 |
+
for palabra in palabras:
|
| 37 |
+
fragmento.append(palabra)
|
| 38 |
+
if len(fragmento) >= max_len:
|
| 39 |
+
fragmentos.append(" ".join(fragmento))
|
| 40 |
+
fragmento = []
|
| 41 |
+
if fragmento:
|
| 42 |
+
fragmentos.append(" ".join(fragmento))
|
| 43 |
+
return fragmentos
|
| 44 |
+
|
| 45 |
+
# Función de traducción optimizada para textos largos
|
| 46 |
+
def traducir_fragmentos(texto, idioma_origen, idioma_destino):
|
| 47 |
tokenizer, model = cargar_modelo(idioma_origen, idioma_destino)
|
| 48 |
+
fragmentos = dividir_texto(texto, max_len=512)
|
| 49 |
+
traduccion = []
|
| 50 |
+
for frag in fragmentos:
|
| 51 |
+
inputs = tokenizer(frag, return_tensors="pt", padding=True, truncation=True)
|
| 52 |
+
translated = model.generate(**inputs, max_length=512)
|
| 53 |
+
traduccion.append(tokenizer.decode(translated[0], skip_special_tokens=True))
|
| 54 |
+
return " ".join(traduccion)
|
| 55 |
|
| 56 |
# Lista de idiomas disponibles
|
| 57 |
idiomas = ["mul", "en", "es", "fr"]
|
| 58 |
|
| 59 |
# Crear interfaz Gradio
|
| 60 |
iface = gr.Interface(
|
| 61 |
+
fn=traducir_fragmentos,
|
| 62 |
inputs=[
|
| 63 |
+
gr.Textbox(label="Texto a traducir", lines=8, placeholder="Escribe aquí..."),
|
| 64 |
gr.Dropdown(idiomas, label="Idioma origen", value="mul"),
|
| 65 |
gr.Dropdown(idiomas, label="Idioma destino", value="en")
|
| 66 |
],
|
| 67 |
outputs=gr.Textbox(label="Traducción"),
|
| 68 |
title="Traductor Multilenguaje OPUS-MT",
|
| 69 |
+
description="Traduce textos largos entre múltiples idiomas usando OPUS-MT en CPU. Optimizado para uso comercial."
|
| 70 |
)
|
| 71 |
|
| 72 |
iface.launch()
|