Skip to main content

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

XIAO nrf82840 hardware

Preparación del Software

Para probar esto, solo necesitamos tres cosas:

  1. El conjunto de datos de comandos de voz de Google (ver más abajo).
  2. Una cuenta en Edge Impulse.
  3. Arduino IDE.

Conjunto de Datos

Podemos descargar el conjunto de datos desde el primer enlace y se extraerá en la siguiente estructura:

Speech commands dataset

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.

Edge Impulse New project

Después de crear el nuevo proyecto, dirígete a la página de adquisición de datos.

Edge Impulse Data Aquisition

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".

Edge Impulse upload data

A continuación, seleccionamos los datos. Elige una de las carpetas del conjunto de datos de comandos de voz.

Edge Impulse upload data screen

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".

Files to 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".

Edge Impulse upload data screen

En el lado derecho, verás los archivos subiendo. Puede tomar un tiempo, ya que son muchos.

Files upload progress

Después de un tiempo, se completa y muestra un pequeño resumen de los archivos subidos.

Files upload resume

Después de esto, esta es la pantalla

Edge Impulse dataset screen

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.

Edge Impulse dataset screen

A continuación, vamos a crear la red para aprender nuestras palabras. Haz clic en Impulse design para crear el impulso.

Edge Impulse dataset screen

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 dataset screen

Edge Impulse nos facilita mucho este paso. Haz clic en "Add a processing block" y elige Audio (MFCC).

Edge Impulse dataset screen

A continuación, haz clic en "Add learning block" y elege Classification.

Edge Impulse dataset screen

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.

Edge Impulse dataset screen

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".

Edge Impulse dataset screen

Después de hacer clic, Edge Impulse comenzará a generar las características.

Generate features

Después de un rato, veremos que las características se han generado y podremos visualizarlas

Feature explorer

Ahora, podemos entrenar nuestra red con los parámetros elegidos. Haz clic en "Classifier".

Paso 5 - Clasificador

Classifier

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".

Network architecture

Después de comenzar el entrenamiento, en el lado derecho de la pantalla podemos ver el progreso del entrenamiento.

Training progress

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.

Target device

Cuando el entrenamiento se complete, veremos la Matriz de Confusión y el Data Explorer.

Confusion Matrix

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.

Live classification

Ahora, pasemos a la prueba del modelo.
Probemos el modelo utilizando las muestras divididas para la prueba. Haz clic en "Clasificar todo".

Test data

Obtenemos casi el 90% de precisión.

Accuracy

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.

Accuracy

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.

Accuracy

Después de un tiempo, los archivos se descargarán automáticamente.

Arduino Files download

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.

Arduino IDE Add library

Elige el archivo descargado. Después de un momento, aparecerá un mensaje en la ventana de salida indicando que la biblioteca está instalada.

Library installed

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.

Library installed

¿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.

Sketch open

Después de un momento, el sketch se compila y no se reportan errores.

Sketch open

Ahora, conecta el XIAO nRF52840 Sense (si aún no lo has hecho) y sube el código a la placa.

Sketch open

Compile result

Upload

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).

Serial Monitor

Intenta decir una de las palabras elegidas. Yo dije "go"

Serial Monitor

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

    Red LED

  • Verde - LED_GREEN

    Green LED

  • Azul - LED_BLUE

    Blue LED

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;
int oldLED definirá el LED anterior que se encendió, para que podamos apagarlo cuando no haya predicción o cuando la predicción cambie.int LED es el LED actual que encenderemos.

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

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.

Loading Comments...