Skip to Content

Começar com o Módulo de Reconhecimento de Voz Gravity

Começar com o Módulo de Reconhecimento de Voz Gravity

A interação por voz está a tornar-se cada vez mais central em sistemas embebidos modernos, robótica e dispositivos inteligentes. Gravity Voice Recognition Module da DFRobot oferece um módulo compacto, capaz de funcionar offline, desenhado para makers e desenvolvedores que trabalham com plataformas como Arduino, micro:bit e ESP32. Este módulo suporta comunicação I²C e UART, possui 121 comandos de voz pré-programados e permite treinar localmente até 17 frases personalizadas — tudo sem necessidade de ligação à internet.

Neste guia, vamos explorar as principais funcionalidades do módulo, preparar o hardware e software necessários, e depois demonstrar como integrar o módulo num projeto simples controlado por voz. Quer o seu objetivo seja um sistema de luz ativado por voz, um assistente robótico ou uma rotina de automação acionada por voz, este artigo será um ponto de partida prático para pôr o Gravity Voice Recognition Module a funcionar sob o seu controlo.

Onde Comprar

Pode adquirir o Gravity Voice Recognition Module na DFRobot ou na Amazon. O link abaixo é para o produto na Amazon. Além disso, vai precisar de um microcontrolador. Eu estou a usar um Arduino UNO, mas a maioria dos microcontroladores comuns (ex. ESP32, ESP8266, …) também funcionam. E se quiser experimentar alguns projetos, uma breadboard e alguns cabos serão úteis.

Gravity Voice Recognition Module

Arduino

Arduino Uno

USB Data Sync cable Arduino

Cabo USB para Arduino UNO

Dupont wire set

Conjunto de Cabos Dupont

Half_breadboard56a

Breadboard

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Hardware do Gravity Voice Recognition Module

O Gravity Voice Recognition Module da DFRobot é uma unidade compacta e autónoma de processamento de voz que permite controlo por voz offline para sistemas embebidos. No seu núcleo, o módulo integra um chip poderoso de reconhecimento de voz capaz de realizar análise local de comandos sem depender de serviços na cloud. Isto permite respostas rápidas, baixa latência e total independência da conectividade de rede.

Componentes

O módulo contém um pequeno altifalante integrado e um conector para um altifalante externo (8 Ω 3W). Um pequeno interruptor permite alternar entre os dois altifalantes. Um segundo interruptor permite escolher entre comunicação I2C e UART com o módulo.

Além disso, há dois microfones e dois LEDs indicadores na placa. Um LED (vermelho) indica energia e o outro (azul) sinaliza que a palavra de ativação foi reconhecida e que o módulo está pronto para receber comandos de voz. A imagem abaixo mostra os componentes do módulo:

Components of the Gravity Voice Recognition Module
Componentes do Gravity Voice Recognition Module

Versões

Note que existem duas versões do módulo; Versão 1.0 e Versão 1.1. A versão mais antiga 1.0 não tem conector para o altifalante integrado nem dois orifícios de montagem. Fora isso, o hardware e a programação são idênticos. A foto abaixo mostra as duas versões do módulo:

Versions of the Gravity Voice Recognition Module
Versões do Gravity Voice Recognition Module

Alimentação

O módulo opera numa faixa típica de voltagem de3.3V a 5V, garantindo compatibilidade com sistemas lógicos de 3.3V (como ESP32 e Raspberry Pi Pico) e sistemas de 5V (como Arduino Uno). O formato compacto (49 mm × 32 mm) torna-o adequado para integração em caixas com espaço limitado.

Comandos

O módulo tem 121 comandos pré-programados, como “Ligar a luz”, que não podem ser alterados. Existe também uma palavra de ativação fixa (“Hello Robot”). Há 17 espaços para palavras de comando que podem ser aprendidas, e um espaço para uma palavra de ativação aprendível. Para uma lista completa dos comandos pré-programados veja o DFRobot Wiki for the Gravity Voice Recognition Module.

O módulo desperta quando a palavra de ativação é reconhecida, mantém-se ativo por um tempo programável e durante esse período está pronto para detectar comandos de voz.

Especificações Técnicas

ParâmetroEspecificação
Nome do ProdutoGravity Voice Recognition Module
Tensão de Alimentação3.3 V – 5 V
Interface de ComunicaçãoI²C e UART (selecionável)
Endereço I2C 0x64
Modo de ReconhecimentoReconhecimento de voz offline
Comandos Integrados121 pré-programados
Comandos PersonalizadosAté 17 definidos pelo utilizador
Comando de Ativação para Aprendizagem1
Microfone2 x integrados
Sensibilidade do Microfone -28dB
AltifalanteIntegrado, com altifalante externo opcional
Corrente de Operação≤ 370 mA @ 5V
Temperatura de Operação0 °C a +70 °C
Dimensões49 mm × 32 mm
PortaInterface Gravity de 4 pinos (VCC, GND, SDA/RX, SCL/TX)

Ligação do Voice Recognition Module a um Arduino UNO

Ligar o Gravity Voice Recognition Module a um Arduino UNO é simples. Ligue o GND do módulo Gravity ao GND do Arduino e o VCC aos 5V.

De seguida, ligamos a interface I2C. A linha SCL no pino A5 do Arduino deve ser ligada ao pino C/R do módulo Gravity (fio verde). Finalmente, ligue o SDA (A4) do Arduino ao D/T do módulo Gravity. A imagem abaixo mostra a ligação completa:

Wiring of the Voice Recognition Module with an Arduino UNO
Ligação do Voice Recognition Module com um Arduino UNO

Na próxima secção vamos escrever algum código para experimentar o Voice Recognition Module.

Instalar Biblioteca para Gravity Voice Recognition Module

Antes de podermos usar o Gravity Voice Recognition Module com um Arduino ou ESP32, precisamos primeiro de instalar a DFRobot_DF2301Q Library na IDE Arduino. Basta abrir o LIBRARY MANAGER, digitar DFRobot_DF2301Q na barra de pesquisa e pressionar INSTALL:

Installing DFRobot_DF2301Q Library
Instalação da Biblioteca DFRobot_DF2301Q

Exemplo de Código: Ligar ou desligar o LED integrado

Neste primeiro exemplo de código vamos ligar ou desligar o LED integrado do Arduino UNO usando os comandos pre-programmed voice commands “Turn on the light” e “Turn off the light”. Como estamos a usar os comandos pré-programados, não é necessário aprender ou preparar o Voice Recognition Module. Dê uma vista rápida ao código primeiro e depois discutiremos os detalhes.

#include "DFRobot_DF2301Q.h"

const byte led = LED_BUILTIN;

DFRobot_DF2301Q_I2C asr;

void setup() {
  Serial.begin(115200);

  pinMode(led, OUTPUT);    
  digitalWrite(led, LOW);  

  while (!(asr.begin())) {
    Serial.println("Can't initialize ASR");
    delay(3000);
  }

  asr.setVolume(6);
  asr.setMuteMode(0);  // 1=Mute
  asr.setWakeTime(20);
}

void loop() {
  uint8_t cmd_id = asr.getCMDID();
  if (cmd_id==103) {
      digitalWrite(led, HIGH);      
      Serial.println("Turn on the light");  
  }
  if (cmd_id==104) {
      digitalWrite(led, LOW);      
      Serial.println("Turn off the light");  
  }  
  if (cmd_id != 0) {
      Serial.print("cmd_id = ");  
      Serial.println(cmd_id);
  }
  delay(300);
}

Importações

Primeiro, incluímos o ficheiro de cabeçalho da biblioteca DF2301Q:

#include "DFRobot_DF2301Q.h"

Esta biblioteca fornece todas as funções necessárias para inicializar, configurar e comunicar com o módulo de reconhecimento de voz DF2301Q. Trata a comunicação I²C e simplifica o reconhecimento de comandos e a gestão da configuração.

Constantes

Na linha seguinte, definimos uma constante para o pino do LED:

const byte led = LED_BUILTIN;

A macro LED_BUILTIN refere-se ao LED integrado da placa de desenvolvimento, que normalmente está ligado ao pino 13 na maioria das placas Arduino. Ao atribuir este valor à constante led, o código torna-se mais legível e fácil de adaptar caso queira usar um pino diferente para o LED.

Objetos

De seguida, é criada uma instância da classe DFRobot_DF2301Q_I2C, que permite ao Arduino comunicar com o Gravity Voice Recognition Module via I2C:

DFRobot_DF2301Q_I2C asr;

Setup

A função setup() corre uma vez no início do programa e prepara tanto o microcontrolador como o módulo DF2301Q.

void setup() {
  Serial.begin(115200);

  pinMode(led, OUTPUT);    
  digitalWrite(led, HIGH);  

  while (!(asr.begin())) {
    Serial.println("Can't initialize ASR");
    delay(3000);
  }

  asr.setVolume(6);
  asr.setMuteMode(0);  // 1=Mute
  asr.setWakeTime(20);
}

Primeiro inicializamos a comunicação serial a 115200 baud. Isto permite ao Arduino enviar informações de diagnóstico para o Monitor Serial. Depois, o pino do LED é configurado como saída, e o seu estado é definido para LOW, garantindo que o LED está inicialmente desligado.

O programa tenta então inicializar o módulo DF2301Q usando asr.begin(). A função retorna true se o módulo for detetado com sucesso via I2C. Caso contrário, a mensagem Não é possível inicializar o ASR é impressa a cada 3 segundos até a inicialização ser bem-sucedida.

Após a inicialização, são emitidos vários comandos de configuração. O asr.setVolume(6) define o volume do altifalante ou do reconhecimento para o nível 6 (numa escala de 1 a 10).

Com o comando asr.setMuteMode(0) pode ativar ou desativar o feedback áudio. Um valor 0 significa que o mudo está desativado e o módulo confirma os comandos reconhecidos com “OK”, “Yes, I am here”, ou “I’m off now”, ao sair do modo de ativação.

Finalmente, asr.setWakeTime(20) define o tempo de ativação do módulo, ou a duração em que permanece ativo após detetar a palavra de ativação. O número parece ser o tempo em segundos (de 0 a 255), mas não encontrei informação específica na documentação.

Loop

A função loop() corre continuamente após o setup e gere a lógica principal do programa.

void loop() {
  uint8_t cmd_id = asr.getCMDID();
  if (cmd_id==103) {
      digitalWrite(led, HIGH);      
      Serial.println("Turn on the light");  
  }
  if (cmd_id==104) {
      digitalWrite(led, LOW);      
      Serial.println("Turn off the light");  
  }  
  if (cmd_id != 0) {
      Serial.print("cmd_id = ");  
      Serial.println(cmd_id);
  }
  delay(300);
}

No início de cada iteração do loop, a função asr.getCMDID() obtém o último ID de comando reconhecido pelo módulo DF2301Q. Cada comando de voz reconhecido está associado a um ID numérico único. Veja o DFRobot Wiki for the Gravity Voice Recognition Module para uma lista de comandos e seus IDs.

Se o ID do comando retornado for 103, o LED é ligado definindo o pino de saída HIGH, e a mensagem Ligar a luz é impressa no Monitor Serial.

Se o ID do comando for 104, o LED é desligado definindo o pino de saída LOW. E a mensagem Desligar a luz é impressa.

O bloco condicional seguinte imprime o valor do cmd_id sempre que for diferente de zero, o que ajuda a monitorizar os comandos recebidos.

Finalmente, um delay(300) pausa o loop por 300 milissegundos antes de verificar novamente, dando tempo para o próximo comando ser reconhecido.

Executar o Código

Depois de carregar o código no seu Arduino, pode controlar o LED integrado do Arduino com a sua voz. Comece por dizer “Hello Robot” para ativar o modo de ativação. O LED azul no módulo de reconhecimento de voz deve acender, e o módulo dirá “How, can I help” ou “Yes, I am here”.

Enquanto estiver no modo de ativação, pode dizer “Turn on the light” ou “Turn off the light” para ligar ou desligar o LED integrado. Se nenhum comando for recebido durante algum tempo (tempo de ativação), o módulo sai do modo de ativação e diz “I’m off now”. Terá de dizer “Hello Robot” novamente para ativar o módulo.

No Monitor Serial deverá ver os IDs dos comandos (2 = ativação) e o texto Ligar a luz ou Desligar a luz impresso:

cmd_id = 2
Turn on the light
cmd_id = 103
Turn off the light
cmd_id = 104

Exemplo de Código: Controlar Feedback de Áudio

Neste próximo exemplo, continuamos a ligar ou desligar o LED integrado, mas vamos controlar o feedback de áudio manualmente.

Se chamar asr.setMuteMode(1), o módulo fica mudo e não fornece feedback de áudio automaticamente. No entanto, pode chamar asr.playByCMDID(id) para reproduzir certas frases como “How can I help / yes, I am here” ou “Done”.

Infelizmente, não encontrei documentação sobre as frases suportadas e seus IDs. Mas identifiquei os seguintes três IDs úteis:

idfrase(s)
1How can I help / Yes, I am here
5Ok, got it / Ok / doing it / done
23Done

Note que para os IDs 1 e 5 o módulo escolhe aleatoriamente uma das frases listadas na tabela.

No código seguinte desligamos o feedback automático de áudio, dizemos “Done” quando um comando é executado, e “How can I help / Yes, I am here” quando a palavra de ativação é detetada:

#include "DFRobot_DF2301Q.h"

const byte led = LED_BUILTIN;

DFRobot_DF2301Q_I2C asr;

void speak(uint8_t id) {
  asr.setMuteMode(0);
  asr.playByCMDID(id);
  delay(100);
  asr.setMuteMode(1);
}

void setup() {
  Serial.begin(115200);

  pinMode(led, OUTPUT);    
  digitalWrite(led, LOW);  

  while (!(asr.begin())) {
    Serial.println("Can't initialize ASR");
    delay(3000);
  }

  asr.setVolume(6);
  asr.setMuteMode(1);  // 1=Mute
  asr.setWakeTime(20);
}

void loop() {
  uint8_t cmd_id = asr.getCMDID();
  switch (cmd_id) {
    case 2:
      speak(1); // How can I help / yes, I am here
      Serial.println("Waking up");
      break;    
    case 103:
      digitalWrite(led, HIGH);      
      Serial.println("Turn on the light");
      speak(23);  // Done
      break;
    case 104:
      digitalWrite(led, LOW);      
      Serial.println("Turn off the light");
      speak(23); // Done
      break;          
    default:
      if (cmd_id != 0) {
        Serial.print("CMDID = ");  
        Serial.println(cmd_id);
      }
  }
  delay(300);
}

O código é muito semelhante ao anterior, exceto pela função speak(). Esta recebe o ID de uma frase (ex. 23 = “Done”), desativa temporariamente o mudo, chama playByCMDID(id) para pronunciar a frase e depois volta a ativar o mudo.

void speak(uint8_t id) {
  asr.setMuteMode(0);
  asr.playByCMDID(id);
  delay(100);
  asr.setMuteMode(1);
}

Portanto, se o Voice Recognition Module for um pouco demasiado falador para si, isto permite controlar o feedback de áudio manualmente.

Exemplo de Código: Controlar Dispositivos Externos com Comandos Aprendidos

Neste último exemplo vamos controlar dois dispositivos externos (LEDs vermelho e verde) usando comandos aprendidos. Em vez de LEDs, poderia ligar relés para controlar dispositivos de maior potência, mas para este exemplo usamos LEDs.

Primeiro vamos ligar os LEDs. Ambos os LEDs estão ligados ao terra (GND). O LED verde será ligado ao GPIO11 e o LED vermelho ao GPIO12 através de um resistor de 220 Ohm. Veja o diagrama de ligação abaixo:

Connecting two LEDs and Gravity module to Arduino UNO
Ligação de dois LEDs e módulo Gravity ao Arduino UNO

De seguida, ensinamos as frases de comando a usar para controlar os LEDs.

Aprender palavras de comando

Quero usar as seguintes quatro frases para controlar o LED vermelho e o verde:

  • Ligar luz vermelha
  • Desligar luz vermelha
  • Ligar luz verde
  • Desligar luz verde

Para começar a aprender, primeiro diga a palavra de ativação “Hello Robot“. De seguida, entre no modo de aprendizagem dizendo “Aprender palavra de comando“. O módulo irá guiá-lo pelo processo de aprendizagem com os seguintes passos:

  • Indicação: A aprender agora, por favor esteja quieto, aprenda a palavra de comando conforme o pedido! Por favor diga o primeiro comando a aprender!
  • Frase de comando a aprender: “Ligar luz vermelha
  • Indicação: Aprendizagem bem-sucedida, por favor diga novamente!
  • Frase de comando a aprender : “Ligar luz vermelha
  • Indicação: Aprendizagem bem-sucedida, por favor diga novamente!
  • Frase de comando a aprender : “Ligar luz vermelha
  • Indicação: OK, aprendeu o primeiro comando com sucesso! Por favor diga o segundo comando a aprender!

Pode sair do modo de aprendizagem dizendo “Sair da aprendizagem“.

Código

Se a aprendizagem das quatro novas frases de comando foi bem-sucedida, pode então controlar os LEDs vermelho e verde usando o seguinte código:

#include "DFRobot_DF2301Q.h"

const byte redLed = 12;
const byte greenLed = 11;

DFRobot_DF2301Q_I2C asr;

void setup() {
  Serial.begin(115200);

  pinMode(redLed, OUTPUT);
  digitalWrite(redLed, LOW);
  pinMode(greenLed, OUTPUT);
  digitalWrite(greenLed, LOW);

  while (!(asr.begin())) {
    Serial.println("Can't initialize ASR");
    delay(3000);
  }

  asr.setVolume(6);
  asr.setMuteMode(0);  // 1=Mute
  asr.setWakeTime(20);
}

void loop() {
  uint8_t cmd_id = asr.getCMDID();
  switch (cmd_id) {
    case 5:  // Turn on red light
      digitalWrite(redLed, HIGH);
      break;
    case 6:  // Turn off red light
      digitalWrite(redLed, LOW);
      break;
    case 7:  // Turn on green light
      digitalWrite(greenLed, HIGH);
      break;
    case 8:  // Turn off green light
      digitalWrite(greenLed, LOW);
      break;
  }
  if (cmd_id != 0) {
    Serial.print("CMDID = ");
    Serial.println(cmd_id);
  }
  delay(300);
}

Novamente, o código é semelhante aos exemplos anteriores. A única diferença está na função principal, onde agora verificamos os IDs dos comandos 5, 6, 7 e 8 que correspondem aos comandos aprendidos:

void loop() {
  uint8_t cmd_id = asr.getCMDID();
  switch (cmd_id) {
    case 5:  // Turn on red light
      digitalWrite(redLed, HIGH);
      break;
    case 6:  // Turn off red light
      digitalWrite(redLed, LOW);
      break;
    case 7:  // Turn on green light
      digitalWrite(greenLed, HIGH);
      break;
    case 8:  // Turn off green light
      digitalWrite(greenLed, LOW);
      break;
  }
  if (cmd_id != 0) {
    Serial.print("CMDID = ");
    Serial.println(cmd_id);
  }
  delay(300);
}

Se já aprendeu outras frases de comando ou treinou numa ordem diferente, os seus IDs serão diferentes. No entanto, o código imprime o ID da frase reconhecida e pode alterar o seu código em conformidade.

Obviamente, também pode apagar frases aprendidas ou aprender uma nova palavra de ativação. Para detalhes veja o Wiki Gravity Voice Recognition Module. A tabela seguinte fornece uma visão geral das frases de controlo importantes para aprender, editar e apagar:

ComandoFunção
Hello RobotPalavra de ativação padrão do sistema.
Aprender palavra de ativaçãoMuda a palavra de ativação.
Aprender palavra de comandoEnsina um novo comando.
ReaprenderSubstitui um comando por outro.
Sair da aprendizagemDiz isto para sair do modo de aprendizagem.
Quero apagarEntra na função de apagar.
Apagar palavra de ativaçãoApaga a palavra de ativação aprendida.
Apagar palavra de comandoRemove uma frase de comando previamente adquirida.
Apagar tudoApaga todos os comandos e frases da memória.
Sair de apagarSai da função de apagar

E é tudo! Agora tem três exemplos que devem ajudar com o Gravity Voice Recognition Module.

Conclusões

Este tutorial forneceu exemplos de código para começar a usar o Gravity Voice Recognition Module. Para uma lista completa dos comandos de voz pré-programados e como treinar o módulo veja o Wiki.

O Gravity Voice Recognition Module torna muito fácil começar com reconhecimento de voz. Basta ligar o módulo a um microcontrolador, escrever algum código mínimo e está pronto a usar.

Aprender novos comandos e palavras de ativação é também totalmente feito por controlo de voz. Isso facilita adicionar novos comandos, mas pode ser complicado apagar ou editar comandos.

Além disso, enquanto a precisão do reconhecimento dos comandos pré-programados é alta, a precisão dos comandos aprendidos parece ser bastante inferior. Tive dificuldades em fazer o sistema reconhecer de forma fiável comandos como “Turn on the red light”, que eram frequentemente confundidos com “Turn on the light”.

Uma alternativa ao Gravity Voice Recognition Module pode ser o Voice Recognition Module V3. Não tem frases pré-programadas, mas pode aprender 80 palavras e permite controlo programático sobre as palavras aprendidas. Mas é mais difícil de configurar e sinto que a precisão do reconhecimento é menor.

Se realmente quiser alta precisão de reconhecimento, pode experimentar Voice control with XIAO-ESP32-S3-Sense and Edge Impulse. Neste caso pode treinar o reconhecimento de voz completamente sozinho, o que pode dar melhor precisão, mas é também muito mais complexo e trabalhoso!

Se tiver alguma dúvida, sinta-se à vontade para deixar nos comentários.

Boas criações 😉