Cómo funciona el fingerprinting de audio
Del espectrograma al hash: el método de constelación que popularizó Shazam, explicado con un laboratorio que ejecuta el algoritmo sobre una señal sintética.
Identificar una canción de 7 segundos grabada en un bar ruidoso parece magia, pero es una tubería sorprendentemente sencilla. La idea central: no compares audio, compara constelaciones de picos. Una huella es resistente al ruido porque tira casi toda la información y se queda solo con lo que sobrevive a la compresión, el reverb y el ruido de fondo.
El laboratorio
Todo lo de abajo corre en tu navegador sobre un espectrograma sintético. Mueve los parámetros y verás cambiar la cantidad de picos, el tamaño de la huella y la robustez del match en tiempo real.
Por qué pares y no picos sueltos
Un pico individual (t, f) es poco discriminante: hay miles. La clave es emparejar cada ancla con varios picos en una zona objetivo posterior y guardar el triplete (f1, f2, dt). Eso genera hashes específicos e invariantes al desplazamiento temporal: da igual en qué segundo empieces a grabar.
def build_hashes(peaks, fan_out=4, zone=20):
# peaks ordenados por tiempo
hashes = []
for i, anchor in enumerate(peaks):
for target in peaks[i + 1 : i + 1 + zone]:
dt = target.t - anchor.t
if 0 < dt <= zone:
# hash invariante al offset temporal absoluto
key = (anchor.f, target.f, dt)
hashes.append((key, anchor.t))
if len(hashes) >= fan_out:
break
return hashes # match = histograma de (t_db - t_query)
