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()
|