File size: 4,209 Bytes
afa7095
 
 
 
0d1098b
33c338e
a023902
66d2bc5
0d1098b
6280c74
0d1098b
 
6280c74
0d1098b
8111b8a
66d2bc5
afa7095
66d2bc5
e726af2
60c1df6
6280c74
 
 
 
 
 
 
6a55d3a
afa7095
db2fc34
 
 
 
 
2546f36
db2fc34
 
6a55d3a
 
 
 
 
 
b2b9070
6a55d3a
 
3970027
 
 
66d2bc5
3970027
 
57a24ac
3970027
 
 
 
 
 
ce5abe5
3970027
 
 
 
 
 
 
 
57a24ac
3970027
 
afa7095
6280c74
0d1098b
6280c74
fec2f77
 
6a55d3a
6280c74
fec2f77
9758907
 
 
 
6280c74
9758907
6280c74
 
9758907
 
 
6280c74
8b9679b
6a55d3a
 
 
 
8b9679b
 
 
6a55d3a
3970027
 
fec2f77
0d1098b
 
 
 
f6848e0
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
import os
import time
import streamlit as st
from dotenv import load_dotenv
import requests
import base64
from groq import Groq
import tempfile

# Configuración inicial de Streamlit
st.set_page_config(page_title="Galatea Asistente - OMARDENT", layout="wide")

# Cargar claves desde el archivo .env
load_dotenv()
groq_api_key = os.getenv("GROQ_API_KEY")
elevenlabs_api_key = os.getenv("ELEVENLABS_API_KEY")

# Cliente Groq
client = Groq(api_key=groq_api_key)

# Descargar el sonido de notificación si no existe
url_sonido = "http://sonidosmp3gratis.com/sounds/000217388_prev.mp3"
if not os.path.exists("notificacion.mp3"):
    response = requests.get(url_sonido)
    with open("notificacion.mp3", "wb") as f:
        f.write(response.content)

def obtener_respuesta_groq(pregunta, modelo="llama3-8b-8192", temperatura=0.5):
    try:
        contexto = """
        Actúas como Galatea, la auxiliar de odontología capacitada de la clínica odontológica Omardent. 
        Tu tarea es enviar respuestas precisas y directas, sin agregar o inventar información. Solo responde lo solicitado de manera breve y profesional.
        En la clínica atienden dos doctores: el Dr. Omar y el Dr. José Daniel. 
        La clínica tiene únicamente dos consultorios.
        Además, trabaja una auxiliar llamada Ade.
        Nunca debes decir "buenos días" o "buenas tardes". Mantén un tono cordial en todo momento.
        """
        respuesta = client.chat.completions.create(
            messages=[
                {"role": "system", "content": contexto},
                {"role": "user", "content": pregunta}
            ],
            model=modelo,
            temperature=temperatura
        ).choices[0].message.content.strip()

        # Usar directamente la API REST de ElevenLabs
        voice_id = "piTKgcLEGmPE4e6mEKli"  # Nicole - voz femenina multilingüe
        url = f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}/stream?output_format=mp3_44100_128"
        
        headers = {
            "Content-Type": "application/json",
            "xi-api-key": elevenlabs_api_key  # Nombre correcto del encabezado según la documentación
        }
        
        data = {
            "text": respuesta,
            "model_id": "eleven_multilingual_v2"
        }
        
        response = requests.post(url, headers=headers, json=data)
        
        if response.status_code == 200:
            # Obtener los bytes directamente de la respuesta
            audio_bytes = response.content
            audio_base64 = base64.b64encode(audio_bytes).decode()
            return respuesta, audio_base64
        else:
            st.error(f"Error en ElevenLabs API: {response.status_code} - {response.text}")
            return respuesta, None

    except Exception as e:
        return f"Error al procesar la solicitud: {e}", None

# Interfaz de usuario
def mostrar_galatea_asistente():
    st.title("Asistente Virtual Galatea - Clínica Omardent")
    pregunta = st.text_input("Escribe tu pregunta:")
    intervalo = st.slider("Tiempo antes de responder (segundos):", 5, 60, 10)

    if st.button("Iniciar temporizador"):
        # Placeholder para el reloj
        reloj_placeholder = st.empty()

        for i in range(intervalo, 0, -1):
            reloj_placeholder.markdown(f"<h2 style='text-align: center;'>⏳ Tiempo restante: {i} segundos</h2>", unsafe_allow_html=True)
            time.sleep(1)

        reloj_placeholder.markdown("<h2 style='text-align: center;'>✅ ¡Tiempo finalizado!</h2>", unsafe_allow_html=True)

        # Obtener respuesta y reproducir audio
        if pregunta:
            respuesta, audio_base64 = obtener_respuesta_groq(pregunta)
            st.write(f"Respuesta: {respuesta}")
            if audio_base64:
                st.markdown(
                    f"""
                    <audio autoplay controls>
                        <source src="data:audio/mp3;base64,{audio_base64}" type="audio/mp3">
                    </audio>
                    """, unsafe_allow_html=True)
            else:
                st.error("No se pudo generar el audio para la respuesta.")

def main():
    mostrar_galatea_asistente()

if __name__ == "__main__":
    main()