| | import os |
| | import time |
| | import streamlit as st |
| | from dotenv import load_dotenv |
| | import requests |
| | import base64 |
| | from groq import Groq |
| | import tempfile |
| |
|
| | |
| | st.set_page_config(page_title="Galatea Asistente - OMARDENT", layout="wide") |
| |
|
| | |
| | load_dotenv() |
| | groq_api_key = os.getenv("GROQ_API_KEY") |
| | elevenlabs_api_key = os.getenv("ELEVENLABS_API_KEY") |
| |
|
| | |
| | client = Groq(api_key=groq_api_key) |
| |
|
| | |
| | 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() |
| |
|
| | |
| | voice_id = "piTKgcLEGmPE4e6mEKli" |
| | 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 |
| | } |
| | |
| | data = { |
| | "text": respuesta, |
| | "model_id": "eleven_multilingual_v2" |
| | } |
| | |
| | response = requests.post(url, headers=headers, json=data) |
| | |
| | if response.status_code == 200: |
| | |
| | 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 |
| |
|
| | |
| | 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"): |
| | |
| | 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) |
| |
|
| | |
| | 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() |
| |
|