gnosticdev commited on
Commit
023e8cf
verified
1 Parent(s): 0bdf697

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -22
app.py CHANGED
@@ -2,6 +2,8 @@ import gradio as gr
2
  import numpy as np
3
  import librosa
4
  from scipy.fft import fft, fftfreq
 
 
5
 
6
  # ---- ABECEDARIO DE FRECUENCIAS ----
7
  ABECEDARIO = {
@@ -14,8 +16,13 @@ ABECEDARIO = {
14
  FRECUENCIAS = np.array(list(ABECEDARIO.values()))
15
  LETRAS = list(ABECEDARIO.keys())
16
 
17
- # ---- Funci贸n principal: decodificar audio ----
18
- def decodificar_audio(audio_path, progress=gr.Progress()):
 
 
 
 
 
19
  if audio_path is None:
20
  return "鈿狅笍 Sin audio"
21
 
@@ -23,7 +30,6 @@ def decodificar_audio(audio_path, progress=gr.Progress()):
23
  n = len(y)
24
  secuencia = ""
25
 
26
- # Analizar en ventanas de 50 ms
27
  ventana_ms = 50
28
  ventana_len = int(sr * ventana_ms / 1000)
29
 
@@ -32,22 +38,14 @@ def decodificar_audio(audio_path, progress=gr.Progress()):
32
  if len(frame) == 0:
33
  continue
34
 
35
- # FFT de la ventana
36
  yf_frame = fft(frame)
37
  magn = np.abs(yf_frame[:len(frame)//2])
38
  freqs = fftfreq(len(frame), 1/sr)[:len(frame)//2]
39
 
40
- # Normalizar magnitud relativa (distribuci贸n de energ铆a)
41
- magn_rel = magn / (np.sum(magn) + 1e-9)
42
-
43
- # Frecuencia dominante relativa
44
- idx_max = np.argmax(magn_rel)
45
- freq_max = freqs[idx_max]
46
-
47
- # Asignar letra m谩s cercana
48
- idx_letra = (np.abs(FRECUENCIAS - freq_max)).argmin()
49
- letra = LETRAS[idx_letra]
50
- secuencia += letra
51
 
52
  # Eliminar repeticiones consecutivas
53
  secuencia_limpia = ""
@@ -57,18 +55,36 @@ def decodificar_audio(audio_path, progress=gr.Progress()):
57
  secuencia_limpia += c
58
  prev = c
59
 
60
- reporte = "SECUENCIA DETECTADA\n"
61
- reporte += secuencia + "\n\n"
62
- reporte += "SECUENCIA LIMPIA\n"
63
- reporte += secuencia_limpia + "\n\n"
 
 
 
64
  return reporte
65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  # ---- Interfaz Gradio ----
67
  with gr.Blocks() as demo:
68
- gr.Markdown("# Decodificador de Frecuencias Real (Objetivo, Sin Filtrado)")
69
  audio = gr.Audio(type="filepath", sources=["upload","microphone"])
70
- btn = gr.Button("Decodificar")
71
- salida = gr.Textbox(lines=15)
72
  btn.click(decodificar_audio, inputs=audio, outputs=salida)
73
 
74
  demo.launch()
 
2
  import numpy as np
3
  import librosa
4
  from scipy.fft import fft, fftfreq
5
+ from transformers import GPT2LMHeadModel, GPT2Tokenizer
6
+ import torch
7
 
8
  # ---- ABECEDARIO DE FRECUENCIAS ----
9
  ABECEDARIO = {
 
16
  FRECUENCIAS = np.array(list(ABECEDARIO.values()))
17
  LETRAS = list(ABECEDARIO.keys())
18
 
19
+ # ---- Cargar modelo GPT-2 peque帽o ----
20
+ MODEL_NAME = "gpt2" # modelo gratis local
21
+ tokenizer = GPT2Tokenizer.from_pretrained(MODEL_NAME)
22
+ model = GPT2LMHeadModel.from_pretrained(MODEL_NAME)
23
+
24
+ # ---- Funci贸n para decodificar audio a letras ----
25
+ def decodificar_audio(audio_path):
26
  if audio_path is None:
27
  return "鈿狅笍 Sin audio"
28
 
 
30
  n = len(y)
31
  secuencia = ""
32
 
 
33
  ventana_ms = 50
34
  ventana_len = int(sr * ventana_ms / 1000)
35
 
 
38
  if len(frame) == 0:
39
  continue
40
 
 
41
  yf_frame = fft(frame)
42
  magn = np.abs(yf_frame[:len(frame)//2])
43
  freqs = fftfreq(len(frame), 1/sr)[:len(frame)//2]
44
 
45
+ # Tomar todas las frecuencias
46
+ for f in freqs:
47
+ idx_letra = (np.abs(FRECUENCIAS - f)).argmin()
48
+ secuencia += LETRAS[idx_letra]
 
 
 
 
 
 
 
49
 
50
  # Eliminar repeticiones consecutivas
51
  secuencia_limpia = ""
 
55
  secuencia_limpia += c
56
  prev = c
57
 
58
+ # Generar palabras y frases con GPT-2
59
+ palabras, frases = generar_palabras_frases_gpt2(secuencia_limpia)
60
+
61
+ reporte = "SECUENCIA DETECTADA\n" + secuencia + "\n\n"
62
+ reporte += "SECUENCIA LIMPIA\n" + secuencia_limpia + "\n\n"
63
+ reporte += "PALABRAS GENERADAS\n" + ", ".join(palabras) + "\n\n"
64
+ reporte += "FRASES GENERADAS\n" + "\n".join(frases[:10])
65
  return reporte
66
 
67
+ # ---- IA real GPT-2: genera palabras y frases ----
68
+ def generar_palabras_frases_gpt2(secuencia):
69
+ prompt = f"Usa solo estas letras para formar palabras: {secuencia}\nPalabras y frases:"
70
+ inputs = tokenizer.encode(prompt, return_tensors="pt")
71
+ outputs = model.generate(inputs, max_length=100, do_sample=True, temperature=0.9, top_p=0.95)
72
+ texto_generado = tokenizer.decode(outputs[0], skip_special_tokens=True)
73
+
74
+ # Filtrar solo letras permitidas y separar palabras
75
+ letras_permitidas = set(secuencia + " ")
76
+ texto_filtrado = "".join([c for c in texto_generado.upper() if c in letras_permitidas])
77
+
78
+ palabras = texto_filtrado.split()
79
+ frases = [" ".join(palabras[i:i+5]) for i in range(0, len(palabras), 5)]
80
+ return palabras, frases
81
+
82
  # ---- Interfaz Gradio ----
83
  with gr.Blocks() as demo:
84
+ gr.Markdown("# Decodificador de Frecuencias Real + GPT-2 Compositor")
85
  audio = gr.Audio(type="filepath", sources=["upload","microphone"])
86
+ btn = gr.Button("Decodificar y Componer")
87
+ salida = gr.Textbox(lines=20)
88
  btn.click(decodificar_audio, inputs=audio, outputs=salida)
89
 
90
  demo.launch()