File size: 5,451 Bytes
9cb4a69
 
 
 
 
 
 
 
 
 
 
 
 
 
ec62c60
9cb4a69
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# 📌 INSTALAR DEPENDENCIAS (si no están en tu entorno)
# pip install transformers torch gradio whisper gtts accelerate

import gradio as gr
import torch
import random
from transformers import AutoModelForCausalLM, AutoTokenizer
import whisper
from gtts import gTTS

# 📌 Verificar si se tiene GPU disponible
device = "cuda" if torch.cuda.is_available() else "cpu"

# 📌 MODELO ESPAÑOL PÚBLICO (con código personalizado)
modelo_id = "fbarragan/helloworld_model"

# Intentar importar accelerate sin fallar
try:
    import accelerate
    accelerate_installed = True
except ImportError:
    accelerate_installed = False

# Cargar el modelo de manera segura
modelo = AutoModelForCausalLM.from_pretrained(
    modelo_id,
    torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
    trust_remote_code=True
).to(device)

# 📌 LISTA NEGRA DE INSULTOS
palabras_prohibidas = [
    "Abollado", "Arrecho(a)", "Azote de barrio", "Bolsa", "Cagao E zamuro",
    "Ladilla", "Mojón", "Ñero", "Piche", "Rata(ón)", "Vuelto mierda"
]

# 📌 DICCIONARIO VENEZOLANO
diccionario_venezolano = {
    "dinero": "palo",
    "amigo": "pana",
    "genial": "chévere",
    "problema": "culebra",
    "fiesta": "bonche",
    "hola": "¡Epa mi pana!",
    "adiós": "¡Váyalo, chamo!",
}

# 📌 CARGAR MODELO (requiere autenticación si es privado)
modelo_id = "deepseek-ai/DeepSeek-R1"
tokenizer = AutoTokenizer.from_pretrained(modelo_id, trust_remote_code=True)  # 🌟 Clave para modelos con código personalizado
modelo = AutoModelForCausalLM.from_pretrained(
    modelo_id,
    device_map="auto",
    torch_dtype=torch.float16,
    trust_remote_code=True  # 🌟 Necesario para DeepSeek-R1
)

# 📌 LISTA NEGRA DE INSULTOS (previamente generada)
palabras_prohibidas = [
    "Abollado", "Arrecho(a)", "Azote de barrio", "Bolsa", "Cagao E zamuro", "Caimanera",
    "Cariaquito morao", "Chimbo, todo", "Chimbo", "Chola", "Conejo", "Coño'e madre",
    "Culebra", "Flux", "Friqueado", "Furruqueado", "Guaya", "Güevo", "Hediondo", "Ladilla",
    "Landro", "Mamagüevo", "Mandinga", "Mapanare", "Marico triste", "Metra",
    "Mojón", "Muérgano", "Ñero", "Oracio", "Pasoneado(a)", "Pava", "Peaje", "Pecueca",
    "Piche", "Rata(ón)", "Raya'o", "Rolo", "Salado", "Tachón", "Taguara", "Vergajo",
    "Violín", "Vuelto mierda"
]

# 📌 CARGAR DICCIONARIO VENEZOLANO COMPLETO
def cargar_diccionario(ruta_archivo):
    diccionario = {
        "saludo": [],
        "despedida": [],
        "afirmacion": [],
        "negacion": [],
        "colloquial": {}  # Palabras venezolanas y sus equivalentes formales
    }
    with open(ruta_archivo, "r", encoding="utf-8") as f:
        for linea in f:
            linea = linea.strip()
            if linea and not linea.startswith("#"):
                partes = linea.split(".-", 1)
                if len(partes) >= 2:
                    palabra = partes[0].strip()
                    definicion = partes[1].strip().lower()
                    # Clasificar palabras según contexto
                    if "saludo" in definicion:
                        diccionario["saludo"].append(palabra)
                    elif "despedida" in definicion:
                        diccionario["despedida"].append(palabra)
                    elif "afirmación" in definicion or "positivo" in definicion:
                        diccionario["afirmacion"].append(palabra)
                    elif "negación" in definicion or "negativo" in definicion:
                        diccionario["negacion"].append(palabra)
                    else:
                        # Agregar palabras coloquiales con su significado
                        if palabra not in palabras_prohibidas:
                            diccionario["colloquial"][palabra] = definicion
    return diccionario

diccionario_venezolano = cargar_diccionario("Diccionario_Venezolano.txt")

# 📌 Función para adaptar respuestas
def adaptar_respuesta(respuesta):
    # Filtrar insultos
    for palabra in palabras_prohibidas:
        respuesta = respuesta.replace(palabra, "****")
    
    # Reemplazar términos formales por coloquiales
    for formal, venezolano in diccionario_venezolano.items():
        respuesta = respuesta.replace(formal, venezolano)
    
    return respuesta

# 📌 Función principal del asistente
def chamo_asistente(pregunta):
    inputs = tokenizer(pregunta, return_tensors="pt").to(device)  # Enviar a GPU si está disponible
    inputs = tokenizer(pregunta, return_tensors="pt")
    output = modelo.generate(**inputs, max_new_tokens=150)
    respuesta = tokenizer.decode(output[0], skip_special_tokens=True)
    return adaptar_respuesta(respuesta)

# 📌 Procesar audio
def procesar_audio(archivo):
    modelo_whisper = whisper.load_model("small")  # Cargar modelo una sola vez
    texto = modelo_whisper.transcribe(archivo)["text"]
    respuesta = chamo_asistente(texto)
    
    # Convertir texto a audio
    texto = whisper.load_model("small").transcribe(archivo)["text"]
    respuesta = chamo_asistente(texto)
    tts = gTTS(respuesta, lang="es")
    tts.save("respuesta.mp3")
    return respuesta, "respuesta.mp3"

# 📌 Interfaz Gradio
iface_texto = gr.Interface(fn=chamo_asistente, inputs="text", outputs="text")
iface_voz = gr.Interface(fn=procesar_audio, inputs="microphone", outputs=["text", "audio"])
demo = gr.TabbedInterface([iface_texto, iface_voz], ["Texto", "Voz"])
demo.launch()
demo.launch()