- Componentes necessários
- Diagrama de circuito
- Criação do conjunto de dados para reconhecimento de fala do Arduino
- Treinando o modelo
- Código Arduino para reconhecimento de voz Arduino
A tecnologia de reconhecimento de voz é muito útil na automação, que não só oferece controle sem as mãos sobre os dispositivos, mas também adiciona segurança ao sistema. Além de fazer dispositivos controlados por voz, o reconhecimento de voz também fornece uma ajuda significativa para pessoas que sofrem de várias deficiências.
Em projetos anteriores, construímos um conversor de texto para fala (TTS) baseado em Arduino e luzes controladas por voz. Agora, neste projeto, vamos usar o aprendizado de máquina para treinar um modelo de reconhecimento de fala usando o Edge Impulse Studio com três comandos, ou seja, ' LIGHT ON' , ' LIGHT OFF' e ' NOISE '. O Edge Impulse é uma plataforma de aprendizado de máquina online que permite aos desenvolvedores criar a próxima geração de soluções de dispositivos inteligentes com aprendizado de máquina integrado. Usamos o Edge Impulse Studio anteriormente para diferenciar sons de tosse e ruído.
Componentes necessários
Hardware
- Sentido Arduino 33 BLE
- CONDUZIU
- Jumper Wires
Programas
- Estúdio Edge Impulse
- IDE Arduino
Cobrimos um tutorial detalhado sobre o Arduino 33 BLE Sense.
Diagrama de circuito
O Diagrama de Circuito para este reconhecimento de voz usando Arduino é fornecido abaixo. A peça Fritzing para Arduino 33 BLE não estava disponível, então usei o Arduino Nano, pois ambos têm a mesma pinagem.
O terminal positivo do LED é conectado ao pino 5 digital do Arduino 33 BLE e o terminal negativo é conectado ao pino GND do Arduino.
Criação do conjunto de dados para reconhecimento de fala do Arduino
Aqui, o Edge Impulse Studio é usado para treinar nosso modelo de reconhecimento de fala. Treinar um modelo no Edge Impulse Studio é semelhante a treinar modelos de aprendizado de máquina em outras estruturas de aprendizado de máquina. Para o treinamento, a primeira etapa de um modelo de aprendizado de máquina é coletar um conjunto de dados que contém as amostras de dados que gostaríamos de reconhecer.
Como nosso objetivo é controlar um LED com nosso comando de voz, precisaremos coletar amostras de voz para todos os comandos e ruídos para que possamos distinguir entre comandos de voz e outros Ruídos.
Criaremos um conjunto de dados com três classes “ LED ON ”, “ LED OFF ” e “ ruído ”. Para criar um conjunto de dados, crie uma conta do Edge Impulse, verifique sua conta e inicie um novo projeto. Você pode carregar as amostras usando seu celular, sua placa Arduino ou pode importar um conjunto de dados para sua conta de impulso de borda. A maneira mais fácil de carregar as amostras em sua conta é usando seu telefone celular. Para isso conecte o celular com o Edge Impulse.
Para conectar o celular, clique em ' Dispositivos ' e em ' Conectar um novo dispositivo' .
Agora, na próxima janela, clique em 'Usar seu celular' , e um código QR aparecerá. Digitalize o código QR com o seu celular ou digite o URL fornecido no código QR.
Isso conectará seu telefone ao estúdio Edge Impulse.
Com seu telefone conectado ao Edge Impulse Studio, agora você pode carregar suas amostras. Para carregar as amostras, clique em ' Aquisição de dados' . Agora, na página de aquisição de dados, insira o nome do rótulo, selecione o microfone como sensor e insira o comprimento da amostra. Clique em ' Iniciar amostragem' e seu dispositivo irá capturar uma amostra de 2 segundos. Grave um total de 10 a 12 amostras de voz em diferentes condições.
Depois de enviar as amostras para a primeira aula, defina agora a alteração do rótulo e colete as amostras para as classes ' luz apagada' e 'ruído' .
Esses exemplos são para o módulo de Treinamento, nas próximas etapas coletaremos os Dados de Teste. Os dados de teste devem ser pelo menos 30% dos dados de treinamento, portanto, colete as 4 amostras de 'ruído' e 4 a 5 amostras para 'luz acesa' e 'luz apagada'.
Treinando o modelo
Como nosso conjunto de dados está pronto, agora podemos criar um impulso para os dados. Para isso, vá para a página ' Criar impulso '. Altere as configurações padrão de um tamanho de janela de 1000 ms para 1200 ms e aumento da janela de 500 ms para 50 ms. Isso significa que nossos dados serão processados 1,2 s por vez, começando a cada 58 ms.
Agora na página ' Criar impulso' clique em ' Adicionar um bloco de processamento' . Na próxima janela, selecione o bloco de Áudio (MFCC). Depois disso, clique em ' Adicionar um bloco de aprendizagem' e selecione o bloco Rede Neural (Keras). Em seguida, clique em ' Salvar Impulso' .
Na próxima etapa, vá para a página MFCC e clique em 'Gerar recursos'. Ele irá gerar blocos MFCC para todas as nossas janelas de áudio.
Depois disso, vá para a página ' NN Classifier' e clique nos três pontos no canto superior direito de ' Neural Network settings' e selecione ' Switch to Keras (expert) mode' .
Substitua o original pelo código a seguir e altere a 'Classificação de confiança mínima' para ' 0,70' . Em seguida, clique no botão ' Iniciar treinamento' . Ele começará a treinar seu modelo.
import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D de tensorflow.keras.optimizers import Adam from tensorflow.keras.constraints import MaxNorm # model architecture model = 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, activation = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2, padding = 'mesmo')) model.add (Conv2D (5, kernel_size = 5, ativação = 'relu', preenchimento = 'mesmo', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2,padding = 'mesmo')) model.add (Flatten ()) model.add (Dense (classes, ativação = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # isto controla a taxa de aprendizagem opt = Adam (lr = 0,005, beta_1 = 0,9, beta_2 = 0,999) # treinar a rede neural model.compile (loss = 'categorical_crossentropy', otimizador = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, épocas = 9, validação_dados = (X_test, Y_test), verboso = 2)verboso = 2)verboso = 2)
Depois de treinar o modelo, ele mostrará o desempenho do treinamento. Para mim, a precisão foi de 81,1% e a perda foi de 0,45, o que não é um desempenho ideal, mas podemos prosseguir. Você pode aumentar o desempenho do seu modelo criando um vasto conjunto de dados.
Agora que nosso modelo de reconhecimento de fala está pronto, vamos implantar este modelo como uma biblioteca Arduino. Antes de baixar o modelo como uma biblioteca, você pode testar o desempenho acessando a página ' Classificação ao vivo' . O recurso de classificação ao vivo permite que você teste o modelo com os dados de teste existentes que vieram com o conjunto de dados ou por streaming de dados de áudio de seu telefone celular.
Para testar os dados com seu telefone, escolha ' Alternar para modo de classificação' em seu telefone.
Agora, para baixar o modelo como Arduino Library, vá para a página ' Deployment ' e selecione ' Arduino Library' . Agora role para baixo e clique em ' Build ' para iniciar o processo. Isso criará uma biblioteca Arduino para o seu projeto.
Agora adicione a biblioteca em seu Arduino IDE. Para isso, abra o IDE do Arduino e clique em Sketch> Incluir Biblioteca> Add.ZIP library
Em seguida, carregue um exemplo acessando Arquivo> Exemplos> Nome do seu projeto - Edge Impulse> nano_ble33_sense_microphone
Código Arduino para reconhecimento de voz Arduino
Aqui, algumas alterações foram feitas para controlar o LED com os comandos de voz.
Estamos fazendo algumas mudanças no loop void () onde está imprimindo a probabilidade de comandos. No código original, ele está imprimindo todos os rótulos e seus valores juntos.
para (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
Para controlar o LED, temos que salvar todas as probabilidades de comando em três variáveis diferentes para que possamos colocar declarações condicionais nelas. Portanto, de acordo com o novo código, se a probabilidade do comando ' light on' for maior que 0,50, ele ligará o LED e se a probabilidade do comando ' light off' for maior que 0,50 então ele desligará o LED.
para (size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {noise = result.classification.value; Serial.println ("Ruído:"); Serial.println (ruído); } para (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = result.classification.value; Serial.println ("Luz apagada:"); Serial.print (lightoff); } lighton = 1- (ruído + lightoff); Serial.println ("Light ON:"); Serial.print (lighton); if (lighton> 0,50) {digitalWrite (led, HIGH); } if (lightoff> 0,50) {digitalWrite (led, LOW); }
Depois de fazer as alterações, carregue o código em seu Arduino. Abra o monitor serial em 115200 baud.
É assim que você pode construir o reconhecimento de voz usando o Arduino e dar comandos para operar os dispositivos.
Um vídeo de trabalho completo com uma biblioteca e código é fornecido abaixo.