Reconocimiento de Voz basado en Edge Impulse con XIAO nRF52840
En esta wiki, mostraré cómo utilizar Edge Impulse con las capacidades de Machine Learning del Seeed Studio XIAO nRF52840 para el reconocimiento de voz. Usaremos el micrófono integrado en la XIAO nRF52840 Sense.
Conocimientos previos al proyecto
La XIAO nRF52840 no es oficialmente compatible con Edge Impulse y no aparece como un dispositivo para la recopilación de datos. Sin embargo, en este tutorial demostraré cómo se puede utilizar para ejecutar inferencias utilizando el micrófono del dispositivo.
Primeros pasos
Para seguir este tutorial, necesitarás el siguiente hardware:
Seeed Studio XIAO nRF52840-Sense |
---|
![]() |
Preparación del Hardware
No se requiere ninguna preparación de hardware. La XIAO nRF52840 ya cuenta con todo lo necesario para este proyecto. Solo necesitamos el micrófono PDM.
Aquí está el diagrama de pines de la XIAO nRF52840 Sense
Preparación del Software
Para probar esto, solo necesitamos tres cosas:
- El conjunto de datos de comandos de voz de Google (ver más abajo).
- Una cuenta en Edge Impulse.
- Arduino IDE.
Conjunto de Datos
- Se utilizará el conjunto de datos de comandos de voz de Google, pero no en su totalidad, solo algunas palabras.
- Primero, descarga el conjunto de datos y descomprímelo. El conjunto completo pesa 2.3GB.
- Este conjunto de datos de comandos de voz de Google es utilizado por Google en su ejemplo de micro speech para TensorFlow Lite for MicroControllers.
- Aquí puedes encontrar el código.
Podemos descargar el conjunto de datos desde el primer enlace y se extraerá en la siguiente estructura:
Introducción
Ahora comencemos a usar Edge Impulse para crear un modelo de Machine Learning basado en el conjunto de datos.
Paso 1 - Abrir Edge Impulse
- Edge Impulse es una plataforma de desarrollo de Machine Learning (ML) que permite a los desarrolladores crear y desplegar modelos de ML personalizados en dispositivos de borde, como microcontroladores y teléfonos inteligentes.
- Proporciona una variedad de herramientas y recursos para ayudar a construir y optimizar modelos de ML para tareas específicas, como detección de palabras clave, detección de anomalías y clasificación.
Crea un nuevo proyecto y asígnale un nombre.
Después de crear el nuevo proyecto, dirígete a la página de adquisición de datos.
Paso 2 - Agregar datos
Como vamos a utilizar el conjunto de datos de comandos de voz de Google, selecciona "Agregar datos existentes".
Luego, elige "Subir datos".
A continuación, seleccionamos los datos. Elige una de las carpetas del conjunto de datos de comandos de voz.
El conjunto de datos tiene muchas palabras para entrenar. Seleccionemos 3 carpetas (nuestros labels) para entrenar y el ruido de fondo. En total, tendremos 4 etiquetas.
Presiona el botón "Browse".
La primera es "go". Selecciona la carpeta (puedes ver todos los archivos .wav) y presiona "Upload".
A continuación, mantén las opciones predeterminadas para la categoría y deja que Edge Impulse divida los datos.
Para la etiqueta, escribe el nombre de la etiqueta manualmente.
Después de esto, presiona "Upload data".
En el lado derecho, verás los archivos subiendo. Puede tomar un tiempo, ya que son muchos.
Después de un tiempo, se completa y muestra un pequeño resumen de los archivos subidos.
Después de esto, esta es la pantalla
Para subir más datos, presiona el pequeño botón de carga en el lado derecho, encima de la lista de archivos.
Repite este proceso dos veces más: una para cada etiqueta adicional y otra para el fondo de ruido.
Voy a elegir "happy", "bird" y la carpeta "background noise" con la etiqueta "noise".
Al final, estos serán todos los labels que tendremos.
A continuación, vamos a crear la red para aprender nuestras palabras. Haz clic en Impulse design para crear el impulso.
Paso 3 - Seleccionar el método de entrenamiento
Dado que los clips tienen 1 segundo de duración y 16 kHz, mantengamos el tamaño de la ventana y la frecuencia igual. Ahora, agreguemos un bloque de procesamiento.
Edge Impulse nos facilita mucho este paso. Haz clic en "Add a processing block" y elige Audio (MFCC).
A continuación, haz clic en "Add learning block" y elege Classification.
Hasta ahora, nuestra última columna, Output features, tiene nuestras 4 etiquetas (bird, go, happy, noise).
Haz clic en "Save Impulse" para guardar nuestro progreso hasta ahora.
Ahora, echemos un vistazo a los parámetros de MFCC. Si lo deseas, puedes cambiar los valores, pero por ahora, mantén los valores predeterminados.
Haz clic en "Save Parameters".
Después de guardar los parámetros, aparecerá una nueva ventana para "Generate features".
Después de hacer clic, Edge Impulse comenzará a generar las características.
Después de un rato, veremos que las características se han generado y podremos visualizarlas
Ahora, podemos entrenar nuestra red con los parámetros elegidos. Haz clic en "Classifier".
Paso 5 - Clasificador
Aquí podemos ajustar la configuración de nuestra red, como el número de ciclos de entrenamiento, si queremos usar aumento de datos, etc. Edge Impulse proporciona una arquitectura de red neuronal simple pero efectiva para el reconocimiento de palabras clave. La arquitectura consta de las siguientes capas:
- Capa de entrada: La capa de entrada toma las características MFCC como entrada.
- Capas ocultas: Las capas ocultas aprenden a extraer características de mayor nivel a partir de las características MFCC. Edge Impulse admite varios tipos de capas ocultas, como capas convolucionales y recurrentes.
- Capa de salida: La capa de salida predice la probabilidad de que la entrada de audio contenga una palabra clave.
Podemos cambiar los parámetros predeterminados, pero los valores predeterminados son suficientes. Haz clic en "Start Training".
Después de comenzar el entrenamiento, en el lado derecho de la pantalla podemos ver el progreso del entrenamiento.
Podemos cambiar el Target device a nRF52840, como el XIAO nRF52840 Sense, para que podamos ver los cálculos de rendimiento y las optimizaciones realizadas para este dispositivo.
Cuando el entrenamiento se complete, veremos la Matriz de Confusión y el Data Explorer.
Ahora que la red está lista, intentemos algunas muestras y realicemos una clasificación en vivo.
Si vamos a clasificación en vivo, podemos elegir una muestra y ver el resultado de la clasificación. Aquí, para un ejemplo de ave, obtenemos "ave" en el resultado. Eso es genial. El modelo está funcionando.
Ahora, pasemos a la prueba del modelo.
Probemos el modelo utilizando las muestras divididas para la prueba. Haz clic en "Clasificar todo".
Obtenemos casi el 90% de precisión.
Paso 6 - Despliegue y obtención de la biblioteca de Arduino
Ahora, pasemos al despliegue para obtener los archivos para nuestro microcontrolador.
Opciones de Despliegue
Elijamos Arduino.
A continuación, mantengamos seleccionada la opción Quantized (int8) y hagamos clic en "Construir" para descargar los archivos que usaremos con el IDE de Arduino.
Podemos experimentar un poco con las optimizaciones. Si te das cuenta de que la precisión es baja, intenta desactivar el compilador EON y prueba de nuevo.
Después de un tiempo, los archivos se descargarán automáticamente.
Paso 7 - Agregar la biblioteca al IDE de Arduino
En el IDE de Arduino, vamos a agregar los archivos recién descargados. Ve a Esquema > Incluir biblioteca > Agregar biblioteca .ZIP.
Elige el archivo descargado. Después de un momento, aparecerá un mensaje en la ventana de salida indicando que la biblioteca está instalada.
Paso 8 - Controlar por voz las luces RGB en el XIAO nRF52840 Sense
Abramos un ejemplo.
Ve a Ejemplos > <tus_nombres_de_archivos> > nano_ble33_sense > nano_ble33_sense_microphone.
¿Por qué el Arduino BLE 33 Sense? Usan la misma biblioteca — PDM (modulación por densidad de pulsos) — para controlar el micrófono. El Arduino Nano BLE 33 Sense tiene un MP34DT05 y el XIAO nRF52840 Sense tiene un MSM261D3526H1CPM.
Con el sketch abierto, vamos a compilarlo y ver si no tenemos errores.
Después de un momento, el sketch se compila y no se reportan errores.
Ahora, conecta el XIAO nRF52840 Sense (si aún no lo has hecho) y sube el código a la placa.
Ahora, abre el puerto serie (Ctrl+Shift+M) y verifica los resultados de la inferencia (la placa ya ha comenzado a grabar, hacer inferencias y realizar predicciones).
Intenta decir una de las palabras elegidas. Yo dije "go"
Si detecta la palabra correctamente, la palabra más probable tendrá un resultado cercano a 1.0 y las demás un valor más cercano a 0.0.
Ahora, divirtámonos un poco y cambiemos un poco el código.
El XIAO nRF52840 Sense tiene un LED integrado que tiene 3 colores:
- Rojo - LED_BUILTIN o LED_RED
- Verde - LED_GREEN
- Azul - LED_BLUE
Dado que tenemos 3 palabras, asignemos un color a cada una y encendamos el color respectivo para la palabra.
- Rojo será para "bird"
- Verde para "Go"
- Azul para "happy"
Porque será más fácil, he revisado las definiciones de los pines de la placa y los siguientes pines están asignados al color del LED:
- ROJO - Pin 11
- VERDE - Pin 13
- AZUL - Pin 12
Primero, necesitamos definir un umbral. Sabemos que las predicciones van de 0.0 a 1.0. Cuanto más cerca de 1.0, más seguros estamos de la clasificación de la palabra. Este valor se puede ajustar más tarde. Lo voy a fijar en 0.7.
Primero, definamos algunas variables. Las he definido justo después de las bibliotecas incluidas:+
/* umbral para predicciones */
float threshold = 0.7;
/**
LABELS INDEX:
0 - bird
1 - go
2 - happy
3 - noise
*/
// LED pin (Define el color) que se encenderá
/**
PIN 11 - RED
PIN 12 - BLUE
PIN 13 - GREEN
*/
int LED = 0;
int oldLED;
A continuación, en la función loop(), dentro de la instrucción del bucle for, donde recorremos el CLASSIFIER_LABEL_COUNT (alrededor de la línea 129 — ya con las líneas anteriores):
for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
Usamos una instrucción if para verificar el valor de clasificación. Si está por encima del umbral definido, verificamos qué palabra ha sido grabada utilizando una instrucción switch.
El bucle completo for, con nuestras adiciones, es el siguiente:
for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
ei_printf(" %s: %.5f\n", result.classification[ix].label, result.classification[ix].value);
//vamos a encender algunos LEDS
if (result.classification[ix].value > threshold) {
//ahora veamos en qué etiqueta estamos
switch (ix) {
case 0: LED = 11; break;
case 1: LED = 13; break;
case 2: LED = 12; break;
default: LED = 0;
}
//en Sense, LOW encenderá el LED
if (LED != 0) {
digitalWrite (oldLED, HIGH); //si entramos a una palabra justo después de la anterior, apagamos el LED anterior
digitalWrite (LED, LOW);
oldLED = LED;
}
else //apagar el LED
digitalWrite (oldLED, HIGH);
}
}
Después de los cambios, simplemente sube el código a tu microcontrolador y prueba decir las palabras entrenadas para ver cómo el LED se enciende de acuerdo con la palabra.
Y eso es todo. Aunque no está directamente soportado, ahora podemos usar el XIAO nRF52840 Sense para ejecutar algunos modelos de ML usando Edge Impulse.
✨ Proyecto del Contribuidor
- Este proyecto es apoyado por el Proyecto del Contribuidor de Seeed Studio.
- Gracias por tus esfuerzos, Bruno tu trabajo será exhibido aquí.
Soporte Técnico y Discusión de Productos
¡Gracias por elegir nuestros productos! Estamos aquí para ofrecerte diversos tipos de soporte y asegurarnos de que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a diferentes preferencias y necesidades.