Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Reconhecimento de fala com Arduino e BitVoicer Server

Componentes e suprimentos

Arduino Micro
× 1
Sparkfun Electret Microfone Breakout
× 1
BitVoicer Server
× 1
BitVoicer Server 1.0
× 1
LED (genérico)
× 3
Resistor 330 ohm
× 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

  1. Sistema de atendimento usando Arduino e RFID com Python
  2. Sensor DHT11 com LEDs e um alto-falante Piezo
  3. Arduino Temp. Monitor e relógio em tempo real com tela 3.2
  4. Controle de um robô Roomba com Arduino e dispositivo Android
  5. Voltímetro DIY com Arduino e um visor Nokia 5110
  6. Controle do Servo Motor com Arduino e MPU6050
  7. u-blox LEA-6H 02 Módulo GPS com Arduino e Python
  8. Como ler a temperatura e umidade em Blynk com DHT11
  9. Reconhecimento de fala e síntese com Arduino
  10. Cubo de LED 4x4x4 com Arduino Uno e 1sheeld