- Componentes requeridos
- Diagrama de circuito
- Creación del conjunto de datos para el reconocimiento de voz de Arduino
- Entrenando el modelo
- Código Arduino para el reconocimiento de voz Arduino
La tecnología de reconocimiento de voz es muy útil en la automatización, ya que no solo le brinda control de manos libres sobre los dispositivos, sino que también agrega seguridad al sistema. Además de fabricar dispositivos controlados por voz, el reconocimiento de voz también proporciona una ayuda significativa a las personas que padecen diversas discapacidades.
En proyectos anteriores, creamos un conversor de texto a voz (TTS) basado en Arduino y luces controladas por voz. Ahora, en este proyecto, vamos a utilizar el aprendizaje automático para entrenar un modelo de reconocimiento de voz usando Edge Impulse Studio con tres comandos, es decir, ' LIGHT ON' , ' LIGHT OFF' y ' NOISE '. Edge Impulse es una plataforma de aprendizaje automático en línea que permite a los desarrolladores crear la próxima generación de soluciones de dispositivos inteligentes con aprendizaje automático integrado. Anteriormente usamos Edge Impulse Studio para diferenciar los sonidos de tos y ruido.
Componentes requeridos
Hardware
- Arduino 33 BLE Sense
- LED
- Cables de puente
Software
- Estudio Edge Impulse
- IDE de Arduino
Hemos cubierto un tutorial detallado sobre Arduino 33 BLE Sense.
Diagrama de circuito
El diagrama de circuito para este reconocimiento de voz usando Arduino se muestra a continuación. La parte Fritzing para Arduino 33 BLE no estaba disponible, así que usé Arduino Nano ya que ambos tienen el mismo pinout.
El cable positivo del LED está conectado al pin digital 5 del sensor Arduino 33 BLE y el cable negativo está conectado al pin GND de Arduino.
Creación del conjunto de datos para el reconocimiento de voz de Arduino
Aquí, Edge Impulse Studio se utiliza para entrenar nuestro modelo de reconocimiento de voz. Entrenar un modelo en Edge Impulse Studio es similar a entrenar modelos de aprendizaje automático en otros marcos de aprendizaje automático. Para el entrenamiento, el primer paso de un modelo de aprendizaje automático es recopilar un conjunto de datos que tenga las muestras de datos que nos gustaría poder reconocer.
Como nuestro objetivo es controlar un LED con nuestro comando de voz, necesitaremos recopilar muestras de voz para todos los comandos y el ruido para que pueda distinguir entre los comandos de voz y otros ruidos.
Crearemos un conjunto de datos con tres clases " LED ON ", " LED OFF " y " Ruido ". Para crear un conjunto de datos, cree una cuenta de Edge Impulse, verifique su cuenta y luego comience un nuevo proyecto. Puede cargar las muestras usando su teléfono móvil, su placa Arduino o puede importar un conjunto de datos a su cuenta de impulso de borde. La forma más sencilla de cargar las muestras en su cuenta es utilizando su teléfono móvil. Para eso conecta el móvil con Edge Impulse.
Para conectar un teléfono móvil, haga clic en ' Dispositivos ' y luego haga clic en ' Conectar un nuevo dispositivo' .
Ahora, en la siguiente ventana, haga clic en 'Usar su teléfono móvil' y aparecerá un código QR. Escanee el código QR con su teléfono móvil o ingrese la URL proporcionada en el código QR.
Esto conectará su teléfono con Edge Impulse Studio.
Con su teléfono conectado con Edge Impulse Studio, ahora puede cargar sus muestras. Para cargar las muestras, haga clic en ' Adquisición de datos' . Ahora, en la página de adquisición de datos, ingrese el nombre de la etiqueta, seleccione el micrófono como sensor e ingrese la longitud de la muestra. Haga clic en ' Iniciar muestreo' , su dispositivo capturará una muestra de 2 segundos. Grabe un total de 10 a 12 muestras de voz en diferentes condiciones.
Después de cargar las muestras para la primera clase, ahora configure el cambio de etiqueta y recolecte las muestras para la clase ' luz apagada' y 'ruido' .
Estas muestras son para entrenar el módulo, en los próximos pasos, recopilaremos los datos de prueba. Los datos de prueba deben ser al menos el 30% de los datos de entrenamiento, por lo tanto, recopile las 4 muestras de 'ruido' y de 4 a 5 muestras para 'luz encendida' y 'luz apagada'.
Entrenando el modelo
Cuando nuestro conjunto de datos esté listo, ahora podemos crear un impulso para los datos. Para eso, vaya a la página ' Crear impulso '. Cambie la configuración predeterminada de un tamaño de ventana de 1000 ms a 1200 ms y la ventana de 500 ms aumenta a 50 ms. Esto significa que nuestros datos se procesarán 1,2 s a la vez, comenzando cada 58 ms.
Ahora, en la página ' Crear impulso' , haga clic en ' Agregar un bloque de procesamiento' . En la siguiente ventana, seleccione el bloque Audio (MFCC). Después de eso, haga clic en ' Agregar un bloque de aprendizaje' y seleccione el bloque Red neuronal (Keras). Luego haga clic en ' Guardar impulso' .
En el siguiente paso, vaya a la página MFCC y luego haga clic en 'Generar características'. Generará bloques MFCC para todas nuestras ventanas de audio.
Después de eso, vaya a la página 'Clasificador NN' y haga clic en los tres puntos en la esquina superior derecha de la ' Configuración de red neuronal' y seleccione ' Cambiar al modo Keras (experto)' .
Reemplace el original con el siguiente código y cambie el ' Índice de confianza mínimo' a ' 0.70' . Luego haga clic en el botón ' Iniciar entrenamiento' . Comenzará a entrenar su modelo.
importar tensorflow como tf de tensorflow.keras.models importar Sequential de tensorflow.keras.layers importar Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D de tensorflow.keras.optimizers importras Adam de tensorflow.keras.optimizers import MaxNorm # modelo de arquitectura modelo = Sequential () model.add (InputLayer (input_shape = (X_train.shape,), name = 'x_input')) model.add (Reshape ((int (X_train.shape / 13), 13, 1), input_shape = (X_train.shape,))) model.add (Conv2D (10, kernel_size = 5, activación = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (tamaño_piscina = 2, relleno = 'mismo')) modelo.add (Conv2D (5, tamaño_del_ kernel = 5, activación = 'relu', relleno = 'mismo', kernel_constraint = MaxNorm (3))) model.add (PromedioPooling2D (tamaño_piscina = 2,padding = 'same')) model.add (Flatten ()) model.add (Dense (clases, activación = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # esto controla la tasa de aprendizaje opt = Adam (lr = 0.005, beta_1 = 0.9, beta_2 = 0.999) # entrenar la red neuronal model.compile (loss = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epochs = 9, validation_data = (X_test, Y_test), detallado = 2)detallado = 2)detallado = 2)
Después de entrenar el modelo, mostrará el rendimiento del entrenamiento. Para mí, la precisión fue del 81,1% y la pérdida fue de 0,45, que no es un rendimiento ideal, pero podemos continuar. Puede aumentar el rendimiento de su modelo creando un vasto conjunto de datos.
Ahora que nuestro modelo de reconocimiento de voz esté listo, implementaremos este modelo como biblioteca Arduino. Antes de descargar el modelo como biblioteca, puede probar el rendimiento en la página "Clasificación en vivo" . La función de clasificación en vivo le permite probar el modelo tanto con los datos de prueba existentes que vienen con el conjunto de datos como mediante la transmisión de datos de audio desde su teléfono móvil.
Para probar los datos con su teléfono, elija ' Cambiar al modo de clasificación' en su teléfono.
Ahora para descargar el modelo como Biblioteca Arduino, vaya a la página ' Implementación ' y seleccione ' Biblioteca Arduino' . Ahora desplácese hacia abajo y haga clic en ' Construir ' para comenzar el proceso. Esto creará una biblioteca Arduino para su proyecto.
Ahora agregue la biblioteca en su IDE de Arduino. Para eso, abra el IDE de Arduino y luego haga clic en Sketch> Incluir biblioteca> Agregar biblioteca ZIP
Luego, cargue un ejemplo yendo a Archivo> Ejemplos> Nombre de su proyecto - Edge Impulse> nano_ble33_sense_microphone
Código Arduino para el reconocimiento de voz Arduino
Aquí se han realizado algunos cambios para controlar el LED con los comandos de voz.
Estamos haciendo algunos cambios en el bucle void () donde imprime la probabilidad de los comandos. En el código original, está imprimiendo todas las etiquetas y sus valores juntos.
para (tamaño_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
Para controlar el LED tenemos que guardar todas las probabilidades de comando en tres variables diferentes para que podamos ponerles declaraciones condicionales. Por lo tanto, de acuerdo con el nuevo código, si la probabilidad del comando ' encender la luz' es más de 0.50, entonces encenderá el LED y si la probabilidad del comando 'apagar la luz' es más de 0.50, apagará el LED.
para (tamaño_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ruido = resultado.clasificación.valor; Serial.println ("Ruido:"); Serial.println (ruido); } para (tamaño_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = result.classification.value; Serial.println ("Luz apagada:"); Serial.print (apagado); } lighton = 1- (ruido + lightoff); Serial.println ("Luz encendida:"); Serial.print (lighton); if (lighton> 0.50) {digitalWrite (led, HIGH); } if (lightoff> 0.50) {digitalWrite (led, LOW); }
Después de realizar los cambios, cargue el código en su Arduino. Abra el monitor en serie a 115200 baudios.
Así es como puede construir el reconocimiento de voz usando Arduino y dar comandos para operar los dispositivos.
A continuación se muestra un video de trabajo completo con una biblioteca y un código.