tufonoayuda commited on
Commit
c457b05
·
verified ·
1 Parent(s): 23fe491

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +311 -0
app.py ADDED
@@ -0,0 +1,311 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import requests
3
+ import json
4
+ from datetime import datetime
5
+ import PyPDF2
6
+ import io
7
+ from huggingface_hub import InferenceClient
8
+
9
+ # Configuración de Hugging Face
10
+ # Puedes usar estos modelos gratuitos:
11
+ HF_MODEL = "microsoft/DialoGPT-medium" # Modelo conversacional gratuito
12
+ # O usar: "google/flan-t5-large", "meta-llama/Llama-2-7b-chat-hf"
13
+
14
+ # Cliente de Hugging Face (no necesita token para modelos públicos)
15
+ client = InferenceClient()
16
+
17
+ def extract_text_from_pdf(pdf_files):
18
+ """Extrae texto de archivos PDF subidos"""
19
+ extracted_texts = []
20
+
21
+ if pdf_files is None or len(pdf_files) == 0:
22
+ return ""
23
+
24
+ for pdf_file in pdf_files:
25
+ try:
26
+ # Leer el archivo PDF
27
+ with open(pdf_file.name, 'rb') as file:
28
+ pdf_reader = PyPDF2.PdfReader(file)
29
+ text = ""
30
+ for page in pdf_reader.pages:
31
+ text += page.extract_text() + "\n"
32
+ extracted_texts.append(f"--- {pdf_file.name} ---\n{text}\n")
33
+ except Exception as e:
34
+ extracted_texts.append(f"Error al leer {pdf_file.name}: {str(e)}")
35
+
36
+ return "\n".join(extracted_texts)
37
+
38
+ def generar_actividad_fonoaudiologica(
39
+ edad_anos,
40
+ edad_meses,
41
+ diagnostico_fonoaudiologico,
42
+ contexto_clinico,
43
+ es_pediatrica,
44
+ objetivo_especifico,
45
+ duracion,
46
+ tipo_sesion,
47
+ contexto_adicional,
48
+ archivos_pdf
49
+ ):
50
+ """Genera una actividad fonoaudiológica usando IA de Hugging Face"""
51
+
52
+ # Calcular edad total en meses
53
+ edad_total_meses = (edad_anos * 12) + edad_meses
54
+
55
+ # Extraer texto de PDFs si existen
56
+ referencias_pdf = extract_text_from_pdf(archivos_pdf) if archivos_pdf else ""
57
+
58
+ # Construir el prompt detallado
59
+ prompt = f"""
60
+ Eres un fonoaudiólogo experto especializado en terapia del habla y lenguaje.
61
+
62
+ Genera una actividad terapéutica detallada con la siguiente información:
63
+
64
+ INFORMACIÓN DEL PACIENTE:
65
+ - Edad: {edad_anos} años y {edad_meses} meses (total: {edad_total_meses} meses)
66
+ - Diagnóstico fonoaudiológico: {diagnostico_fonoaudiologico}
67
+ - Contexto clínico: {contexto_clinico}
68
+ - Sesión pediátrica: {'Sí - usar lenguaje lúdico y adaptado' if es_pediatrica else 'No'}
69
+
70
+ OBJETIVOS DE LA SESIÓN:
71
+ - Objetivo específico: {objetivo_especifico}
72
+ - Duración: {duracion} minutos
73
+ - Tipo de sesión: {tipo_sesion}
74
+
75
+ CONTEXTO ADICIONAL:
76
+ {contexto_adicional if contexto_adicional else 'No se proporcionó contexto adicional'}
77
+
78
+ REFERENCIAS CIENTÍFICAS:
79
+ {referencias_pdf[:1000] if referencias_pdf else 'No se proporcionaron referencias'}
80
+
81
+ Por favor, genera una actividad estructurada que incluya:
82
+
83
+ 1. TÍTULO DE LA ACTIVIDAD
84
+ 2. OBJETIVOS ESPECÍFICOS (basados en Taxonomía de Bloom)
85
+ 3. MATERIALES NECESARIOS
86
+ 4. DESARROLLO DE LA ACTIVIDAD (paso a paso)
87
+ 5. CRITERIOS DE EVALUACIÓN
88
+ 6. ADAPTACIONES SEGÚN LA EDAD
89
+ 7. RECOMENDACIONES PARA EL HOGAR
90
+
91
+ La actividad debe ser apropiada para la edad, diagnóstico y contexto proporcionados.
92
+ """
93
+
94
+ try:
95
+ # Generar respuesta usando Hugging Face
96
+ response = client.text_generation(
97
+ prompt,
98
+ model="microsoft/DialoGPT-medium",
99
+ max_new_tokens=1000,
100
+ temperature=0.7,
101
+ do_sample=True
102
+ )
103
+
104
+ # Formatear la respuesta
105
+ actividad_generada = f"""
106
+ # 🧠 Actividad Fonoaudiológica Generada
107
+
108
+ **Fecha de generación:** {datetime.now().strftime("%d/%m/%Y %H:%M")}
109
+
110
+ **Paciente:** {edad_anos} años y {edad_meses} meses | **Diagnóstico:** {diagnostico_fonoaudiologico}
111
+
112
+ ---
113
+
114
+ {response}
115
+
116
+ ---
117
+
118
+ ## 📊 Resumen de la Sesión
119
+ - **Duración:** {duracion} minutos
120
+ - **Tipo:** {tipo_sesion}
121
+ - **Enfoque:** {'Pediátrico con lenguaje lúdico' if es_pediatrica else 'Adulto/Adolescente'}
122
+
123
+ ## 📚 Referencias Utilizadas
124
+ {'Se utilizaron referencias científicas proporcionadas en PDF' if referencias_pdf else 'No se proporcionaron referencias adicionales'}
125
+
126
+ ---
127
+ *Generado por IA - Revisar siempre la pertinencia clínica antes de aplicar*
128
+ """
129
+
130
+ return actividad_generada
131
+
132
+ except Exception as e:
133
+ return f"❌ Error al generar la actividad: {str(e)}\n\nPor favor, verifica tu conexión o intenta nuevamente."
134
+
135
+ # Configurar la interfaz de Gradio
136
+ def crear_interfaz():
137
+ with gr.Blocks(
138
+ title="🧠 Generador IA de Actividades Fonoaudiológicas",
139
+ theme=gr.themes.Soft(
140
+ primary_hue="blue",
141
+ secondary_hue="cyan",
142
+ neutral_hue="slate"
143
+ ),
144
+ css="""
145
+ .gradio-container {
146
+ max-width: 1200px !important;
147
+ }
148
+ .form-row {
149
+ display: flex;
150
+ gap: 10px;
151
+ }
152
+ .highlight-box {
153
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
154
+ padding: 20px;
155
+ border-radius: 10px;
156
+ color: white;
157
+ margin: 20px 0;
158
+ }
159
+ """
160
+ ) as demo:
161
+
162
+ # Header
163
+ gr.HTML("""
164
+ <div class="highlight-box">
165
+ <h1 style="text-align: center; margin: 0;">🧠 Generador IA de Actividades Fonoaudiológicas</h1>
166
+ <p style="text-align: center; margin: 10px 0 0 0;">✨ Potenciado con Hugging Face para Fonoaudiólog@s</p>
167
+ </div>
168
+ """)
169
+
170
+ with gr.Row():
171
+ # Columna izquierda - Formulario
172
+ with gr.Column(scale=1):
173
+ gr.Markdown("## 👤 Información del Paciente")
174
+
175
+ with gr.Row():
176
+ edad_anos = gr.Number(
177
+ label="Edad (años)",
178
+ value=3,
179
+ minimum=0,
180
+ maximum=100
181
+ )
182
+ edad_meses = gr.Number(
183
+ label="Edad adicional (meses)",
184
+ value=6,
185
+ minimum=0,
186
+ maximum=11
187
+ )
188
+
189
+ diagnostico_fonoaudiologico = gr.Dropdown(
190
+ label="Diagnóstico Fonoaudiológico",
191
+ choices=[
192
+ "Retraso Simple del Lenguaje (RSL)",
193
+ "Trastorno Específico del Lenguaje (TEL)",
194
+ "Apraxia del Habla Infantil",
195
+ "Disartria",
196
+ "Disfasia",
197
+ "Trastorno Fonológico",
198
+ "Disfluencia/Tartamudez",
199
+ "Disfonía",
200
+ "Trastorno de la Deglución",
201
+ "Hipoacusia/Sordera",
202
+ "Trastorno del Espectro Autista (TEA)",
203
+ "Síndrome de Down",
204
+ "Parálisis Cerebral",
205
+ "Otro"
206
+ ],
207
+ value="Retraso Simple del Lenguaje (RSL)"
208
+ )
209
+
210
+ contexto_clinico = gr.Textbox(
211
+ label="Contexto Clínico",
212
+ placeholder="Ej: Niño con dificultades en articulación de fonemas líquidos, comprende órdenes simples, vocabulario reducido para su edad...",
213
+ lines=3
214
+ )
215
+
216
+ es_pediatrica = gr.Checkbox(
217
+ label="🎯 Sesión Pediátrica (lenguaje lúdico adaptado)",
218
+ value=True
219
+ )
220
+
221
+ gr.Markdown("## 🎯 Objetivos y Configuración")
222
+
223
+ objetivo_especifico = gr.Textbox(
224
+ label="Objetivo Específico (Taxonomía de Bloom)",
225
+ placeholder="Ej: Mejorar la articulación del fonema /r/ en palabras bisílabas mediante ejercicios de repetición",
226
+ info="Niveles Bloom: Recordar → Comprender → Aplicar → Analizar → Evaluar → Crear"
227
+ )
228
+
229
+ with gr.Row():
230
+ duracion = gr.Number(
231
+ label="⏱️ Duración (minutos)",
232
+ value=45,
233
+ minimum=15,
234
+ maximum=120
235
+ )
236
+ tipo_sesion = gr.Dropdown(
237
+ label="👥 Tipo de Sesión",
238
+ choices=["Individual", "Grupal", "Para el hogar"],
239
+ value="Individual"
240
+ )
241
+
242
+ contexto_adicional = gr.Textbox(
243
+ label="📚 Contexto Adicional (Opcional)",
244
+ placeholder="Estrategias específicas, materiales preferidos, observaciones clínicas adicionales...",
245
+ lines=4
246
+ )
247
+
248
+ archivos_pdf = gr.File(
249
+ label="📄 Referencias Científicas (PDFs)",
250
+ file_count="multiple",
251
+ file_types=[".pdf"],
252
+ info="Sube artículos científicos o guías clínicas relevantes"
253
+ )
254
+
255
+ generar_btn = gr.Button(
256
+ "✨ Generar Actividad con IA",
257
+ variant="primary",
258
+ size="lg"
259
+ )
260
+
261
+ # Columna derecha - Resultado
262
+ with gr.Column(scale=1):
263
+ gr.Markdown("## 📊 Actividad Generada")
264
+
265
+ resultado = gr.Textbox(
266
+ label="Actividad Fonoaudiológica",
267
+ placeholder="Completa los campos de la izquierda y haz clic en 'Generar Actividad' para obtener una actividad personalizada.",
268
+ lines=25,
269
+ max_lines=30,
270
+ show_copy_button=True
271
+ )
272
+
273
+ # Conectar el botón con la función
274
+ generar_btn.click(
275
+ fn=generar_actividad_fonoaudiologica,
276
+ inputs=[
277
+ edad_anos,
278
+ edad_meses,
279
+ diagnostico_fonoaudiologico,
280
+ contexto_clinico,
281
+ es_pediatrica,
282
+ objetivo_especifico,
283
+ duracion,
284
+ tipo_sesion,
285
+ contexto_adicional,
286
+ archivos_pdf
287
+ ],
288
+ outputs=resultado
289
+ )
290
+
291
+ # Footer
292
+ gr.HTML("""
293
+ <div style="text-align: center; margin-top: 40px; padding: 20px; background: #f8f9fa; border-radius: 10px;">
294
+ <p><strong>Desarrollado por Flgo. Cristóbal San Martín</strong></p>
295
+ <p>Sígueme en <a href="https://instagram.com/tufonoayuda" target="_blank">@tufonoayuda</a></p>
296
+ <p><em>✨ Generador IA Fonoaudiológico - Powered by Hugging Face</em></p>
297
+ </div>
298
+ """)
299
+
300
+ return demo
301
+
302
+ # Crear y configurar la aplicación
303
+ if __name__ == "__main__":
304
+ demo = crear_interfaz()
305
+ demo.launch(
306
+ share=True, # Genera link público
307
+ server_name="0.0.0.0", # Accesible desde cualquier IP
308
+ server_port=7860, # Puerto estándar de Gradio
309
+ show_error=True, # Mostrar errores en la interfaz
310
+ debug=True # Modo debug para desarrollo
311
+ )