Skip to main content
caution

El contenido de este tutorial puede que ya no sea válido y ya no se proporciona mantenimiento de software ni soporte técnico.

Reconocimiento de voz basado en Edge Impulse usando XIAO nRF52840

En este wiki, mostraré cómo usar Edge Impulse con las capacidades de ML del Seeed Studio XIAO nRF52840 para Reconocimiento de Voz. Usaremos el Micrófono que ya está en el XIAO nRF52840 Sense.

Conocimientos previos al proyecto

El XIAO nRF52840 no está oficialmente soportado por Edge Impulse y no está presente como un dispositivo para recopilar datos, pero voy a demostrar cómo podemos usarlo para ejecutar inferencia usando el micrófono del dispositivo.

Primeros pasos

Para seguir este tutorial, necesitas el siguiente hardware

Seeed Studio XIAO nRF52840-Sense

Preparación del Hardware

No necesitamos ninguna preparación de hardware. El XIAO nRF52840 ya tiene todo lo que necesitamos para este proyecto. Solo necesitamos el micrófono PDM.

Aquí está el pinout del hardware para XIAO nRF52840 Sense

XIAO nrf82840 hardware

Preparación del Software

Para probar esto, solo necesitamos tres cosas:

  1. Dataset de comandos de voz de Google (ver abajo)
  2. Cuenta de Edge Impulse
  3. Arduino IDE

Dataset

  • Voy a usar el dataset de comandos de voz de Google. No todo el dataset, solo algunas palabras de él.
  • Por ahora, descarga el dataset y descomprímelo. El dataset completo es de 2.3GB.
  • Este dataset de comandos de voz de Google es usado por Google en su ejemplo de micro speech para TensorFlow Lite para MicroControllers.
  • Puedes encontrar el código aquí.

Podemos descargar el dataset desde el primer enlace de arriba y se extraerá como:

Speech commands dataset

Comenzando

Ahora comencemos usando Edge Impulse para crear un modelo ML basado en el dataset.

Paso 1 - Abrir Edge Impulse

  • Edge Impulse es una plataforma de desarrollo de aprendizaje automático (ML) que permite a los desarrolladores crear e implementar modelos ML personalizados en dispositivos edge, como microcontroladores y smartphones.
  • Proporciona una variedad de herramientas y recursos para ayudar a construir y optimizar modelos ML para tareas específicas, como detección de palabras clave, detección de anomalías y clasificación.

Vamos a crear un nuevo proyecto. Dale un nombre.

Edge Impulse New project

Después de crear un nuevo proyecto, ve a la página de adquisición de datos.

Edge Impulse Data Aquisition

Paso 2 - Añadir datos

Porque vamos a usar el dataset de comandos de voz de Google, elige "Add existing data". A continuación, elige "Upload data"

Edge Impulse upload data

A continuación, llegamos a seleccionar los datos - Vamos a elegir una de las carpetas del dataset de voz.

Edge Impulse upload data screen

El dataset tiene muchas palabras para entrenar. Vamos a elegir 3 carpetas (nuestras etiquetas) para entrenar y el ruido de fondo. Obtenemos 4 etiquetas. Presiona el botón "Browse". La primera es "go". Elige la carpeta - puedes ver todos los archivos .wav - y presiona "Upload".

Files to upload

A continuación, mantengamos las opciones predeterminadas para la categoría. Deja que Edge Impulse divida los datos. Para la etiqueta, escribe la etiqueta tú mismo. Después de todo esto, presiona "Upload data".

Edge Impulse upload data screen

En el lado derecho, verás los archivos siendo subidos. Puede tomar un tiempo, porque 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 subida en el lado derecho, arriba de la lista de archivos. Repite esto 3 veces más - 2 etiquetas más y el ruido de fondo. Voy a elegir happy, bird y la carpeta "background noise" con la etiqueta "noise". Al final, estas son todas las etiquetas que tenemos

Edge Impulse dataset screen

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

Edge Impulse dataset screen

Paso 3 - Seleccionar método de entrenamiento

Porque los clips son de 1 segundo cada uno y 16Khz, mantengamos el tamaño de ventana igual y la frecuencia. Ahora, vamos a añadir un bloque de procesamiento.

Edge Impulse dataset screen

Edge Impulse nos ayuda mucho aquí también. 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 elige Classification.

Edge Impulse dataset screen

Para ahora, nuestra última columna - Output features - tiene nuestras 4 etiquetas (bird, go, happy, noise). Presiona "Save Impulse" para guardar nuestro trabajo hasta ahora.

Edge Impulse dataset screen

Paso 4 - Generar las características

Ahora, echemos un vistazo a los parámetros MFCC. Si quieres, puedes cambiar los valores. Por ahora, mantengamos los valores predeterminados. Haz clic en "Save Parameters". Después de guardar los parámetros, obtenemos 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 tiempo, obtenemos nuestras características generadas y podemos visualizarlas

Feature explorer

Ahora llegamos a 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 ciclos de entrenamiento, si queremos aumento de datos y demás. Edge Impulse proporciona una arquitectura de red neuronal simple pero efectiva para detección de palabras clave. La arquitectura consiste en 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 nivel superior de las características MFCC. Edge Impulse soporta una variedad de tipos de capas ocultas, como capas convolucionales y capas 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 predeterminados son suficientes. Haz clic en "Start Training".

Network architecture

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

Training progress

Podemos cambiar el Target device a nRF52840 - como nuestro XIAO nRF52840 Sense - para que podamos ver cálculos de rendimiento y optimizaciones.

Target device

Después de que el entrenamiento esté completo, obtenemos la matriz de confusión y el explorador de datos

Confusion Matrix

Ahora con la red lista, probemos algunas muestras y hagamos algo de clasificación en vivo. Si vas a clasificación en vivo, podemos elegir una muestra y obtener el resultado de clasificación. Aquí, para un ejemplo de pájaro, obtenemos bird en el resultado. Eso es genial. El modelo está funcionando.

Live classification

Ahora, vayamos a las pruebas del modelo. Probemos el modelo usando las muestras divididas para pruebas. Haz clic en "Classify all".

Test data

Obtenemos casi 90% de precisión.

Accuracy

Paso 6 - Despliegue y obtener la biblioteca de Arduino

Ahora, vayamos al despliegue para obtener los archivos para nuestro microcontrolador.

Opciones de Despliegue

Elijamos Arduino

Accuracy

A continuación, mantengamos seleccionado Quantized(int8) y hagamos clic en "Build" para descargar los archivos para usar con el IDE de Arduino Podemos jugar un poco con las optimizaciones. Si te das cuenta de que la precisión es baja, intenta desactivar el compilador EON e intenta 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 Arduino IDE, agreguemos los archivos recién descargados. Ve a Sketch > Include Library > Add .ZIP Library

Arduino IDE Add library

Elige el archivo descargado. Después de un momento, aparecerá un mensaje en la ventana de salida diciendo que la librería está instalada.

Library installed

Paso 8 - Control por voz de las luces RGB en el XIAO nRF52840 Sense

Abramos un ejemplo Ve a Examples > <your_files_names> > nano_ble33_sense > nano_ble33_sense_microphone

Library installed

¿Por qué el Arduino BLE 33 Sense? Usan la misma librería - PDM (modulación de densidad de pulsos) - para controlar el micrófono. Arduino Nano BLE 33 Sense tiene un MP34DT05 y el XIAO nRF52840 Sense tiene el MSM261D3526H1CPM. Con el sketch abierto, compilémoslo y veamos 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 no lo has hecho ya) 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 inferencia (la placa ya comenzó a grabar, hacer inferencias y predicciones)

Serial Monitor

Trata de decir una de las palabras elegidas. He dicho go

Serial Monitor

Si detecta la palabra correctamente, la palabra más probable tendrá un resultado más cercano a 1.0 y las otras un valor más cercano a 0.0 Ahora, divirtámonos un poco y cambiemos el código un poco. El XIAO nRF52840 Sense tiene un LED incorporado 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 verificado las definiciones de PIN de la placa y los siguientes PINs 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. Mientras más cerca de 1.0, más seguros estamos de la clasificación de la palabra. Este valor puede ajustarse más adelante. Voy a establecerlo en 0.7.

Primero, define algunas variables. He definido estas justo después de las librerías incluidas:

/* threshold for predictions */
float threshold = 0.7;

/**
LABELS INDEX:
0 - bird
1 - go
2 - happy
3 - noise
*/
// LED pin (defines color) to light up
/**
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 hay predicción o la predicción cambia.

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 iteramos a través de 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 registrada usando una instrucción switch.

El bucle for completo, con nuestras adiciones, es:

for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
ei_printf(" %s: %.5f\n", result.classification[ix].label, result.classification[ix].value);
//lets light up some LEDS

if (result.classification[ix].value > threshold) {
//now let's see what label were in
switch (ix) {
case 0: LED = 11; break;
case 1: LED = 13; break;
case 2: LED = 12; break;
default: LED = 0;
}
//in Sense, LOW will light up the LED
if (LED != 0) {
digitalWrite (oldLED, HIGH); //if we enter a word right next to previous - we turn off the previous LED
digitalWrite (LED, LOW);
oldLED = LED;
}
else //turn off LED
digitalWrite (oldLED, HIGH);
}
}

Después de los cambios, simplemente sube el código a tu microcontrolador e intenta decir las palabras entrenadas y observa cómo el LED se enciende según la palabra.

Y esto es todo. Aunque no está directamente soportado, ahora podemos usar el XIAO nRF52840 Sense para ejecutar algunos modelos de ML usando Edge Impulse

✨ Proyecto de Colaborador

Soporte Técnico y Discusión de Productos

¡Gracias por elegir nuestros productos! Estamos aquí para brindarte diferentes tipos de soporte para asegurar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para satisfacer diferentes preferencias y necesidades.

Loading Comments...