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.

módulo reconhecimento de voz

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?