Introdução: Por que construir um assistente doméstico controlado por voz?

O controle de voz não é mais um conceito futurista – é uma maneira prática de interagir com seu ambiente doméstico. Embora soluções comerciais como Amazon Echo ou Google Nest ofereçam conveniência, construir seu próprio assistente doméstico controlado por voz com microcontroladores lhe dá controle completo sobre funcionalidade, privacidade e custo. Este projeto ensina como combinar placas de microcontrolador de baixo custo, módulos de microfone, alto-falantes e reconhecimento de voz em nuvem ou em dispositivo para criar um sistema que responda aos seus comandos falados. Quer você queira ligar luzes, verificar o tempo ou controlar um termostato, uma abordagem DIY permite que você ajuste todos os aspectos às suas necessidades.

Este guia expandido abrange a seleção de componentes, arquitetura do sistema, configuração de hardware passo a passo, detalhes de programação, métodos de teste e recursos avançados. No final, você terá uma base sólida para construir um assistente de voz confiável que se encaixa no seu ecossistema doméstico inteligente.

Escolher o microcontrolador certo

O microcontrolador é o cérebro de seu assistente. Ele deve lidar com captura de áudio, comunicação de rede e controle de dispositivo. Três opções populares são o ESP32, Arduino Uno com escudo Wi-Fi, e Framboesa Pi Pico W.

ESP32

O ESP32 é a opção mais recomendada porque possui Wi-Fi e Bluetooth integrados, RAM suficiente (520 KB), e um processador dual-core que pode lidar com streaming de áudio em tempo real e chamadas API simultaneamente. Ele também suporta o Arduino IDE e MicroPython, tornando a programação simples. Seu baixo custo (cerca de $5-$10) e suporte amplo à comunidade torná-lo ideal para este projeto.

Arduino Uno com escudo Wi-Fi

Um Arduino Uno emparelhado com um escudo Wi-Fi ESP8266 é uma alternativa viável se você já possui um Uno. No entanto, a RAM limitada (2 KB) e a velocidade de clock mais lenta tornam mais difícil gerenciar buffers de áudio. Você provavelmente precisará descarregar processamento pesado para a nuvem, o que pode introduzir latência.

Framboesa Pi Pico W

Anunciou em 2022, o Raspberry Pi Pico W inclui Wi-Fi e funciona em 133 MHz com 264 KB SRAM. É menos poderoso do que o ESP32, mas funciona bem para conjuntos de comando mais simples. Seu suporte MicroPython é excelente para prototipagem rápida.

Para este guia, assumimos que você está usando um ESP32. Você pode encontrar documentação oficial e planilhas de dados no Espespressif ESP32 Reference.

Módulos de microfone e alto-falante

A captura e reprodução de áudio confiáveis são cruciais. Para o microfone, você precisa de um módulo que produz um sinal analógico limpo. O amplificador de microfones de electret MAX4466 é uma escolha popular porque é sensível, de baixo ruído e funciona com a lógica 3.3V. Para melhor qualidade de som, considere o microfone INMP441 MEMS, que usa I2S para áudio digital e elimina problemas de ruído analógico.

Para o alto-falante, uma coluna simples de 8-ohm, com 0,5W conectada por meio de um resistor (para limitar a corrente) pode produzir feedback audível. Para maior volume e saída mais clara, use o amplificador MAX98357 I2S com uma pequena coluna. Este módulo pode conduzir uma coluna 3W e é fácil de interagir com o ESP32.

Teste sempre cada componente de áudio individualmente antes de integrá-los no sistema. Um esboço rápido pode gravar áudio para o monitor serial ou reproduzir um tom de teste para verificar fiação e configuração.

Entendendo Opções de Reconhecimento de Voz

Reconhecimento de voz baseado em nuvem

Serviços como Google Speech-to-Text, Amazon Transcribe[, ou Azure Speech-to-Text] oferecem alta precisão e suporta vários idiomas. Você envia dados de áudio por HTTP ou WebSocket e recebe texto reconhecido. O lado negativo é a dependência de conectividade e latência potencial da internet (200–500 ms). Níveis livres mensais existem (por exemplo, 60 minutos por mês no Google), mas o uso pesado pode custar dinheiro.

Reconhecimento de Voz no Dispositivo

Para a privacidade e operação offline, você pode usar bibliotecas leves como Porcupine (de Picovoice) ou TensorFlow Lite Micro[] com um modelo de observação de palavras-chave personalizado. Porcupine oferece palavras de despertar pré-treinadas (por exemplo, "Computer", "Alexa") e é executado em dispositivos restritos a recursos. Ele usa cerca de 100 KB RAM e flash de 200 KB. Para reconhecimento contínuo de fala no dispositivo, considere Whisper[ rodando em um acelerador de IA de borda, mas isso adiciona complexidade e custo.

Uma abordagem híbrida também é popular: use uma palavra de wake no dispositivo para ativar o reconhecimento baseado em nuvem para comandos completos. Isso reduz o uso da nuvem e melhora o tempo de resposta.

Visão Geral da Arquitetura do Sistema

Uma arquitetura típica consiste em três camadas:

  1. Input Layer: Microfone capta som. Um conversor analógico-digital (ADC) ou interface I2S converte o sinal em dados digitais.
  2. Processing Layer: O microcontrolador buffers áudio, detecta uma palavra de despertar ou botão pressiona, então envia o bloco de áudio para uma API de nuvem ou processa-a localmente. Após reconhecimento, analisa o texto do comando e mapeia-o para uma ação.
  3. Saída de camada: O microcontrolador ativa relés, envia sinais infravermelhos, publica mensagens MQTT ou usa GPIO para controlar dispositivos. Também pode reproduzir uma confirmação de áudio através do alto-falante.

O diagrama seguinte (conceitual) mostra o fluxo de dados: Microfone → ESP32 → Wi-Fi → API de nuvem → Resposta JSON → ESP32 → Relay/LED/Speaker. Para processamento local, o passo da nuvem é substituído por uma biblioteca local.

Guia de compilação passo a passo

Passo 1: Recolher componentes

Vai precisar de:

  • Quadro de desenvolvimento ESP32 (por exemplo, NodeMCU-32S)
  • Módulo de microfone MAX4466 ou INMP441
  • Amplificador MAX98357 I2S + coluna (3W, 4-8 ohm)
  • Fios de tábua de pão e de jumper
  • Módulo de retransmissão (para controlo de aparelhos de corrente alternada)
  • Opcional: LED, resistor, botão de pressão, OLED display
  • Fonte de alimentação USB (5V, 2A)

Passo 2: Fiação

Conecte o módulo do microfone:

  • MAX4466: VCC a 3.3V, GND a GND, OUT a GPIO34 (ADC).
  • INMP441 (I2S): VCC a 3.3V, GND a GND, L/R a GND (canal esquerdo), DOUT a GPIO25, BLCK a GPIO26, WS a GPIO27.

Conecte o amplificador de alto-falante:

  • MAX98357: VIN a 5V (ou potência USB), GND a GND, BCLK a GPIO26, LRC a GPIO27, DIN a GPIO25. (Nota: Os pinos BCLK e WS podem ser compartilhados com microfone I2S se configurados corretamente, mas é mais fácil atribuir pinos separados para evitar conflitos.)
  • O alto-falante positivo para a saída do amplificador positivo, negativo para negativo.

Ligar o módulo de relé:

  • VCC a 5V, GND a GND, IN a GPIO32 (ou qualquer pino digital).
  • Transmita os contactos ao seu aparelho (utilizando um circuito de alta tensão separado – tome precauções de segurança).

Passo 3: Instalar dependências de software

Instale o IDE Arduino e adicione o pacote de placa ESP32. Use o Gerenciador de Conselhos para instalar "esp32" por Sistemas Espressif. Depois instale bibliotecas:

  • WiFi.h (incorporado)
  • HTTPClient.h
  • ArduinoJson.h (para processar as respostas API)
  • driver/i2s.h (para áudio I2S)
  • WebServer.h (para configuração local, se necessário)

Para o reconhecimento da nuvem, você também precisará da biblioteca de clientes Google Speech-to-Text API (ou usar chamadas REST diretas). Para a palavra wake no dispositivo, instale Porcupine] biblioteca de Picovoice.

Passo 4: Programação do Microcontrolador

Código de escrita que executa o seguinte loop:

  1. Inicialmente: Configure Wi-Fi, microfone I2S, alto-falante e GPIO.
  2. Ouça a palavra wake: Teste continuamente de áudio e alimentação para Porcupine. Quando uma palavra wake é detectada, defina uma bandeira e toque um bip.
  3. Comando de gravação: Captura de 3-5 segundos de áudio (ou até detecção de silêncio). Salve em um buffer.
  4. Enviar para nuvem: Converter áudio para formato obrigatório (WAV PCM 16 bits, 16 kHz mono). POST para o Google Speech-to-Text endpoint. Receba JSON com transcrição.
  5. Comando de parse: Use string correspondente ou um analisador de intenção simples. Por exemplo, se a transcrição contém "ligar a luz", defina GPIO32 HIGH.
  6. Responde : Toque um tom de confirmação ou fale o resultado via TTS (opcional).
  7. Retornem ao estado de escuta.

Abaixo está um trecho simplificado de código (não era para ser copiado) ilustrando a estrutura:

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <driver/i2s.h>

const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASS";

void setup() {
 Serial.begin(115200);
 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) delay(500);
 // Initialize I2S, GPIO etc.
}

void loop() {
 // Check wake word – omitted for brevity
 if (wake_word_detected) {
 record_audio();
 String transcript = send_to_google(audio_buffer);
 if (transcript.indexOf("light") != -1) {
 digitalWrite(RELAY_PIN, HIGH);
 play_beep();
 }
 delay(1000); // debounce
 }
}

Tratamento de erros de implementação para desconexão Wi-Fi, timeouts de API e comandos inválidos. Use a classe WiFiClientSecure para solicitações HTTPS.

Testando e depurando seu assistente

Ensaio de cada componente isolado em primeiro lugar:

  • Microfone: Envie um esboço que lê o ADC ou I2S e imprime amplitude para o plotter serial. Fale no microfone e verifique as alterações da forma de onda.
  • Falador: Use a função tone() ou o player I2S para produzir uma melodia simples.
  • Wi-Fi: Ping google.com do monitor serial.
  • Relay: Alternar o pino manualmente e ouvir o clique.

Em seguida, integre o reconhecimento de voz. Comece com um comando simples e codificado (por exemplo, pressione um botão para enviar um arquivo de áudio de teste) para garantir que a chamada API funcione. Mova-se gradualmente para entrada de microfone ao vivo. Use registros seriais para ver a transcrição e o timing.

Questões comuns:

  • Nenhum áudio detectado: Verifique fiação de pinos I2S, taxa de amostragem, profundidade de bits descompasso. No ESP32, os canais ADC 0-7 não estão todos disponíveis; use GPIO34-39 para ADC1.
  • API retorna "vazio": Certifique-se de que o áudio está no formato correto (16 bits PCM, 16kHz, mono).O Google espera WAV ou bytes brutos codificados com uma taxa de amostragem correspondente.
  • Resposta lenta: A latência da rede é inevitável. Use um módulo Ethernet com fio, se possível, ou reduza a duração do áudio.

Expansão da Funcionalidade

Uma vez que seu assistente básico funcione, considere adicionar estas características:

Controlo de Dispositivos Múltiplos

Use um corretor MQTT (como Mosquitto) para publicar comandos para outros nós ESP32 em torno da casa. Sua unidade principal pode enviar "kitchen/light/on" para um nó secundário que controla essa luz específica.

Feedback do texto para a fala (TTS)

Em vez de um simples bip, use o Google Cloud Text-to-Speech API ou uma biblioteca offline como speak[ (portado para ESP32) para falar mensagens de confirmação. Isso torna o assistente mais interativo.

Palavras personalizadas de despertar

Use o Picovoice Console para treinar uma palavra de despertar personalizada (por exemplo, "Jarvis") e implantá-la no ESP32. A biblioteca é gratuita para uso não comercial.

Controle de voz para mídia

Integrar com Spotify API ou Kodi (via JSON-RPC) para que você possa dizer "Play jazz" e começar a transmitir música.

Integração com sensores

Anexar um sensor de temperatura/umidade DHT22. Quando o usuário perguntar "Qual é a temperatura?", leia o sensor e responda com o valor.

Retirada Local

Se o Wi-Fi estiver desligado, volte para um conjunto limitado de comandos offline (por exemplo, alternar relé baseado numa simples palavra-chave como "on" ou "off" detectado através da correspondência de palavras-chave do Porcupine).

Considerações sobre Segurança e Privacidade

Construir um assistente de voz que escuta continuamente suscita preocupações válidas. Tome estes passos para se proteger:

  • Use HTTPS para todas as chamadas de API. O WiFiClientSecure do ESP32 suporta TLS, mas você deve incluir a impressão digital do certificado CA ou um certificado de raiz confiável.
  • Minimizar a dependência da nuvem: Use o wake word no dispositivo para evitar enviar todo o áudio para a internet. Apenas o áudio de comando curto é enviado.
  • Processamento local: Para tarefas sensíveis, mantenha o pipeline de fala inteiro offline. Modelos autônomos como TensorFlow Lite Micro pode reconhecer um punhado de comandos sem qualquer conexão à internet.
  • Comutador de mudo físico: Ligar um interruptor de comutador entre a potência do microfone e o VCC. Quando desligado, o microfone está completamente desativado.
  • Segmentação de rede: Coloque dispositivos IoT em uma rede VLAN ou guest separada para limitar a exposição se comprometido.

Observe também os termos de serviço para qualquer API de nuvem que você use. Alguns proíbem streaming contínuo ou exigem consentimento explícito do usuário. Sempre cumpra com as regras de privacidade locais.

Conclusão

Construir um assistente doméstico controlado por voz com microcontroladores é um projeto gratificante que mescla hardware, software e processamento de linguagem natural. Ao começar com um ESP32, um microfone MEMS e uma API de nuvem, você pode criar um assistente funcional em um fim de semana. A experiência que você ganha em áudio analógico, comunicação I2S, rede Wi-Fi e integração API vai servir bem em inúmeros outros projetos de IoT.

À medida que você se torna confortável, empurre os limites: adicione reconhecimento de fala local, controle sobre o MQTT ou até mesmo um painel web para treinar comandos personalizados. A beleza de um assistente de DIY é que ele evolui com você. Não há nenhum ecossistema bloqueado – cada recurso que você adiciona está totalmente sob seu controle.

Para mais leitura, verifique o repositório ESP IoT Solution para exemplos de assistente de voz prontos, e a documentação do motor de palavra porcupine wake para adicionar gatilhos personalizados.