gnosticdev commited on
Commit
e312a32
·
verified ·
1 Parent(s): 87eaa45

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +42 -54
app.py CHANGED
@@ -1,87 +1,79 @@
1
  import gradio as gr
2
  import whisper
3
- import torch
4
  import os
 
5
 
6
- # --- Configuración ---
7
- MODEL_NAME = "tiny"
 
8
  device = "cuda" if torch.cuda.is_available() else "cpu"
9
- _model_cache = None
10
 
11
- def cargar_modelo():
12
- global _model_cache
13
- if _model_cache is None:
14
- print(f"🌀 Cargando modelo Whisper ({MODEL_NAME}) en {device}...")
15
- try:
16
- _model_cache = whisper.load_model(MODEL_NAME, device=device)
17
- print("✅ Modelo cargado correctamente.")
18
- except Exception as e:
19
- print(f"⚠️ Error cargando modelo: {e}")
20
- return None
21
- return _model_cache
22
 
23
- def analizar_audio_evp(audio_path, progress=gr.Progress()):
 
 
 
 
 
 
24
  if audio_path is None:
25
  return "⚠️ No se detectó audio. Por favor graba o sube un archivo."
26
-
27
- progress(0.1, desc="Cargando modelo de IA...")
28
- model = cargar_modelo()
29
-
30
- if model is None:
31
- return "❌ Error: No se pudo cargar el modelo de IA. Reintenta en unos segundos."
32
 
33
  try:
34
- progress(0.4, desc="Procesando audio...")
35
-
 
36
  options = {
37
  "language": "es",
38
- "fp16": False if device == "cpu" else True,
39
- "temperature": 0.8,
40
  "condition_on_previous_text": False,
41
- "verbose": False,
42
- "task": "transcribe"
43
  }
44
 
45
- progress(0.7, desc="Buscando patrones en el ruido...")
46
  result = model.transcribe(audio_path, **options)
47
  texto = result["text"].strip()
48
 
49
- progress(1.0, desc="Análisis completado")
50
-
51
  if texto:
52
- return f"👻 PATRÓN DETECTADO:\n\n{texto}"
 
53
  else:
54
- return "💤 SIN PATRONES CLAROS:\n\nLa IA no encontró estructuras lingüísticas reconocibles en este audio."
55
 
56
- except RuntimeError as e:
57
- if "out of memory" in str(e).lower():
58
- return "⚠️ MEMORIA INSUFICIENTE:\n\nEl espacio gratuito se quedó sin recursos. Espera unos minutos y reintenta con un audio más corto (<15s)."
59
- return f"⚠️ ERROR DE EJECUCIÓN:\n\n{str(e)}"
60
  except Exception as e:
61
- return f"⚠️ ERROR:\n\n{type(e).__name__}: {str(e)}"
62
 
63
- # --- Interfaz ---
64
- with gr.Blocks() as demo:
65
  gr.Markdown("""
66
- # Detector de Patrones Auditivos (EVP)
67
- ## Sube un MP3 de silencio o graba tu habitación.
68
- *La IA intentará encontrar palabras donde solo hay ruido estático.*
69
  """)
70
 
71
  with gr.Row():
72
  with gr.Column():
73
  audio_input = gr.Audio(
74
- label="Fuente de Audio",
75
  type="filepath",
76
- sources=["upload", "microphone"]
 
77
  )
78
- btn_analizar = gr.Button("Analizar Ruido", variant="primary")
79
 
80
  with gr.Column():
81
  output_text = gr.Textbox(
82
- label="Resultado del Análisis",
83
- lines=6,
84
- max_lines=12
85
  )
86
 
87
  btn_analizar.click(
@@ -90,9 +82,5 @@ with gr.Blocks() as demo:
90
  outputs=output_text
91
  )
92
 
93
- # --- Lanzamiento ---
94
  if __name__ == "__main__":
95
- demo.launch(
96
- server_name="0.0.0.0",
97
- server_port=7860
98
- )
 
1
  import gradio as gr
2
  import whisper
 
3
  import os
4
+ import torch
5
 
6
+ # --- Configuración Global ---
7
+ # Usamos 'tiny' para velocidad en CPU gratis.
8
+ MODEL_NAME = "tiny"
9
  device = "cuda" if torch.cuda.is_available() else "cpu"
 
10
 
11
+ print(f"🌀 Cargando modelo Whisper ({MODEL_NAME}) en {device}...")
12
+ try:
13
+ model = whisper.load_model(MODEL_NAME, device=device)
14
+ print(" Modelo cargado correctamente.")
15
+ except Exception as e:
16
+ print(f"⚠️ Error cargando modelo: {e}")
17
+ model = None
 
 
 
 
18
 
19
+ def analizar_audio_evp(audio_path):
20
+ """
21
+ Analiza el audio buscando patrones lingüísticos en el ruido.
22
+ """
23
+ if model is None:
24
+ return "❌ Error: El modelo no se cargó correctamente en el servidor."
25
+
26
  if audio_path is None:
27
  return "⚠️ No se detectó audio. Por favor graba o sube un archivo."
 
 
 
 
 
 
28
 
29
  try:
30
+ # Opciones de transcripción agresivas para EVP
31
+ # temperature=0.8 ayuda a encontrar patrones en ruido (menos determinista)
32
+ # condition_on_previous_text=False evita que el modelo se 'bloquee'
33
  options = {
34
  "language": "es",
35
+ "fp16": False if device == "cpu" else True, # FP16 suele fallar en CPU
36
+ "temperature": 0.8,
37
  "condition_on_previous_text": False,
38
+ "verbose": False
 
39
  }
40
 
41
+ print(f"🔍 Analizando archivo: {audio_path}...")
42
  result = model.transcribe(audio_path, **options)
43
  texto = result["text"].strip()
44
 
 
 
45
  if texto:
46
+ # CORRECCIÓN AQUÍ: f-string bien cerrado
47
+ return f"👻 **PATRÓN DETECTADO:**\n\n{texto}"
48
  else:
49
+ return "💤 **SIN PATRONES:**\n\nEl IA no encontró estructuras lingüísticas claras en este ruido (o el silencio es absoluto)."
50
 
 
 
 
 
51
  except Exception as e:
52
+ return f"⚠️ **ERROR DE PROCESAMIENTO:**\n\n{str(e)}"
53
 
54
+ # --- Interfaz Gráfica (Gradio) ---
55
+ with gr.Blocks(theme=gr.themes.Soft(primary_hue="purple")) as demo:
56
  gr.Markdown("""
57
+ # 🕵️‍♂️ Detector de Patrones Auditivos (EVP)
58
+ ## Sube un MP3 de "silencio" o graba tu habitación.
59
+ *La IA intentará encontrar palabras donde solo hay ruido.*
60
  """)
61
 
62
  with gr.Row():
63
  with gr.Column():
64
  audio_input = gr.Audio(
65
+ label="🎙️ Fuente de Audio",
66
  type="filepath",
67
+ sources=["upload", "microphone"],
68
+ format="mp3"
69
  )
70
+ btn_analizar = gr.Button("🔮 Analizar Ruido", variant="primary")
71
 
72
  with gr.Column():
73
  output_text = gr.Textbox(
74
+ label="📜 Resultado del Análisis",
75
+ lines=5,
76
+ max_lines=10
77
  )
78
 
79
  btn_analizar.click(
 
82
  outputs=output_text
83
  )
84
 
 
85
  if __name__ == "__main__":
86
+ demo.launch()