gnosticdev commited on
Commit
bd0c979
·
verified ·
1 Parent(s): 2de54da

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +27 -41
app.py CHANGED
@@ -2,7 +2,7 @@ import gradio as gr
2
  import numpy as np
3
  import librosa
4
  from scipy.fft import fft, fftfreq
5
- from transformers import GPT2Tokenizer, GPT2LMHeadModel
6
 
7
  # ---- ABECEDARIO DE FRECUENCIAS ----
8
  ABECEDARIO = {
@@ -11,19 +11,19 @@ ABECEDARIO = {
11
  'P': 1800,'Q': 1900,'R': 2000,'S': 2100,'T': 2200,'U': 2300,'V': 2400,
12
  'W': 2500,'X': 2600,'Y': 2700,'Z': 2800,' ': 0
13
  }
 
14
  FRECUENCIAS = np.array(list(ABECEDARIO.values()))
15
  LETRAS = list(ABECEDARIO.keys())
16
 
17
- # ---- Cargar diccionario real ----
18
- with open("diccionario.txt", "r", encoding="utf-8") as f:
19
- PALABRAS_REALES = set([line.strip().upper() for line in f if line.strip()])
20
-
21
- # ---- Cargar GPT-2 ----
22
- tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
23
- model = GPT2LMHeadModel.from_pretrained("gpt2")
24
 
25
- # ---- Decodificar audio a letras ----
26
- def decodificar_audio(audio_path):
27
  if audio_path is None:
28
  return "⚠️ Sin audio"
29
 
@@ -41,11 +41,13 @@ def decodificar_audio(audio_path):
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
- for f in freqs:
45
- idx_letra = (np.abs(FRECUENCIAS - f)).argmin()
46
- secuencia += LETRAS[idx_letra]
 
 
 
47
 
48
- # Secuencia limpia
49
  secuencia_limpia = ""
50
  prev = None
51
  for c in secuencia:
@@ -53,40 +55,24 @@ def decodificar_audio(audio_path):
53
  secuencia_limpia += c
54
  prev = c
55
 
56
- # Generar palabras usando GPT-2 + filtrado por diccionario
57
- palabras, frases = generar_palabras_frases_gpt2(secuencia_limpia)
 
 
 
 
58
 
59
  reporte = "SECUENCIA DETECTADA\n" + secuencia + "\n\n"
60
  reporte += "SECUENCIA LIMPIA\n" + secuencia_limpia + "\n\n"
61
- reporte += "PALABRAS GENERADAS\n" + ", ".join(palabras) + "\n\n"
62
- reporte += "FRASES GENERADAS\n" + "\n".join(frases[:10])
63
  return reporte
64
 
65
- # ---- GPT-2 determinista + filtrado ----
66
- def generar_palabras_frases_gpt2(secuencia):
67
- secuencia_recortada = secuencia[-500:] if len(secuencia) > 500 else secuencia
68
- prompt = f"Forma palabras usando solo estas letras: {secuencia_recortada}. Palabras y frases:"
69
- inputs = tokenizer.encode(prompt, return_tensors="pt")
70
- outputs = model.generate(
71
- inputs,
72
- max_new_tokens=100,
73
- do_sample=False
74
- )
75
- texto_generado = tokenizer.decode(outputs[0], skip_special_tokens=True)
76
- letras_permitidas = set(secuencia + " ")
77
- texto_filtrado = "".join([c.upper() for c in texto_generado if c.upper() in letras_permitidas])
78
- palabras = texto_filtrado.split()
79
- # Filtrar solo palabras reales
80
- palabras = [p for p in palabras if p in PALABRAS_REALES]
81
- frases = [" ".join(palabras[i:i+5]) for i in range(0, len(palabras), 5)]
82
- return palabras, frases
83
-
84
- # ---- Interfaz Gradio ----
85
  with gr.Blocks() as demo:
86
- gr.Markdown("# Decodificador de Frecuencias + Palabras Reales con GPT-2")
87
  audio = gr.Audio(type="filepath", sources=["upload","microphone"])
88
- btn = gr.Button("Decodificar y Componer")
89
  salida = gr.Textbox(lines=20)
90
  btn.click(decodificar_audio, inputs=audio, outputs=salida)
91
 
92
- demo.launch()
 
2
  import numpy as np
3
  import librosa
4
  from scipy.fft import fft, fftfreq
5
+ from datasets import load_dataset
6
 
7
  # ---- ABECEDARIO DE FRECUENCIAS ----
8
  ABECEDARIO = {
 
11
  'P': 1800,'Q': 1900,'R': 2000,'S': 2100,'T': 2200,'U': 2300,'V': 2400,
12
  'W': 2500,'X': 2600,'Y': 2700,'Z': 2800,' ': 0
13
  }
14
+
15
  FRECUENCIAS = np.array(list(ABECEDARIO.values()))
16
  LETRAS = list(ABECEDARIO.keys())
17
 
18
+ # ---- CARGAR DICCIONARIO REAL ----
19
+ ds = load_dataset("Kukedlc/Big-Spanish-1.2M", split="train")
20
+ PALABRAS_REALES = set()
21
+ for txt in ds["text"]:
22
+ for w in txt.split():
23
+ PALABRAS_REALES.add(w.upper())
 
24
 
25
+ # ---- FUNCIONES ----
26
+ def decodificar_audio(audio_path, progress=gr.Progress()):
27
  if audio_path is None:
28
  return "⚠️ Sin audio"
29
 
 
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
+ magn_rel = magn / (np.sum(magn) + 1e-9)
45
+ idx_max = np.argmax(magn_rel)
46
+ freq_max = freqs[idx_max]
47
+ idx_letra = (np.abs(FRECUENCIAS - freq_max)).argmin()
48
+ letra = LETRAS[idx_letra]
49
+ secuencia += letra
50
 
 
51
  secuencia_limpia = ""
52
  prev = None
53
  for c in secuencia:
 
55
  secuencia_limpia += c
56
  prev = c
57
 
58
+ letras_disponibles = set(secuencia_limpia)
59
+ palabras_validas = [w for w in PALABRAS_REALES if set(w).issubset(letras_disponibles)]
60
+ palabras_validas = sorted(palabras_validas, key=lambda x: -len(x))[:50]
61
+ frases = []
62
+ for i in range(0, len(palabras_validas), 5):
63
+ frases.append(" ".join(palabras_validas[i:i+5]))
64
 
65
  reporte = "SECUENCIA DETECTADA\n" + secuencia + "\n\n"
66
  reporte += "SECUENCIA LIMPIA\n" + secuencia_limpia + "\n\n"
67
+ reporte += "PALABRAS GENERADAS\n" + ", ".join(palabras_validas) + "\n\n"
68
+ reporte += "FRASES GENERADAS\n" + "\n".join(frases) + "\n"
69
  return reporte
70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
  with gr.Blocks() as demo:
72
+ gr.Markdown("# Decodificador de Frecuencias Real + Palabras Reales")
73
  audio = gr.Audio(type="filepath", sources=["upload","microphone"])
74
+ btn = gr.Button("Decodificar")
75
  salida = gr.Textbox(lines=20)
76
  btn.click(decodificar_audio, inputs=audio, outputs=salida)
77
 
78
+ demo.launch()