
Proyecto Katy Payne — Sesión 2: convertir en números y mirar antes de entrenar
Ya conocéis el paso de hoy de Laennec: convertir cada sonido en 13 coeficientes MFCC que resuman su timbre, sin importar cuánto dure el archivo.
import librosa
import numpy as np
def extraer_caracteristicas(ruta_archivo):
señal, frecuencia = librosa.load(ruta_archivo, sr=None)
mfcc = librosa.feature.mfcc(y=señal, sr=frecuencia, n_mfcc=13)
return mfcc.mean(axis=1)
Construyendo las tablas de entrenamiento y prueba
Como el reparto ya viene hecho en train_test_split.csv, construimos directamente las dos tablas a partir de sus columnas:
import pandas as pd
def construir_tabla(columna_gato, columna_perro):
filas = []
for nombre_archivo in reparto[columna_gato].dropna():
caracteristicas = extraer_caracteristicas(carpeta_audios + nombre_archivo)
filas.append(list(caracteristicas) + ["gato"])
for nombre_archivo in reparto[columna_perro].dropna():
caracteristicas = extraer_caracteristicas(carpeta_audios + nombre_archivo)
filas.append(list(caracteristicas) + ["perro"])
columnas = [f"mfcc_{i + 1}" for i in range(13)] + ["clase"]
return pd.DataFrame(filas, columns=columnas)
datos_entrenamiento = construir_tabla("train_cat", "train_dog")
datos_prueba = construir_tabla("test_cat", "test_dog")
datos_entrenamiento.shape, datos_prueba.shape
Esta celda tarda un rato en recorrer todos los audios — con menos de 300 archivos en total, debería ser cuestión de uno o dos minutos, no más.
[COMPLETAR CON VUESTROS DATOS REALES: forma de las dos tablas]

Un vistazo simple, antes de entrenar nada
En Laennec no hicimos esto, pero aquí merece la pena: comprobar si, con solo mirar uno de los 13 números, gatos y perros ya se separan a simple vista — el mismo espíritu con el que Katy Payne miraba un espectrograma antes de tener ningún modelo, buscando a ojo si había un patrón antes de medirlo con precisión.
import matplotlib.pyplot as plt
datos_entrenamiento.boxplot(column="mfcc_1", by="clase")
plt.title("Coeficiente MFCC 1, por clase")
plt.suptitle("")
plt.ylabel("Valor de mfcc_1")
plt.show()
Si las dos cajas (gato y perro) apenas se tocan, es una señal de que este problema es mucho más fácil que el de Laennec — con un solo número ya casi se distinguen. Probad a cambiar "mfcc_1" por otro coeficiente ("mfcc_2", "mfcc_3"…) y comparad cuál separa mejor las dos cajas.
[COMPLETAR EN CLASE: ¿qué coeficiente MFCC separa mejor gato de perro con solo mirar el gráfico?]

Próximo paso
Con las tablas ya construidas y una primera pista visual de que el problema parece razonable, en la última sesión entrenamos el modelo y comprobamos, con números, si de verdad distingue bien gatos de perros.



