|
|
import gradio as gr |
|
|
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline |
|
|
import torch |
|
|
from langdetect import detect |
|
|
|
|
|
|
|
|
MODEL_NAME = "distilgpt2" |
|
|
TRANSLATE_TO_ES_MODEL = "Helsinki-NLP/opus-mt-mul-es" |
|
|
TRANSLATE_FROM_ES_MODEL = "Helsinki-NLP/opus-mt-es-mul" |
|
|
|
|
|
|
|
|
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) |
|
|
model = AutoModelForCausalLM.from_pretrained(MODEL_NAME) |
|
|
generator = pipeline("text-generation", model=model, tokenizer=tokenizer, device=-1) |
|
|
|
|
|
translator_to_es = pipeline("translation", model=TRANSLATE_TO_ES_MODEL, device=-1) |
|
|
translator_from_es = pipeline("translation", model=TRANSLATE_FROM_ES_MODEL, device=-1) |
|
|
|
|
|
|
|
|
def translate_to_es(text): |
|
|
try: |
|
|
lang = detect(text) |
|
|
except: |
|
|
lang = "es" |
|
|
if lang != "es": |
|
|
translated = translator_to_es(text)[0]["translation_text"] |
|
|
return translated, lang |
|
|
return text, lang |
|
|
|
|
|
def translate_from_es(text, lang): |
|
|
if lang != "es": |
|
|
translated = translator_from_es(text)[0]["translation_text"] |
|
|
return translated |
|
|
return text |
|
|
|
|
|
|
|
|
def answer(history, message): |
|
|
if not message.strip(): |
|
|
return history, "" |
|
|
|
|
|
|
|
|
msg_es, lang = translate_to_es(message) |
|
|
|
|
|
|
|
|
context = "" |
|
|
for user, bot in history[-6:]: |
|
|
context += f"Usuario: {user}\nIA: {bot}\n" |
|
|
context += f"Usuario: {msg_es}\nIA:" |
|
|
|
|
|
|
|
|
output = generator( |
|
|
context, |
|
|
max_new_tokens=150, |
|
|
do_sample=True, |
|
|
top_k=50, |
|
|
top_p=0.9, |
|
|
temperature=0.8 |
|
|
)[0]["generated_text"] |
|
|
|
|
|
if "IA:" in output: |
|
|
response_es = output.split("IA:")[-1].strip() |
|
|
else: |
|
|
response_es = output |
|
|
|
|
|
|
|
|
response_final = translate_from_es(response_es, lang) |
|
|
|
|
|
|
|
|
history.append((message, response_final)) |
|
|
return history, "" |
|
|
|
|
|
|
|
|
with gr.Blocks() as demo: |
|
|
gr.Markdown("# 🤖 Chatbot Multilenguaje (Traducción automática)") |
|
|
chat = gr.Chatbot() |
|
|
msg = gr.Textbox(placeholder="Escribe tu mensaje…") |
|
|
clear_btn = gr.Button("Limpiar") |
|
|
state = gr.State([]) |
|
|
|
|
|
msg.submit(answer, [state, msg], [chat, msg]) |
|
|
clear_btn.click(lambda: [], None, chat) |
|
|
|
|
|
demo.launch() |
|
|
|