Spaces:
Sleeping
Sleeping
File size: 2,473 Bytes
d93a0b9 f8bd245 bd0c979 f8bd245 bd0c979 f8bd245 5e169a1 bd0c979 5e169a1 73c30f7 5e169a1 f8bd245 142f56f f8bd245 142f56f 5e169a1 f8bd245 5e169a1 f8bd245 bd0c979 5e169a1 66338ae f8bd245 905cd24 f8bd245 905cd24 f8bd245 905cd24 bd0c979 5e169a1 bd0c979 023e8cf 5e169a1 0c50a20 d93a0b9 5e169a1 0c50a20 bd0c979 023e8cf f8bd245 0c50a20 bd0c979 | 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 | import gradio as gr
import numpy as np
import librosa
from scipy.fft import fft, fftfreq
from datasets import load_dataset
ABECEDARIO = {
'A': 300,'B': 400,'C': 500,'D': 600,'E': 700,'F': 800,'G': 900,'H': 1000,
'I': 1100,'J': 1200,'K': 1300,'L': 1400,'M': 1500,'N': 1600,'O': 1700,
'P': 1800,'Q': 1900,'R': 2000,'S': 2100,'T': 2200,'U': 2300,'V': 2400,
'W': 2500,'X': 2600,'Y': 2700,'Z': 2800,' ': 0
}
FRECUENCIAS = np.array(list(ABECEDARIO.values()))
LETRAS = list(ABECEDARIO.keys())
ds = load_dataset("brianmwigo/spanish_dataset", split="train")
PALABRAS_REALES = set()
for txt in ds["text"]:
for w in txt.split():
PALABRAS_REALES.add(w.strip().upper())
def decodificar_audio(audio_path):
if audio_path is None:
return "⚠️ Sin audio"
y, sr = librosa.load(audio_path, sr=None, mono=True)
secuencia = ""
ventana_ms = 50
ventana_len = int(sr * ventana_ms / 1000)
for start in range(0, len(y), ventana_len):
frame = y[start:start+ventana_len]
if len(frame) == 0: continue
yf_frame = fft(frame)
magn = np.abs(yf_frame[:len(frame)//2])
freqs = fftfreq(len(frame), 1/sr)[:len(frame)//2]
magn_rel = magn / (np.sum(magn) + 1e-9)
idx_max = np.argmax(magn_rel)
freq_max = freqs[idx_max]
idx_letra = (np.abs(FRECUENCIAS - freq_max)).argmin()
secuencia += LETRAS[idx_letra]
secuencia_limpia = ""
prev = None
for c in secuencia:
if c != prev:
secuencia_limpia += c
prev = c
letras_disponibles = set(secuencia_limpia)
palabras_validas = [w for w in PALABRAS_REALES if set(w).issubset(letras_disponibles)]
palabras_validas.sort(key=lambda x: -len(x))
frases = []
for i in range(0, len(palabras_validas), 5):
frases.append(" ".join(palabras_validas[i:i+5]))
reporte = "SECUENCIA DETECTADA\n" + secuencia + "\n\n"
reporte += "SECUENCIA LIMPIA\n" + secuencia_limpia + "\n\n"
reporte += "PALABRAS GENERADAS\n" + ", ".join(palabras_validas[:50]) + "\n\n"
reporte += "FRASES GENERADAS\n" + "\n".join(frases[:10])
return reporte
with gr.Blocks() as demo:
gr.Markdown("# Detectar frecuencias → letras → palabras reales")
audio = gr.Audio(type="filepath", sources=["upload","microphone"])
btn = gr.Button("Decodificar")
salida = gr.Textbox(lines=20)
btn.click(decodificar_audio, inputs=audio, outputs=salida)
demo.launch() |