使用 Arduino 和 BitVoicer 服务器进行语音识别
组件和用品
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 3 | |||
![]() |
| × | 3 |
关于这个项目
在这篇文章中,我将展示如何使用 Arduino 板和 BitVoicer 服务器通过语音命令控制几个 LED。我将在这篇文章中使用 Arduino Micro,但您可以使用手头的任何 Arduino 板。
将执行以下程序将语音命令转换为 LED 活动:
- Sparkfun Electret Breakout 板将捕获和放大声波;
- 放大后的信号将在 Arduino 中使用其模数转换器 (ADC) 进行数字化和缓冲;
- 音频样本将使用 Arduino 串行端口流式传输到 BitVoicer 服务器;
- BitVoicerServer 将处理音频流并识别其中包含的语音;
- 识别的语音将映射到将发送回 Arduino 的预定义命令;
- Arduino 将识别命令并执行适当的操作。
上面的视频显示了这篇文章的最终结果。请注意视频中的 BitVoicer Server 还提供合成语音反馈。这种语音反馈在服务器中定义并由服务器音频适配器再现,但合成的音频也可以发送到 Arduino 并使用数模转换器 (DAC) 再现。在我的下一篇文章中,我将展示如何使用 Arduino DUE,一个放大和一个扬声器来使用 Arduino 本身重现合成语音。
材料清单:
- Arduino Micro(或任何其他 Arduino 板):~U$ 20.00
- Sparkfun 驻极体麦克风突破:7.95 美元
- BitVoicer 服务器 1.0 :9.90 美元
- 面包板:~10.00 美元
- 3 个 xLED:约 1.00 美元
- 3 x330 欧姆电阻:~U$ 0.75
- 跳线:~U$ 0.30
第 1 步:接线
第一步是将Arduino和面包板与下图所示的组件连接起来。




这里最重要的细节是指提供给 Arduino ADC 的模拟参考。在我的测试中,我使用 3.3V 和 Sparkfun Electret Breakout 获得了更好的结果。这就是我在 3.3V 引脚和 AREF 引脚之间添加跳线的原因。如果您决定在 AREF 引脚施加 3.3V 电压时使用analogRead 函数(出于任何原因),则必须在使用analogRead 函数之前调用analogReference(EXTERNAL)。否则,您会将有效参考电压(内部生成)和 AREF 引脚短路,可能会损坏 Arduino 板上的微控制器。
第 2 步:将代码上传到 Arduino
现在您必须将以下代码上传到您的 Arduino。为方便起见,本文底部的“附件”部分也提供了 Arduino 草图。在上传代码之前,您必须将 BitVoicer Server 库正确安装到 Arduino IDE 中(导入 .zip 库)。
BVS_Demo1.ino这个草图有四个主要部分:
- 库引用和变量声明:前两行包括对 BVSP 和 BVSMic 库的引用。这些库由 BitSophia 提供,可以在 BitVoicer Server 安装文件夹中找到。其他行声明了整个草图中使用的常量和变量。 BVSP 类用于与 BitVoicer Server 通信,BVSMic 类用于捕获和存储音频样本。
- Setupfunction:该函数初始化串行通信、BVSP 类、BVSMic 类,并为 frameReceived 事件设置“事件处理程序”(它实际上是一个函数指针)。
- Loopfunction:该函数执行三个重要操作:向服务器请求状态信息(keepAlive() 函数),检查服务器是否发送了任何数据并处理接收到的数据(receive() 函数),以及控制音频的录制和发送流(isSREAvailable()、startRecording()、stopRecording() 和 sendStream() 函数)。
- BVSP_frameReceivedfunction:每次receive() 函数识别出已经接收到一个完整的帧时,都会调用该函数。在这里,我运行从BitVoicer Server 发送的命令。该命令包含 2 个字节。第一个字节表示引脚,第二个字节表示引脚值。我使用analogWrite() 函数为引脚设置适当的值。
第 3 步:导入 BitVoicer 服务器解决方案对象
现在您必须设置 BitVoicer 服务器才能与 Arduino 配合使用。 BitVoicer Server 有四个主要的解决方案对象:Locations、Devices、BinaryData 和 Voice Schemas。
位置表示安装设备的物理位置。就我而言,我创建了一个名为 Home 的位置。
设备是 BitVoicer 服务器客户端。我创建了一个混合设备,命名为 ArduinoMicro 并输入通信设置。 关于 ARDUINO MICRO 的注意事项 :它使用 RTS 和 DTR,因此您必须在通信选项卡中启用这些设置。我还创建了一个 SystemSpeaker 设备来使用服务器音频适配器合成语音。
BinaryData 是一种 BitVoicer Server 可以发送到客户端设备的命令。它们实际上是可以链接到命令的字节数组。当 BitVoicer Server 识别出与该命令相关的语音时,它会将字节数组发送到目标设备。我为每个引脚值创建了一个 BinaryData 对象,并将它们命名为 ArduinoMicroGreenLedOn、ArduinoMicroGreenLedOff 等。我的解决方案中有 18 个 BinaryData 对象,因此我建议您从 VoiceSchema.sof 下载并导入这些对象 文件在下面。
语音模式是一切都聚集在一起的地方。它们定义了应该识别哪些句子以及运行哪些命令。对于每个句子,您可以根据需要定义任意数量的命令以及它们将执行的顺序。您还可以定义命令之间的延迟。这就是我设法执行您在视频中看到的一系列操作的方法。
您可以从下面的文件中导入(导入解决方案对象)我在这篇文章中使用的所有解决方案对象。一个包含设备,另一个包含语音架构及其命令。
设备软件
第 4 步:结论
这就对了!我希望你喜欢它。
您拥有运行视频中显示的演示所需的一切。请注意,在视频中,我首先在 BitVoicer 服务器管理器中启用了 ArduinoMicro 设备。一旦启用,Arduino 就会识别一个可用的语音识别引擎并开始将音频流式传输到 BitVoicer 服务器。
您可以在 BitVoicer 服务器管理器中的服务器监控工具中跟踪识别结果。
在我的下一篇文章中,我将展示如何使用 Arduino DUE 重现合成语音。
代码
- BVS_Demo1.ino
BVS_Demo1.inoArduino
#include#include // 定义将用于捕获音频的 Arduino 引脚 #define BVSM_AUDIO_INPUT 5// 定义 LED 引脚#define RED_LED_PIN 6#define YELLOW_LED_PIN 9#define GREEN_LED_PIN 10// 定义将作为参数传递给 // BVSP.begin 函数的常量const unsigned long STATUS_REQUEST_TIMEOUT =1000;const unsigned long STATUS_REQUEST_INTERVAL =2000;// 定义音频缓冲区的大小 const int AUDIO_BUFFER_SIZE =/定义接收缓冲区的大小const int RECEIVE_BUFFER_SIZE =2;//初始化BVSP类的新全局实例BVSP bvsp =BVSP();//初始化BVSMic类的新全局实例BVSMic bvsm =BVSMic();/ / 创建一个缓冲区,用于读取记录的样本 // 从 BVSMic 类字节 audioBuffer[AUDIO_BUFFER_SIZE];// 创建一个缓冲区,用于读取 // 从 BitVoicer 服务器发送的命令。// 字节 0 =pin number// Byte 1 =pin valuebyte receiveBuffer[RECEIVE_BUFFER _SIZE];void setup() { // 设置引脚模式 pinMode(RED_LED_PIN, OUTPUT); pinMode(YELLOW_LED_PIN, OUTPUT); pinMode(GREEN_LED_PIN,输出); // 以 115200 bps 的速率开始串行通信 Serial.begin(115200); // 设置将用于 // 通信的 Arduino 串行端口,状态请求需要多长时间 // 超时以及状态请求应多久发送到 // BitVoicer 服务器。 bvsp.begin(Serial, STATUS_REQUEST_TIMEOUT, STATUS_REQUEST_INTERVAL); // 定义处理frameReceived的函数 // event bvsp.frameReceived =BVSP_frameReceived; // 准备 BVSMic 类计时器 bvsm.begin();}void loop() { // 检查状态请求间隔是否已经过去,如果已经过去,则向 BitVoicer 服务器发送状态请求 bvsp.keepAlive(); // 检查串口缓冲区中是否有可用数据 // 并根据 BitVoicer 服务器协议的规范 // 处理其内容 bvsp.receive(); // 检查是否有一个 SRE 可用。如果有, // 开始记录。 if (bvsp.isSREAvailable()) { // 如果 BVSMic 类未录制,则设置音频 // 输入并开始录制 if (!bvsm.isRecording) { bvsm.setAudioInput(BVSM_AUDIO_INPUT, EXTERNAL); bvsm.startRecording(); } // 检查 BVSMic 类是否有可用样本 if (bvsm.available) { // 在传输流之前确保入站模式为 STREAM_MODE if (bvsp.inboundMode ==FRAMED_MODE) bvsp.setInboundMode(STREAM_MODE); // 从 BVSMic 类中读取音频样本 int bytesRead =bvsm.read(audioBuffer, AUDIO_BUFFER_SIZE); // 将音频流发送到 BitVoicer Server bvsp.sendStream(audioBuffer, bytesRead); } } else { // 没有可用的 SRE。如果 BVSMic 类正在录制, // 停止它。 if (bvsm.isRecording) bvsm.stopRecording(); }}// 处理frameReceived 事件 void BVSP_frameReceived(byte dataType, int payloadSize) { // 检查接收到的帧是否包含二进制数据 // 0x07 =二进制数据(字节数组) if (dataType ==DATA_TYPE_BINARY) { // If 2字节已接收,处理命令。 if (bvsp.getReceivedBytes(receiveBuffer, RECEIVE_BUFFER_SIZE) ==RECEIVE_BUFFER_SIZE) {analogWrite(receiveBuffer[0], receiveBuffer[1]); } }}
示意图

制造工艺
- 使用 Arduino 和 RFID 和 Python 的考勤系统
- 带 LED 和压电扬声器的 DHT11 传感器
- Arduino 温度。使用 3.2 显示的监视器和实时时钟
- 使用 Arduino 和 Android 设备控制 Roomba 机器人
- DIY 电压表与 Arduino 和诺基亚 5110 显示器
- 使用 Arduino 和 MPU6050 控制伺服电机
- u-blox LEA-6H 02 GPS 模块,带有 Arduino 和 Python
- 如何使用 DHT11 在 Blynk 上读取温度和湿度
- 使用 Arduino 进行语音识别和合成
- 4x4x4 LED 立方体,带有 Arduino Uno 和 1sheeld
- 带 GPS 和 TFT 显示屏蔽的 GPS 位置显示
- 使用 Arduino Uno 和蓝牙进行汽车控制