OMARDENT2 / app.py
Josedcape's picture
Update app.py
57a24ac verified
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()