Proyecto LED Controlado por Voz: Arduino Micro + BitVoicer Server para Reconocimiento Voz
Componentes y suministros
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino Micro | 1 | Cualquier Arduino sirve |
| SparkFun Electret Microphone Breakout | 1 | Captura y amplifica audio |
| BitVoicer Server | 1 | Software reconocimiento voz (pago) |
| BitVoicer Server 1.0 | 1 | Versión servidor |
| LED genérico | 3 | Rojo, Amarillo, Verde |
| Resistencia 330 ohm | 3 | Para LEDs |
Sobre el proyecto
En esta entrada muestro cómo usar una placa Arduino y BitVoicer Server para controlar unos LEDs con comandos de voz. Usaré Arduino Micro, pero puedes usar cualquier Arduino.
Los siguientes procedimientos transforman comandos de voz en actividad de LEDs:
- Ondas de audio capturadas y amplificadas por SparkFun Electret Breakout.
- Señal amplificada digitalizada y bufferizada en Arduino usando su ADC (convertidor analógico-digital).
- Muestras de audio transmitidas a BitVoicer Server por puerto serie Arduino.
- BitVoicer Server procesa el stream y reconoce el habla.
- Voz reconocida se mapea a comandos predefinidos que se envían al Arduino.
- Arduino identifica comandos y ejecuta la acción correspondiente.
El video muestra el resultado final. BitVoicer Server también da feedback por voz sintetizada, definido en el servidor y reproducido por su adaptador de audio. El audio sintetizado también podría enviarse al Arduino y reproducirse con un DAC. En mi próxima entrada mostraré cómo usar Arduino DUE, amplificador y altavoz para reproducir voz sintetizada en el propio Arduino.
Lista de materiales:
- Arduino Micro (u otro): ~$20
- SparkFun Electret Microphone Breakout: $7.95
- BitVoicer Server 1.0: $9.90
- Protoboard: ~$10
- 3 LEDs: ~$1
- 3 resistencias 330Ω: ~$0.75
- Cables puente: ~$0.30
PASO 1: Cableado
Primero cablea Arduino y protoboard con componentes como en las fotos.
Detalle crucial: La referencia analógica para el ADC del Arduino. En mis pruebas, mejores resultados usando 3.3V con SparkFun Electret Breakout. Por eso puse un puente entre pin 3.3V y AREF. Si usas analogRead() con 3.3V en AREF, DEBES llamar analogReference(EXTERNAL) antes de analogRead(). Si no, cortocircuitas la referencia interna activa con el pin AREF, pudiendo dañar el microcontrolador.
PASO 2: Subir código a Arduino
Sube el código de abajo. El sketch también está en Adjuntos. Antes, instala las bibliotecas BitVoicer Server en Arduino IDE (Importar biblioteca .zip).
El sketch BVS_Demo1.ino tiene 4 partes principales:
- Referencias biblioteca y variables: Incluye
BVSP.hyBVSMic.h(proveídas por BitSophia, en carpeta instalación BitVoicer Server). Declara constantes y variables. ClaseBVSPcomunica con servidor,BVSMiccaptura y almacena muestras audio. - Setup(): Inicializa comunicación serie, clases BVSP y BVSMic, y establece "manejador de eventos" (puntero a función) para evento
frameReceived. - Loop(): Tres acciones: solicita info estado al servidor (
keepAlive()), comprueba si servidor envió datos y procesa (receive()), controla grabación y envío streams audio (isSREAvailable(),startRecording(),stopRecording(),sendStream()). - BVSP_frameReceived(): Se llama cada vez que
receive()detecta trama completa. Ejecuta comando desde BitVoicer Server. Comando = 2 bytes: byte 0 = pin, byte 1 = valor pin. UsoanalogWrite()para establecer valor en pin.
PASO 3: Importar objetos solución BitVoicer Server
Configura BitVoicer Server para trabajar con Arduino. Tiene 4 objetos principales: Ubicaciones, Dispositivos, BinaryData, Esquemas de Voz.
- Ubicaciones: Lugar físico donde está el dispositivo. Creé "Hogar".
- Dispositivos: Clientes BitVoicer Server. Creé dispositivo "Mixed" llamado "ArduinoMicro" con configuración comunicación. NOTA ARDUINO MICRO: usa RTS y DTR, habilita estos ajustes en pestaña comunicación. También creé dispositivo "SystemSpeaker" para síntesis voz por adaptador audio del servidor.
- BinaryData: Tipo de comando que BitVoicer envía a dispositivos. Son arrays de bytes vinculados a comandos. Al reconocer voz relacionada, envía el array al dispositivo destino. Creé uno por cada valor de pin:
ArduinoMicroGreenLedOn,ArduinoMicroGreenLedOff, etc. Total 18 objetos BinaryData. Sugiero descargar e importar desde archivoVoiceSchema.sofabajo. - Esquemas de Voz: Donde todo converge. Definen qué frases reconocer y qué comandos ejecutar. Por frase, tantos comandos como necesites y orden. También definen retardos entre comandas. Así logré la secuencia del video.
Puedes importar todos los objetos que usé desde los archivos abajo. Uno contiene Dispositivos, otro Esquema de Voz y Comandos.
Devices.sof
VoiceSchema.sof
PASO 4: Conclusión
¡Eso es todo! Espero que te guste.
Tienes todo para ejecutar la demo del video. En el video empiezo habilitando dispositivo ArduinoMicro en BitVoicer Server Manager. Al habilitarse, Arduino detecta motor reconocimiento voz disponible y empieza a enviar audio al servidor.
Puedes seguir resultados en herramienta Server Monitor del BitVoicer Server Manager.
En mi próxima entrada mostraré cómo reproducir voz sintetizada con Arduino DUE.
Código
BVS_Demo1.ino (Arduino)
#include <BVSP.h>
#include <BVSMic.h>
// Pin Arduino para captura audio
#define BVSM_AUDIO_INPUT 5
// Pines LEDs
#define RED_LED_PIN 6
#define YELLOW_LED_PIN 9
#define GREEN_LED_PIN 10
// Constantes para BVSP.begin
const unsigned long STATUS_REQUEST_TIMEOUT = 1000;
const unsigned long STATUS_REQUEST_INTERVAL = 2000;
// Tamaño buffer audio
const int AUDIO_BUFFER_SIZE = 64;
// Tamaño buffer recepción
const int RECEIVE_BUFFER_SIZE = 2;
// Instancia global BVSP
BVSP bvsp = BVSP();
// Instancia global BVSMic
BVSMic bvsm = BVSMic();
// Buffer para leer muestras grabadas de BVSMic
byte audioBuffer[AUDIO_BUFFER_SIZE];
// Buffer para leer comandos de BitVoicer Server
// Byte 0 = número pin, Byte 1 = valor pin
byte receiveBuffer[RECEIVE_BUFFER_SIZE];
void setup() {
// Configura pines
pinMode(RED_LED_PIN, OUTPUT);
pinMode(YELLOW_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
// Comunicación serie a 115200 bps
Serial.begin(115200);
// Configura puerto serie, timeout e intervalo peticiones estado
bvsp.begin(Serial, STATUS_REQUEST_TIMEOUT, STATUS_REQUEST_INTERVAL);
// Función manejadora evento frameReceived
bvsp.frameReceived = BVSP_frameReceived;
// Prepara timer BVSMic
bvsm.begin();
}
void loop() {
// Comprueba intervalo petición estado y envía a BitVoicer Server
bvsp.keepAlive();
// Procesa datos puerto serie según protocolo BitVoicer
bvsp.receive();
// Si hay SRE (Speech Recognition Engine) disponible, empieza grabación
if (bvsp.isSREAvailable()) {
// Si BVSMic no grabando, configura entrada audio y empieza
if (!bvsm.isRecording) {
bvsm.setAudioInput(BVSM_AUDIO_INPUT, EXTERNAL);
bvsm.startRecording();
}
// Si BVSMic tiene muestras disponibles
if (bvsm.available) {
// Asegura modo STREAM_MODE antes de transmitir
if (bvsp.inboundMode == FRAMED_MODE)
bvsp.setInboundMode(STREAM_MODE);
// Lee muestras de BVSMic
int bytesRead = bvsm.read(audioBuffer, AUDIO_BUFFER_SIZE);
// Envía stream audio a BitVoicer Server
bvsp.sendStream(audioBuffer, bytesRead);
}
} else {
// No hay SRE disponible. Si BVSMic grabando, para.
if (bvsm.isRecording)
bvsm.stopRecording();
}
}
// Maneja evento frameReceived
void BVSP_frameReceived(byte dataType, int payloadSize) {
// Comprueba si trama contiene datos binarios (0x07 = Binary data)
if (dataType == DATA_TYPE_BINARY) {
// Si se recibieron 2 bytes, procesa comando
if (bvsp.getReceivedBytes(receiveBuffer, RECEIVE_BUFFER_SIZE) == RECEIVE_BUFFER_SIZE) {
analogWrite(receiveBuffer[0], receiveBuffer[1]);
}
}
}
Esquemáticos
Proceso de manufactura
- Sistema de Asistencia RFID Fiable con Arduino y Python
- Proyecto Sensor DHT11 Temperatura y Humedad con Indicadores LED y Altavoz Piezo
- Monitor de Temperatura y Reloj en Tiempo Real con Arduino Due y Pantalla TFT 3.2"
- Controla tu Roomba Create 2 con Arduino y Android: Guía Completa
- Construye un voltímetro DIY con Arduino y pantalla Nokia 5110 – Guía paso a paso
- Control Preciso de Servo con Arduino y MPU6050 (SG90 / MG996R)
- Módulo GPS u-blox LEA‑6H 02: Guía de integración con Arduino y Python
- Leer Temperatura y Humedad con DHT11 en Blynk – Tutorial Paso a Paso con Arduino
- Dominando reconocimiento y síntesis de voz en Arduino Due
- Construye un Cubo LED 4x4x4 con Arduino Uno y 1Sheeld – Proyecto LED Interactivo
- Proyecto Arduino GPS y Pantalla TFT Táctil Shield: Visualización de Ubicación en Tiempo Real