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"

⏳ Tiempo restante: {i} segundos

", unsafe_allow_html=True) time.sleep(1) reloj_placeholder.markdown("

✅ ¡Tiempo finalizado!

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