Reconhecimento de fala com Arduino e BitVoicer Server
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 3 |
Sobre este projeto
Neste post vou mostrar como usar uma placa Arduino e o BitVoicer Server para controlar alguns LEDs com comandos de voz. Vou usar o Arduino Micro neste post, mas você pode usar qualquer placa Arduino que tiver em mãos.
Os seguintes procedimentos serão executados para transformar comandos de voz em atividade de LED:
- As ondas de áudio serão capturadas e amplificadas pela placa Sparkfun Electret Breakout;
- O sinal amplificado será digitalizado e armazenado em buffer no Arduino usando seu conversor analógico para digital (ADC);
- Amostras do Theaudio serão transmitidas para o BitVoicer Server usando a porta serial do Arduino;
- BitVoicerServer irá processar o stream de áudio e reconhecer a fala que ele contém;
- A fala reconhecida será mapeada para comandos predefinidos que serão enviados de volta para o Arduino;
- O Arduino identificará os comandos e executará a ação apropriada.
O vídeo acima mostra o resultado final dessa postagem. Observe no vídeo que o BitVoicer Server também fornece feedback de voz sintetizada. Esse feedback de voz é definido no servidor e reproduzido pelo adaptador de áudio do servidor, mas o áudio sintetizado também pode ser enviado ao Arduino e reproduzido usando um conversor digital para analógico (DAC). Em meu próximo post, vou mostrar como usar o Arduino DUE, um amplificado e um alto-falante para reproduzir a fala sintetizada usando o próprio Arduino.
Lista de Materiais:
- Arduino Micro (ou qualquer outra placa Arduino):~ U $ 20,00
- Breakout do microfone de eletreto Sparkfun:U $ 7,95
- BitVoicer Server 1.0 :U $ 9,90
- Breadboard:~ U $ 10,00
- 3 xLEDs:~ U $ 1,00
- 3 resistores x330 ohms:~ U $ 0,75
- Jumperwires:~ U $ 0,30
ETAPA 1:Fiação
A primeira etapa é conectar o Arduino e a placa de ensaio com os componentes, conforme mostrado nas imagens abaixo.
O detalhe mais importante aqui se refere à referência analógica fornecida ao Arduino ADC. Em meus testes, obtive melhores resultados usando 3,3 V com o Sparkfun Electret Breakout. É por isso que adicionei um jumper entre o pino de 3,3 V e o pino AREF. Se você decidir usar a função analogRead (por qualquer motivo) enquanto 3,3 V estiver sendo aplicado ao pino AREF, você DEVE chamar analogReference (EXTERNAL) antes de usar a função analogRead. Caso contrário, você fará um curto entre a tensão de referência ativa (gerada internamente) e o pino AREF, possivelmente danificando o microcontrolador em sua placa Arduino.
ETAPA 2:upload do código para o Arduino
Agora você precisa fazer o upload do código abaixo para o seu Arduino. Por conveniência, o esboço do Arduino também está disponível na seção de anexos na parte inferior deste post. Antes de fazer o upload do código, você deve instalar corretamente as bibliotecas do BitVoicer Server no IDE do Arduino (Importando uma biblioteca .zip).
BVS_Demo1.ino
Este esboço tem quatro partes principais:
- Referências de biblioteca e declaração de variável:As duas primeiras linhas incluem referências às bibliotecas BVSP e BVSMic. Essas bibliotecas são fornecidas pela BitSophia e podem ser encontradas na pasta de instalação do BitVoicer Server. As outras linhas declaram constantes e variáveis usadas em todo o esboço. A classe BVSP é usada para se comunicar com o BitVoicer Server e a classe BVSMic é usada para capturar e armazenar amostras de áudio.
- Função de configuração:Esta função inicializa a comunicação serial, a classe BVSP, a classe BVSMic e define o “manipulador de eventos” (na verdade é um ponteiro de função) para o evento frameReceived.
- Loopfunction:esta função executa três ações importantes:solicita o status do servidor (função keepAlive ()), verifica se o servidor enviou dados e processa os dados recebidos (função receive ()) e controla a gravação e o envio de áudio streams (funções isSREAvailable (), startRecording (), stopRecording () e sendStream ()).
- Função BVSP_frameReceived:esta função é chamada toda vez que a função receive () identifica que um quadro completo foi recebido. Aqui eu executo o comando enviado do servidor BitVoicer. O comando contém 2 bytes. O primeiro byte indica o pino e o segundo byte indica o valor do pino. Eu uso a função analogWrite () para definir o valor apropriado para o pino.
ETAPA 3:Importando objetos da solução do BitVoicer Server
Agora você deve configurar o BitVoicer Server para funcionar com o Arduino. O BitVoicer Server possui quatro objetos principais de solução:Locations, Devices, BinaryData e Voice Schemas.
Os locais representam o local físico onde um dispositivo está instalado. No meu caso, criei um local chamado Casa.
Os dispositivos são os clientes do BitVoicer Server. Criei um dispositivo Mixed, denominei-o ArduinoMicro e entrei nas configurações de comunicação. NOTA SOBRE ARDUINO MICRO :ele usa RTS e DTR, então você deve habilitar essas configurações na guia de comunicação. Também criei um dispositivo SystemSpeaker para sintetizar a fala usando o adaptador de áudio do servidor.
BinaryData é um tipo de comando que o BitVoicer Server pode enviar para dispositivos clientes. Eles são, na verdade, matrizes de bytes que você pode vincular a comandos. Quando o BitVoicer Server reconhece a fala relacionada àquele comando, ele envia a matriz de bytes para o dispositivo de destino. Criei um objeto BinaryData para cada valor de pino e os denominei ArduinoMicroGreenLedOn, ArduinoMicroGreenLedOff e assim por diante. Acabei com 18 objetos BinaryData em minha solução, então sugiro que você baixe e importe os objetos do VoiceSchema.sof arquivo abaixo.
Os esquemas de voz são onde tudo se junta. Eles definem quais sentenças devem ser reconhecidas e quais comandos executar. Para cada frase, você pode definir quantos comandos precisar e a ordem em que serão executados. Você também pode definir atrasos entre os comandos. Assim consegui realizar a sequência de ações que você vê no vídeo.
Você pode importar (Importando objetos de solução) todos os objetos de solução que usei neste post a partir dos arquivos abaixo. Um contém os dispositivos e o outro contém o esquema de voz e seus comandos.
Devices.sof
VoiceSchema.sof
ETAPA 4:Conclusão
É isso! Espero que tenhas gostado.
Você tem tudo que precisa para executar a demonstração mostrada no vídeo. Observe que no vídeo eu comecei habilitando o dispositivo ArduinoMicro no BitVoicer Server Manager. Assim que é habilitado, o Arduino identifica um mecanismo de reconhecimento de fala disponível e começa a transmitir áudio para o BitVoicer Server.
Você pode acompanhar os resultados de reconhecimento na ferramenta Server Monitor disponível no BitVoicer Server Manager.
Em meu próximo post, irei mostrar como você pode reproduzir a fala sintetizada usando um Arduino DUE.
Código
- BVS_Demo1.ino
BVS_Demo1.ino Arduino
#include#include // Define o pino Arduino que será usado para capturar áudio #define BVSM_AUDIO_INPUT 5 // Define os pinos de LED # define RED_LED_PIN 6 # define YELLOW_LED_PIN 9 # define GREEN_LED_PIN 10 // Define as constantes que serão passadas como parâmetros para // a função BVSP.beginconst unsigned long STATUS_REQUEST_TIMEOUT =1000; const unsigned long STATUS_REQUEST_INTERVAL =2000; // Define o tamanho do buffer de áudio const int AUDIO_BUFFER_SIZE =64 /; / Define o tamanho do bufferconst de recebimento int RECEIVE_BUFFER_SIZE =2; // Inicializa uma nova instância global da classe BVSP BVSP bvsp =BVSP (); // Inicializa uma nova instância global da classe BVSMic BVSMic bvsm =BVSMic (); / / Cria um buffer que será usado para ler as amostras gravadas // da classe BVSMic byte audioBuffer [AUDIO_BUFFER_SIZE]; // Cria um buffer que será usado para ler os comandos enviados // do BitVoicer Server.// Byte 0 =pin número // Byte 1 =pin valuebyte receiveBuffer [RECEIVE_BUFFER _SIZE]; void setup () {// Define os modos de pin pinMode (RED_LED_PIN, OUTPUT); pinMode (YELLOW_LED_PIN, OUTPUT); pinMode (GREEN_LED_PIN, OUTPUT); // Inicia a comunicação serial em 115200 bps Serial.begin (115200); // Define a porta serial do Arduino que será usada para // comunicação, quanto tempo levará antes que uma solicitação de status // atinja o tempo limite e com que freqüência as solicitações de status devem ser enviadas para // BitVoicer Server. bvsp.begin (Serial, STATUS_REQUEST_TIMEOUT, STATUS_REQUEST_INTERVAL); // Define a função que tratará o evento frameReceived // bvsp.frameReceived =BVSP_frameReceived; // Prepara o temporizador da classe BVSMic bvsm.begin ();} void loop () {// Verifica se o intervalo de solicitação de status expirou e // já passou, envia uma solicitação de status ao BitVoicer Server bvsp.keepAlive (); // Verifica se há dados disponíveis no buffer da porta serial // e processa seu conteúdo conforme especificações // do BitVoicer Server Protocol bvsp.receive (); // Verifica se há um SRE disponível. Se houver, // inicia a gravação. if (bvsp.isSREAvailable ()) {// Se a classe BVSMic não estiver gravando, configura a entrada de áudio // e inicia a gravação if (! bvsm.isRecording) {bvsm.setAudioInput (BVSM_AUDIO_INPUT, EXTERNAL); bvsm.startRecording (); } // Verifica se a classe BVSMic tem amostras disponíveis if (bvsm.available) {// Certifica-se de que o modo de entrada é STREAM_MODE antes de // transmitir o fluxo if (bvsp.inboundMode ==FRAMED_MODE) bvsp.setInboundMode (STREAM_MODE); // Lê as amostras de áudio da classe BVSMic int bytesRead =bvsm.read (audioBuffer, AUDIO_BUFFER_SIZE); // Envia o stream de áudio para o BitVoicer Server bvsp.sendStream (audioBuffer, bytesRead); }} else {// Nenhum SRE está disponível. Se a classe BVSMic estiver gravando, // para. if (bvsm.isRecording) bvsm.stopRecording (); }} // Manipula o evento frameReceived void BVSP_frameReceived (byte dataType, int payloadSize) {// Verifica se o frame recebido contém dados binários // 0x07 =Dados binários (matriz de bytes) if (dataType ==DATA_TYPE_BINARY) {// Se 2 bytes foram recebidos, processe o comando. if (bvsp.getReceivedBytes (receiveBuffer, RECEIVE_BUFFER_SIZE) ==RECEIVE_BUFFER_SIZE) {analogWrite (receiveBuffer [0], receiveBuffer [1]); }}}
Esquemas
Processo de manufatura
- Sistema de atendimento usando Arduino e RFID com Python
- Sensor DHT11 com LEDs e um alto-falante Piezo
- Arduino Temp. Monitor e relógio em tempo real com tela 3.2
- Controle de um robô Roomba com Arduino e dispositivo Android
- Voltímetro DIY com Arduino e um visor Nokia 5110
- Controle do Servo Motor com Arduino e MPU6050
- u-blox LEA-6H 02 Módulo GPS com Arduino e Python
- Como ler a temperatura e umidade em Blynk com DHT11
- Reconhecimento de fala e síntese com Arduino
- Cubo de LED 4x4x4 com Arduino Uno e 1sheeld