File size: 7,724 Bytes
8af6919
28574ad
5d9778c
dd86a62
ca89374
9e0d400
68a83de
de130ab
139801a
 
162f9f8
8282dc0
ef63143
d9fd372
194736e
1df8dd8
d9fd372
4259aab
 
 
 
45a3c45
 
 
39ebe89
45a3c45
 
 
194736e
39ebe89
194736e
39ebe89
 
 
194736e
39ebe89
45a3c45
194736e
 
 
 
de130ab
194736e
 
 
45a3c45
194736e
 
 
 
45a3c45
194736e
 
de130ab
 
194736e
 
45a3c45
 
194736e
39ebe89
194736e
3cdf325
 
194736e
 
de130ab
194736e
45a3c45
 
 
194736e
39ebe89
45a3c45
 
194736e
 
39ebe89
194736e
 
 
45a3c45
0629ab8
39ebe89
194736e
39ebe89
 
 
 
0629ab8
 
39ebe89
 
0629ab8
2bf9471
194736e
 
39ebe89
 
3895700
2bf9471
6cd83aa
39ebe89
194736e
 
 
 
 
6cd83aa
45a3c45
 
 
 
 
 
432d6d7
0629ab8
45a3c45
 
74ff3e4
 
139801a
6d3695c
162f9f8
 
 
 
 
 
 
0248bb7
4259aab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
162f9f8
 
 
0248bb7
 
9e0d400
 
162f9f8
9e0d400
3389243
8acb57b
 
0248bb7
 
 
 
 
 
 
 
 
2fd7874
6567c72
 
 
 
 
 
 
 
 
 
 
2fd7874
 
 
 
b54f408
2fd7874
 
 
 
 
 
 
de130ab
 
 
0248bb7
 
 
 
 
 
 
de130ab
 
 
 
3895700
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
import streamlit as st
import os
import time
import base64
import random
from dotenv import load_dotenv
from google.cloud import texttospeech
import PyPDF2
from fpdf import FPDF
import tempfile
import requests

# Cargar variables de entorno desde el archivo .env
load_dotenv()
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "botidinamix-g.json"
groq_api_key = os.getenv("GROQ_API_KEY")

# Verifica que la clave API de Groq est茅 configurada
if not groq_api_key:
    st.error("No API key provided for Groq. Please set your API key in the .env file.")

# Configuraci贸n de Streamlit
st.set_page_config(page_title="Asistente Teol贸gico", page_icon="馃摉")

# Estilos CSS personalizados
st.markdown(
    """
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;700&display=swap');
        body {
            background-color: #1C1C1C;
            color: #ECF0F1;
            background-image: url('https://s1.1zoom.me/big0/395/Fields_Sunrises_and_499477.jpg');
            background-size: cover;
            font-family: 'Poppins', sans-serif;
        }
        .stButton>button {
            background-color: #007BFF;
            color: #FFD700;
            border: none;
            border-radius: 8px;
            font-size: 16px;
            padding: 12px 24px;
            cursor: pointer;
            transition: background-color 0.3s, transform 0.3s;
        }
        .stButton>button:hover {
            background-color: #0056b3;
            transform: scale(1.05);
        }
        .stTextInput>div>div>input {
            border: 2px solid #FFD700;
            border-radius: 8px;
            font-size: 16px;
            padding: 10px;
            background-color: #000000;
            color: #ECF0F1;
        }
        .stMarkdown>div>p {
            color: #D0D3D4;
            font-size: 16px;
            line-height: 1.6;
        }
        .stMarkdown>h1, .stMarkdown>h2, .stMarkdown>h3, .stMarkdown>h4, .stMarkdown>h5, .stMarkdown>h6 {
            color: #FF6F61;
            font-family: 'Poppins', sans-serif;
            font-weight: bold;
            text-transform: uppercase;
        }
        .stAudio {
            margin-top: 20px;
            border: 2px solid #FF6F61;
            border-radius: 10px;
        }
        .stFileUploader>div>div>input {
            border: 2px solid #FFD700;
            border-radius: 8px;
            font-size: 16px;
            padding: 10px;
            background-color: #000000;
            color: #ECF0F1;
        }
        .spinner {
            border: 8px solid #f3f3f3;
            border-top: 8px solid #FF6F61;
            border-radius: 50%;
            width: 60px;
            height: 60px;
            animation: spin 1s linear infinite;
        }
        @keyframes spin {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }
        .video-container {
            border: 3px solid #FF6F61;
            background-color: #1C1C1C;
            padding: 10px;
            border-radius: 10px;
            margin-bottom: 20px.
        }
        .assistant-response {
            font-size: 16px;
            color: #D0D3D4;
            background-color: #2E2E2E;
            padding: 10px;
            border-radius: 8px;
            border: 1px solid #FF6F61;
        }
    </style>
    """,
    unsafe_allow_html=True,
)

# Encabezado
st.image("biblie.jpg")
st.title("馃摉 LOS C脫DIGOS DE DIOS - BOTIDINAMIX AI")
st.markdown("Bienvenido al Asistente Teol贸gico, donde puedes preguntar sobre interpretaciones y reflexiones b铆blicas.")

# Barra lateral para la navegaci贸n
st.sidebar.title("Navegaci贸n")
page = st.sidebar.selectbox("Selecciona una p谩gina", ["P谩gina Principal", "Chat Asistente", "Generador de Frases B铆blicas", "Recibir Reflexi贸n", "La conexi贸n", "Diario Reflexivo"])

# Funci贸n para obtener respuesta de Groq
def obtener_respuesta(pregunta, contexto="", modelo="llama3-8b-8192", temperatura=0.5):
    """Obtiene una respuesta de Groq basada en el contexto y la pregunta proporcionados."""
    if not pregunta:
        st.error("La pregunta no puede estar vac铆a.")
        return "Lo siento, la pregunta no puede estar vac铆a."

    try:
        headers = {
            "Authorization": f"Bearer {groq_api_key}",
            "Content-Type": "application/json"
        }
        data = {
            "messages": [
                {"role": "system", "content": contexto},
                {"role": "user", "content": pregunta}
            ],
            "model": modelo,
            "temperature": temperatura,
            "max_tokens": 1024,
            "top_p": 1,
            "stop": None,
            "stream": False
        }
        response = requests.post("https://api.groq.com/v1/completions", headers=headers, json=data)
        response.raise_for_status()
        result = response.json()
        return result['choices'][0]['message']['content'].strip()
    except Exception as e:
        st.error(f"Error al comunicarse con Groq: {e}")
        return "Lo siento, no puedo procesar tu solicitud en este momento."

# Funci贸n para generar reflexi贸n usando Groq
def generar_reflexion(keyword):
    prompt = f"Genera una reflexi贸n inspiradora sobre {keyword} en el contexto de la espiritualidad y la Biblia."
    respuesta = obtener_respuesta(prompt)
    return respuesta

# Funci贸n para convertir texto a voz
def text_to_speech_base64(text):
    try:
        client = texttospeech.TextToSpeechClient()
        input_text = texttospeech.SynthesisInput(text=text)
        voice = texttospeech.VoiceSelectionParams(language_code="es-ES", ssml_gender=texttospeech.SsmlVoiceGender.NEUTRAL)
        audio_config = texttospeech.AudioConfig(audio_encoding=texttospeech.AudioEncoding.MP3)
        response = client.synthesize_speech(input=input_text, voice=voice, audio_config=audio_config)
        return base64.b64encode(response.audio_content).decode("utf-8")
    except Exception as e:
        return f"Error en la conversi贸n de texto a voz: {e}"

# Funci贸n para obtener una imagen aleatoria de la carpeta "im谩genes"
def obtener_imagen_aleatoria():
    carpeta_imagenes = "imagenes"  # Cambia esta ruta por la correcta
    archivos = os.listdir(carpeta_imagenes)
    archivos_img = [archivo for archivo in archivos if archivo.endswith((".png", ".jpg", ".jpeg"))]
    if archivos_img:
        imagen_seleccionada = random.choice(archivos_img)
        imagen_path = os.path.join(carpeta_imagenes, imagen_seleccionada)
        return imagen_path
    return None

# Funci贸n para obtener un audio aleatorio de la carpeta "reflexiones"
def obtener_audio_aleatorio():
    carpeta_reflexiones = "reflexiones"  # Cambia esta ruta por la correcta
    archivos = os.listdir(carpeta_reflexiones)
    archivos_mp3 = [archivo for archivo in archivos if archivo.endswith(".mp3")]
    if archivos_mp3:
        audio_seleccionado = random.choice(archivos_mp3)
        with open(os.path.join(carpeta_reflexiones, audio_seleccionado), "rb") as audio_file:
            audio_bytes = audio_file.read()
        return base64.b64encode(audio_bytes).decode("utf-8"), audio_seleccionado
    return None, None

# Funci贸n para extraer texto de un PDF
def extraer_texto_pdf(pdf_path):
    text = ""
    try:
        with open(pdf_path, "rb") as file:
            reader = PyPDF2.PdfFileReader(file)
            for page_num in range(reader.numPages):
                text += reader.getPage(page_num).extract_text()
    except Exception as e:
        text = f"Error al extraer texto del PDF: {e}"
    return text

# Funci贸n "La conexi贸n" para generar oraciones del PDF
def generar_oracion_desde_pdf():
    pdf_path = "diario-de-oraciones.pdf"  # Ruta