O módulo de reconhecimento de voz permite implementar o reconhecimento de fala em sistemas de maneira simples. Isso porque, o processamento da fala é feito unicamente no hardware do modulo.
Caso você não tenha lido o post sobre as diferentes formas de fazer reconhecimento de voz, passe lá para entender tudo que vou falar.
Características
Essa solução utiliza um componente eletrônico chamado Voice Recognition Module, que está mostrado na imagem abaixo.
Obs.: vou falar sobre a versão 2 do módulo.
Esse módulo permite a gravação de 15 sons diferentes, divididos em blocos de 3, para serem reconhecidos. Ou seja, só é possível reconhecer 5 comandos por vez. Os comandos são gravados através da ajuda de um computador e depois o módulo pode se comunicar com o Arduino. Assim, o Arduino e ele funcionam independentes. Entretanto, o módulo pode operar totalmente por conta própria, pois ele possui pinos de saída para cada comando reconhecido.
Como foi dito no outro post, essa é uma solução do tipo isolada. Sendo assim, funciona sem a ajuda de nenhum computador ou celular para processar os dados e não precisa de um microcontrolador para ajudar no controle externo.
As desvantagens dessa solução incluem o custo, pois é maior que nas outras categorias. E temos que considerar que o preço desse módulo no mercado livre, por exemplo, é quase o mesmo que um Raspberry pi 3 [Até o momento da publicação do post – jan 2018].
Com isso, talvez seja melhor gastar um pouco mais para ter uma solução isolada bem mais completa e ilimitada. Seu limite de sons que podem ser gravados também é outra desvantagem.
As vantagens são: o gasto energético é mínimo, o reconhecimento funciona constantemente e, para introduzir um comando, não é necessário acessar nenhuma página na internet ou nenhum aplicativo, basta falar a qualquer momento.
Provavelmente a vantagem mais interessante de todas é que esse módulo reconhece a fala individualmente. Isto é, a plaquinha reconhece a voz apenas da pessoa que gravou o som original. Então é possível criar uma especie de senha que abre apenas quando você fala. Claro que a precisão não é perfeita nesse caso.
Como fazer?
Informações importantes
A comunicação com o módulo será feita com o protocolo serial. Portanto utilizaremos dois pinos, um para enviar dados à plaquinha e outro para receber.
Essa placa possui uma série de comandos internos que permitem acessar as diversas funções dela. Exemplo, comando para mandar gravar, comando para utilizar o primeiro grupo de comandos de voz etc… Se você quiser dar uma lida detalhada nos comandos existentes, veja esse manual. E se você estiver utilizando a versão 3, utilize esse manual para te ajudar.
Para me comunicar com a plaquinha, vou utilizar o Arduino com suas funções de comunicação serial.
Por fim, o circuito é simples: ligue o pino TX do módulo no pino 2 do Arduino. E o pino RX do módulo no pino 3 do Arduino. Além disso, conecte o Vcc e o GND da plaquinha nos respectivos pinos 5V e GND do Arduino.
Gravar os comandos
Na hora de gravar os comandos, basta pegar o código abaixo, fazer upload, abrir o monitor serial, escolher 9600 de velocidade e digitar ‘G’ (maíusculo). Feito isso, o programa entra no modo de gravação do bloco 1 de comandos do módulo e basta seguir as instruções que aparecem no monitor serial:
Ele irá printar “Diga algo” e aí você fala o comando; após isto ele printa “Novamente” e você falava pela segunda vez o comando; por fim, ele irá printar “Diga algo” novamente e basta você repetir o comando pela terceira vez. Com isto, ele escreve “Um comando foi concluído” e passa para a gravação do próximo comando.
Para gravar o bloco de comandos 2, vá na linha abaixo:
vozSerial.write(0x11); // Grupo 1: 0x11; Grupo 2: 0x12; Grupo 3: 0x13
E altere o 0x11 para 0x12 ou 0x13 de acordo com o grupo desejado.
Obs.:Leia os comentários do código para entender melhor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #include <SoftwareSerial.h> SoftwareSerial vozSerial(2, 3); // Pinos: TX, RX do módulo byte com; // Variavel para reconhecer o comando recebido pelo módulo char leituraSerial; // Variavel para ler o que está sendo enviado no monitor serial void setup() { Serial.begin(9600); // Inicializa a comunicação serial padrão do Arduino (pinos 0,1) // Inicia a comunicação serial do modulo vozSerial.begin(9600); // Muda para o modo compacto (muda a forma como o módulo retorna os valores) vozSerial.write(0xAA); vozSerial.write(0x37); delay(200); } void loop() { if(vozSerial.available()){//Se o modulo está mandando alguma resposta com = vozSerial.read(); switch(com){ case 0xE0: Serial.println("ERRO"); break; case 0x40: Serial.println("DIGA ALGO"); break; case 0x41: Serial.println("NENHUM SOM RECONHECIDO"); break; case 0x42: Serial.println("NOVAMENTE"); break; case 0x43: Serial.println("MUITO ALTO"); break; case 0x44: Serial.println("SOM DIFERENTE RECONHECIDO"); break; case 0x45: Serial.println("UM COMANDO FOI CONCLUIDO"); break; case 0x46: Serial.println("O GRUPO FOI GRAVADO COM SUCESSO"); break; default: Serial.println("ENTRADA INVALIDA"); break; } } if (Serial.available()){ leituraSerial = Serial.read(); if(leituraSerial != -1){ switch(leituraSerial){ case 'G': vozSerial.write(0xAA); vozSerial.write(0x11); // Grupo 1: 0x11; Grupo 2: 0x12; Grupo 3: 0x13 break; default: if(leituraSerial != '\r' && leituraSerial != '\n') Serial.println("ENTRADA INVALIDA"); break; } } } } |
Reconhecer comandos
Depois que os comandos estiverem gravados, pegue o código abaixo e faça upload (Abra o monitor serial para testar). A comunicação serial padrão do Arduino não é mais necessária, estou utilizando ela apenas para mostrar qual comando foi reconhecido.
De acordo com o código abaixo, apenas os comandos do bloco 1 serão reconhecidos. Portanto, para alterar para outro grupo, mude a linha abaixo:
vozSerial.write(0x21); //Grupo 1: 0x21; Grupo 2: 0x22; Grupo 3: 0x23
…Para o valor desejado: 0x22 ou 0x23. E, caso o grupo seja alterado, a parte do código onde tem case 0x11, 0x12… terá que ser alterada também. Pois os comandos do bloco 2 começam em 0x21 (comando 1) e terminam em 0x25 (comando 5). Do bloco 3 é a mesma coisa, começam em 0x31 e terminam em 0x35.
Dito isso, para fazer alguma função específica depois que o comando foi reconhecido, basta inserir seus comandos nas linhas onde contem:
Serial.print(“Comando X Reconhecido”);
Obs.:Leia os comentários do código para entender melhor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <SoftwareSerial.h> SoftwareSerial vozSerial(2, 3); // Pinos: TX, RX do módulo byte com; // Variavel para reconhecer o comando recebido pelo módulo void setup() { Serial.begin(9600); //Inicia a comunicação serial padrão do Arduino // Inicia a comunicação do modulo vozSerial.begin(9600); // Muda para o modo compacto vozSerial.write(0xAA); vozSerial.write(0x37); delay(200); // Importa o grupo 1 vozSerial.write(0xAA); vozSerial.write(0x21); //Grupo 1: 0x21; Grupo 2: 0x22; Grupo 3: 0x23 } void loop() { if(vozSerial.available()) { com = vozSerial.read(); Serial.println(com,HEX); switch(com){ case 0x11: Serial.print("Comando 1 Reconhecido"); break; case 0x12: Serial.print("Comando 2 Reconhecido"); break; case 0x13: Serial.print("Comando 3 Reconhecido"); break; case 0x14: Serial.print("Comando 4 Reconhecido"); break; case 0x15: Serial.print("Comando 5 Reconhecido"); break; default: Serial.println("COMANDO DESCONHECIDO"); break; } } } |
Com isso, você pode criar um sistema com reconhecimento de voz totalmente independente.
Reconhecimento de voz – Como fazer?
Olá, tenho uma duvida…. Fiz esse processo no arduino UNO e o LED acendeu normalmente. Meu problema é com o arduino Mega 2560 R3..
Eu compilei o código no arduino mega (SUCESSO), porém os comandos de voz não acendem o led.
Obs: Os leds rx e tx do arduino uno, piscavam quando eu dava o comando de voz, já os do arduino mega 2560, ficam apagados…
Olá, Anderson. Hmm, bem estranho este problema. Você utilizou, no Mega, o mesmo código e o mesmo circuito do UNO? No caso, o Tx e o Rx no pino 2 e 3. Assim que receber seu retorno eu testo aqui no meu Arduino Mega pra ver se é problema da biblioteca SoftwareSerial.
Você saberia me responder se é possível a comunicação dele com o esp8266 (nodemcu) , estou tentando comunicar os dois e não consigo, com fim de usar o app Blynk com o nodemcu e o módulo de voz para outras aplicações
Apesar de nunca ter tentado, acredito que seja possível sim. Entretanto, se seu problema for a comunicação serial, tente utilizar o módulo pelos pinos D1, D2 … D5, que informam (nível lógico baixo/nível alto) qual comando de voz foi reconhecido. Mas, para isso, você teria que ligar o pino GCH OU o GCL em 5v dependendo de qual grupo você for escolher. Para entender o que eu estou falando, veja a pagina 10 deste documento.
Olá, eu tenho uma dúvida, este módulo consegue identificar e gravar outros tipos de sons além de comandos de voz em si? (como, por exemplo, o som de algum alarme ou algo específico)
Olá, Luiz. Boa pergunta viu, nunca cheguei a fazer esse tipo de teste. Mas acredito que ele consegue sim.
Parabéns , bem didático!
Brigadão, Carlos! Espero que você também goste dos outros posts do site!