语音控制 LED:Arduino Micro + BitVoicer Server 语音识别实战
元件与物料
| Arduino Micro | 可替换任意 Arduino 板 | ×1 |
| SparkFun 电容麦克风扩展板 | 音频采集前端 | ×1 |
| BitVoicer Server 软件 | 语音识别服务端 (付费 $9.90) | ×1 |
| LED (红/黄/绿) | ×3 | |
| 330Ω 电阻 | ×3 |
项目原理流程
- 电容麦克风扩展板采集并放大音频波形;
- Arduino ADC 将模拟信号数字化、缓冲;
- 串口流式传输音频样本至 PC 端 BitVoicer Server;
- BitVoicer Server 识别语音内容;
- 识别结果映射为预定义命令 (字节数组) 下发回 Arduino;
- Arduino 解析命令,控制对应 LED 亮灭/亮度。
视频演示中 BitVoicer 还提供语音合成反馈 (通过电脑声卡播放),后续文章将展示用 Arduino Due + DAC 外放合成语音。
物料清单与成本估算
- Arduino Micro:~$20
- SparkFun 电容麦克风扩展板:$7.95
- BitVoicer Server 1.0:$9.90
- 面包板:~$10
- 3×LED + 3×330Ω 电阻:~$1.75
- 杜邦线:~$0.30
步骤 1:硬件接线
按下图连接。关键点: 为获得更好 ADC 表现,作者将 SparkFun 扩展板输出参考电压设为 3.3V,故在 Arduino 上跨接 3.3V 引脚至 AREF 引脚。警告: 若在 AREF 施加外部参考电压时调用 analogRead(),必须先调用 analogReference(EXTERNAL),否则会短路内部基准源,损坏单片机。




步骤 2:上传 Arduino 代码
先在 Arduino IDE 导入 BitVoicer Server 库 (安装目录下的 .zip)。代码四大部分:
- 库引用与变量声明 (BVSP 通信类、BVSMic 采样类)
setup():初始化串口 115200、BVSP、BVSMic、注册帧接收回调loop():心跳保活、处理下行帧、根据 SRE 可用性启停录音并上传音频流BVSP_frameReceived():解析 2 字节命令 (字节0=引脚, 字节1=PWM值),调用analogWrite()
完整代码见附件 BVS_Demo1.ino。
步骤 3:导入 BitVoicer Server 方案对象
BitVoicer 四大核心对象:
- Locations: 物理位置,如 “Home”。
- Devices: 客户端设备。创建 “Mixed” 类型设备 “ArduinoMicro”,配置串口参数。**注意:Arduino Micro 使用 RTS/DTR,通信标签页须勾选启用。** 另建 “SystemSpeaker” 设备用于语音合成播放。
- BinaryData: 发往设备的字节数组命令。为每个 LED 开/关/亮度建立 18 个 BinaryData 对象 (如
ArduinoMicroGreenLedOn),建议直接导入附件VoiceSchema.sof与Devices.sof。 - Voice Schemas: 定义识别语句与命令映射、执行顺序、延时。视频中的连续动作序列即通过命令延时实现。
步骤 4:运行与验证
在 BitVoicer Server Manager 中启用 ArduinoMicro 设备,Arduino 检测到可用语音识别引擎 (SRE) 即开始推流。Server Monitor 工具可实时查看识别结果。
完整 Arduino 代码 (BVS_Demo1.ino)
#include <BVSP.h>
#include <BVSMic.h>
#define BVSM_AUDIO_INPUT 5
#define RED_LED_PIN 6
#define YELLOW_LED_PIN 9
#define GREEN_LED_PIN 10
const unsigned long STATUS_REQUEST_TIMEOUT = 1000;
const unsigned long STATUS_REQUEST_INTERVAL = 2000;
const int AUDIO_BUFFER_SIZE = 64;
const int RECEIVE_BUFFER_SIZE = 2;
BVSP bvsp = BVSP();
BVSMic bvsm = BVSMic();
byte audioBuffer[AUDIO_BUFFER_SIZE];
byte receiveBuffer[RECEIVE_BUFFER_SIZE];
void setup() {
pinMode(RED_LED_PIN, OUTPUT);
pinMode(YELLOW_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
Serial.begin(115200);
bvsp.begin(Serial, STATUS_REQUEST_TIMEOUT, STATUS_REQUEST_INTERVAL);
bvsp.frameReceived = BVSP_frameReceived;
bvsm.begin();
}
void loop() {
bvsp.keepAlive();
bvsp.receive();
if (bvsp.isSREAvailable()) {
if (!bvsm.isRecording) {
bvsm.setAudioInput(BVSM_AUDIO_INPUT, EXTERNAL);
bvsm.startRecording();
}
if (bvsm.available) {
if (bvsp.inboundMode == FRAMED_MODE) bvsp.setInboundMode(STREAM_MODE);
int bytesRead = bvsm.read(audioBuffer, AUDIO_BUFFER_SIZE);
bvsp.sendStream(audioBuffer, bytesRead);
}
} else {
if (bvsm.isRecording) bvsm.stopRecording();
}
}
void BVSP_frameReceived(byte dataType, int payloadSize) {
if (dataType == DATA_TYPE_BINARY) {
if (bvsp.getReceivedBytes(receiveBuffer, RECEIVE_BUFFER_SIZE) == RECEIVE_BUFFER_SIZE) {
analogWrite(receiveBuffer[0], receiveBuffer[1]);
}
}
}
原理图

制造工艺
- 基于 Arduino 与 Python 的可靠 RFID 考勤系统
- DHT11 温湿度传感器项目:LED 指示与压电蜂鸣器报警
- Arduino Due 驱动 3.2″ TFT 实现温度监测与实时时钟
- Arduino + Android 蓝牙控制 Roomba Create 2 扫地机器人完整指南
- Arduino DIY 电压表:Nokia 5110 屏幕显示,手把手教学
- Arduino + MPU6050 姿态控制舵机:SG90 与 MG996R 精准跟随实战
- u-blox LEA-6H GPS 模块:Arduino 与 Python 集成指南
- Blynk + Arduino 读取 DHT11 温湿度数据教程
- 在 Arduino Due 上实现语音识别与语音合成 - BitVoicer Server 方案
- 用 Arduino Uno 和 1Sheeld 构建 4x4x4 LED 立方体 - 互动音乐可视化项目
- Arduino GPS与TFT触摸屏扩展板:实时定位显示项目
- 使用 Arduino Uno 和蓝牙实现遥控小车:分步指南