En la Parte 1 preparamos un conjunto equilibrado de fragmentos de audio cortos. En esta Parte 2 convertimos esos fragmentos en características numéricas compactas y entrenamos un modelo ligero apto para ejecutarse en un Raspberry Pi Pico.
Resumen de lo que cubrimos
1 Conjunto de características de 33 dimensiones y razones de selección.
2 Cómo calcularlas de forma eficiente en entornos embebidos.
3 Entrenamiento de una regresión logística multinomial con normalización adecuada.
4 Métricas reales de evaluación y matriz de confusión.
5 Exportación de pesos a un encabezado C++ para el firmware del Pico.
Conjunto de características 33 dimensiones
Para objetivos MCU preferimos características diseñadas a mano y de bajo coste computacional que mantengan la esencia de cada clase. Por fragmento de audio de 1.5 a 2.0 segundos, enmarcado con ventana Hann de 25 ms y hop de 10 ms, usamos las siguientes estadísticas por snippet
12 energías de banda aproximadas mediante Goertzel que cubren aproximadamente 300 a 4800 Hz, calculando la media y la desviación estándar en el tiempo para cada banda, lo que aporta 24 dimensiones
RMS media y desviación estándar 2 dimensiones
Centroid espectral media y desviación estándar 2 dimensiones
Rolloff espectral al 85 por ciento media y desviación estándar 2 dimensiones
Tasa de cruces por cero media y desviación estándar 2 dimensiones
Planitud espectral media 1 dimensión
Total 33 dimensiones
Por qué Goertzel
Goertzel es más ligero que un banco denso de filtros y se adapta bien a plataformas embebidas. Las estadísticas temporales añaden robustez frente a variaciones de voz, sala y dispositivo.
Preprocesado y enmarcado
Normalizamos por pico para consistencia y aplicamos pre énfasis para realzar las frecuencias altas, lo que ayuda a detectar alarmas y timbres. Después se generan tramas superpuestas con ventana Hann de 25 ms y hop de 10 ms y se aplican las operaciones por trama necesarias para las métricas espectrales y temporales.
Bandas Goertzel eficientes
Para aproximar la energía de cada banda calculamos unas pocas frecuencias por banda con el algoritmo de Goertzel y promediamos los resultados. Luego hacemos pooling temporal para obtener media y desviación estándar por banda. Importante: no aplicamos estandarización global en este paso; solo hacemos una normalización interna tipo z score dentro de cada vector de 12 bandas para eliminar sesgos de escala por banda. La estandarización global se ajusta sobre el conjunto de entrenamiento y se aplica más tarde.
Composición de las características
Calculamos transformadas por trama para derivar magnitudes, de las cuales extraemos centroides espectrales y rolloff al 0.85 por ciento. La tasa de cruces por cero se obtiene por cambios de signo en las tramas y la planitud espectral con su media temporal. Finalmente ensamblamos el vector de 33 dimensiones con orden consistente y serializamos a un CSV llamado featuresv1.csv con columnas path, label, source, feat donde feat es una lista JSON de 33 valores flotantes.
Entrenamiento con regresión logística multinomial
Flujo práctico y amigable con MCU
Cargamos las características y las etiquetas, ordenamos las etiquetas para conservar el mismo orden que será exportado al firmware como etiquetas legibles, y generamos una partición de entrenamiento y prueba. Si cada clase dispone de al menos dos fuentes distintas, hacemos un split por origen para evitar fugas de datos; en caso contrario usamos stratified split para preservar equilibrio de clases.
Normalización ajustada solo con datos de entrenamiento
Calculamos la media y la desviación estándar en el subconjunto de entrenamiento y aplicamos la transformada z sobre entrenamiento y prueba. Se añade un epsilon pequeño para evitar divisiones por cero, lo mismo que hace el firmware en tiempo de ejecución.
Entrenamiento del clasificador
Entrenamos una regresión logística multinomial con pesos de clase balanceados para compensar desequilibrios, con un número de iteraciones aumentado para garantizar convergencia. Este modelo es compacto y fácil de ejecutar en el Pico: básicamente normalización z, una capa lineal y softmax.
Evaluación real
Tras predecir sobre el conjunto de prueba calculamos informe de clasificación y matriz de confusión. En una ejecución representativa obtuvimos precisión 0.87 y F1 ponderado 0.86. La clase mejor detectada fue alarma de humo con F1 cercana a 0.99 y la más difícil fue baby con recall alrededor de 0.69.
Exportación a encabezado para firmware
Tras el ajuste ensamblamos una matriz de parámetros que incluye sesgos y pesos por clase, así como los vectores MU y SIGMA usados para la normalización. Estos se serializan en un archivo model_params.hpp que define constantes con el número de clases, número de características, vectores MU y SIGMA, la matriz de pesos con bias y un array de etiquetas. El código en el dispositivo realiza normalización z por característica seguida de producto punto con cada fila de pesos y softmax para obtener probabilidades.
Exportación para el Pico y eficiencia runtime
El runtime en el Raspberry Pi Pico queda reducido a aplicar (x - MU) dividido por SIGMA para cada característica, luego el cálculo de la capa lineal y la función softmax. Esto mantiene el bucle de inferencia extremadamente pequeño y eficiente en RAM y tiempo CPU.
Errores comunes y consejos prácticos
Evitar doble normalización: no aplicar la estandarización global en el flujo de alimentación desde PC si el Pico ya realiza (x - MU) sobre SIGMA.
Comprobar tasa de muestreo: asegurar que la extracción y el streaming en tiempo real usen la misma frecuencia de muestreo, por ejemplo 16 kHz, para evitar desajustes en las características.
Latencia frente a estabilidad: tramos más cortos y hops reducen la latencia pero pueden afectar estabilidad de detección. Ajustar umbrales y cantidad de frames consecutivos en la FSM del firmware para cada clase como se explicará en la Parte 3.
Próximo paso Parte 3 firmware y demo en vivo
En la Parte 3 desplegaremos el modelo en el Pico incluyendo bucle C++ de inferencia, FSM con histéresis por clase, indicación por LED, logs serie y demo con micrófono en vivo.
Acerca de Q2BSTUDIO
Q2BSTUDIO es una empresa de desarrollo de software especializada en aplicaciones a medida y software a medida. Ofrecemos soluciones de inteligencia artificial para empresas, agentes IA y desarrollo de modelos ligeros para edge devices. También somos expertos en ciberseguridad, servicios cloud aws y azure, servicios de inteligencia de negocio y visualización con power bi. Integramos proyectos de IA empresarial, automatización y analítica para transformar datos en decisiones y productos escalables.
Por qué trabajar con Q2BSTUDIO
Proporcionamos servicios end to end que cubren consultoría, diseño y desarrollo de aplicaciones a medida, implementación de soluciones de inteligencia artificial, despliegue seguro en la nube con AWS y Azure y cuadros de mando con Power BI. Nuestros equipos combinan experiencia en seguridad y en modelos eficientes para edge computing, lo que resulta ideal para productos IoT con requisitos de privacidad y latencia reducida.
Palabras clave para posicionamiento
aplicaciones a medida, software a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, ia para empresas, agentes IA, power bi
Recursos y contacto
Repositorio GitHub Edge-AI-Sound-Classifier-on-Raspberry-Pi-Pico en github.com/Ertugrulmutlu/Edge-AI-Sound-Classifier-on-Raspberry-Pi-Pico LinkedIn del autor en linkedin.com/in/ertugrul-mutlu Para proyectos a medida y consultas sobre soluciones de inteligencia artificial y seguridad contactar Q2BSTUDIO a través de nuestros canales corporativos