Skip to main content

Grove 离线语音识别

介绍

Grove - 离线语音识别模块适用于低功耗纯离线语音识别,基于 VC-02 模块。它拥有多达 150 个预编程命令,可用于控制您的智能设备。它的识别时间少于 100ms,采用紧凑的 18mm * 17mm 外形尺寸。该模块可通过 UART 外设进行通信,并为每个识别的命令提供唯一的十六进制代码。这个模块只需要 5V 电源就可以开始识别命令!

特性

  • 支持 150 个语音命令
  • 低功耗
  • ESD 保护电源轨
  • 命令 LED 指示器
  • Grove UART 接口

规格参数

参数

范围/值

输入电压5V/3.3V
默认波特率115200
默认输出检测到命令的十六进制值

入门指南

演示1:使用 Arduino IDE 的 Grove 离线语音识别模块

硬件设置

您需要准备以下物品:

tip

某些 USB 线缆只能供电而无法传输数据。如果您没有 USB 线缆或不知道您的 USB 线缆是否可以传输数据,您可以查看 Seeed USB Type-C 支持 USB 3.1

步骤 1. 通过 USB Type-C 线缆将 XIAO RP2040 连接到您的计算机。

步骤 2. 将 XIAO RP2040 连接到 XIAO 扩展板。

步骤 3. 通过 Grove 线缆将 XIAO 扩展板连接到离线语音识别器的 UART 端口。

步骤 4. 将离线语音识别器连接到扬声器。

以下是连接图片供您参考。

软件设置

步骤 1. 根据您的操作系统下载并安装最新版本的 Arduino IDE

步骤 2. 选择您的开发板型号并将其添加到 Arduino IDE。如果您想在后续例程中使用 XIAO RP2040,请参考此教程完成添加。

tip

如果您想使用其他类型的 XIAO,您可以参考这里

步骤 3. 安装 Arduino 代码库。

首先从 GitHub 获取代码库并下载到您的本地计算机。

由于您已经下载了 zip 库文件,打开您的 Arduino IDE,点击 Sketch > Include Library > Add .ZIP Library。选择您刚刚下载的 zip 文件,如果库安装正确,您将在通知窗口中看到 Library added to your libraries。这意味着库已成功安装。

离线语音识别演示

步骤 1. 在您的 Arduino 中打开此文件。

您将看到如下代码。

#include "GroveOfflineSensor.h"
#include <SoftwareSerial.h>
#define RX_VC02 D7
#define TX_VC02 D6

SoftwareSerial groveSerial(RX_VC02, TX_VC02); // RX, TX

void setup() {
Serial.begin(115200);
// wait for serial port to connect. Needed for native USB port only , This port is for displaying data Grove Sensor sends
while (!Serial);
// Make sure to set the baud rate to match your communication
groveSerial.begin(115200);
}

void loop() {
// detect voice from voice recognition sensor
uint8_t *voiceData = detectVoiceFromGroveSensor(&groveSerial);

//transfer the voice to command string
if(voiceData != NULL){
String response = getCommandInString(voiceData);
Serial.println(response);
}
delay(1000);
}

步骤 2. 点击 Upload 按钮将代码上传到开发板

步骤 3. 对传感器说出唤醒词"hello pudding",然后您将听到扬声器的语音反馈,并在Arduino IDE的串口监视器上看到文字反馈。更多说明,您可以在本文底部的资源部分找到。

演示2:Grove离线语音识别与ESPHome和Home Assistant

硬件设置

您需要准备以下物品:

  • 一台安装了Home Assistant的设备

开始使用Home Assistant的第一步是将其安装在设备上,您可以按照这里的分步指南进行操作。

tip

某些USB线缆只能供电而无法传输数据。如果您没有USB线缆或不知道您的USB线缆是否可以传输数据,您可以查看Seeed USB Type-C支持USB 3.1

步骤 1. 硬件准备

通过USB Type-C线缆将XIAO ESP32S3连接到您的计算机。 将XIAO ESP32S3连接到XIAO扩展板。 通过Grove线缆将XIAO扩展板连接到UART端口上的离线语音识别器。 将离线语音识别器连接到扬声器。 将天线连接到XIAO ESP32S3。

这里是连接图片供您参考。

步骤 2. 创建您的智能家居 在浏览器地址栏中输入Home Assistant设备的地址,并创建一个Home Assistant账户,您可以按照这里的分步指南进行操作。

步骤 3. 在Home Assistant上安装ESPHome 您可以按照这里快速在Home Assistant上设置ESPHome

软件

将XIAO ESP32S3添加到ESPHome

  • 点击**+ NEW DEVICE**
  • 点击CONTINUE
  • 为设备输入名称,并输入WiFi凭据,如网络名称密码。然后点击NEXT
  • 选择ESP32-S3并点击NEXT
  • 点击Install并选择Manual download
  • 下载成功后,打开ESPHome Web并选择Modern format
  • 连接您的XIAO ESP32S3端口,并安装您刚刚获得的bin文件,现在它将下载所有必要的板包并将ESPHome固件刷入XIAO ESP32S3。
  • 打开LOGS,如果刷写成功,您将看到以下输出,现在返回ESPHome页面,如果您看到板状态为ONLINE,这意味着板已成功连接到WiFi。
tip

如果您收到警告"[wifi_esp32:482][arduino_events]: Event: Disconnected …… reason='Auth Expired'",请确保ESP32设备在WiFi网络范围内,信号强度差可能导致连接问题。您可以将天线更换为Rod Antenna

现在您可以断开XIAO ESP32C3与计算机的连接,只需通过USB线缆为其供电。这是因为从现在开始,如果您想要将固件刷入XIAO ESP32C3,您可以简单地通过OTA进行,而无需通过USB线缆连接到X86板。

  • 点击三个点并点击Install,选择Wirelessly,它将无线推送更改到板上
  • 转到Settings并选择Devices & Services,您将看到ESPHome作为已发现的集成。点击CONFIGURE。如果它要求加密密钥,请返回ESPHome页面复制API密钥并输入。

离线语音识别

步骤1. 在我们之前创建的offline-voice-recognition.yaml文件中,在文件末尾添加以下内容,并通过OTA推送到XIAO ESP32S3

点击这里预览完整代码
uart:
id: uart_bus
tx_pin: GPIO43
rx_pin: GPIO44
baud_rate: 115200

globals:
- id: hex_code
type: uint8_t
restore_value: no
initial_value: '0'

interval:
- interval: 1s
then:
- lambda: |-
while (id(uart_bus).available() >= 5) {
uint8_t receivedData[5];
for (int i = 0; i < 5; i++) {
id(uart_bus).read_byte(&receivedData[i]);
}
id(hex_code) = receivedData[1];
ESP_LOGD("main", "Hex code: %02X", id(hex_code));
}

sensor:
- platform: template
name: "Received Hex Code"
lambda: |-
return id(hex_code);
update_interval: 5s
unit_of_measurement: ""
accuracy_decimals: 0
on_value:
then:
- lambda: |-
auto call_acwind = id(acwind).make_call();
auto call_actemp = id(actemp).make_call();
switch (id(hex_code)) {
case 0x03:
id(ac).publish_state(true);
break;
case 0x04:
id(ac).publish_state(false);
break;
case 0x05:
id(acmode).publish_state("automatic mode");
break;
case 0x06:
id(acmode).publish_state("cold mode");
break;
case 0x07:
id(acmode).publish_state("heat mode");
break;
case 0x08:
id(acmode).publish_state("dry mode");
break;
case 0x09:
id(acmode).publish_state("fan mode");
break;
case 0x0A:
id(acmode).publish_state("sleeping mode");
break;
case 0x0B:
id(acwind).publish_state("automatic fan");
break;
case 0x0C:
id(acwind).publish_state("low fan");
break;
case 0x0D:
id(acwind).publish_state("medium fan");
break;
case 0x0E:
id(acwind).publish_state("high fan");
break;
case 0x0F:
call_acwind.select_next(false);
call_acwind.perform();
break;
case 0x10:
call_acwind.select_previous(false);
call_acwind.perform();
break;
case 0x11:
id(actemp).publish_state("sixteen centigrade");
break;
case 0x12:
id(actemp).publish_state("seventeen centigrade");
break;
case 0x13:
id(actemp).publish_state("eighteen centigrade");
break;
case 0x14:
id(actemp).publish_state("nineteen centigrade");
break;
case 0x15:
id(actemp).publish_state("twenty centigrade");
break;
case 0x16:
id(actemp).publish_state("twenty one centigrade");
break;
case 0x17:
id(actemp).publish_state("twenty two centigrade");
break;
case 0x18:
id(actemp).publish_state("twenty three centigrade");
break;
case 0x19:
id(actemp).publish_state("twenty four centigrade");
break;
case 0x1A:
id(actemp).publish_state("twenty five centigrade");
break;
case 0x1B:
id(actemp).publish_state("twenty six centigrade");
break;
case 0x1C:
id(actemp).publish_state("twenty seven centigrade");
break;
case 0x1D:
id(actemp).publish_state("twenty eight centigrade");
break;
case 0x1E:
id(actemp).publish_state("twenty nine centigrade");
break;
case 0x1F:
id(actemp).publish_state("thirty centigrade");
break;
case 0x20:
call_actemp.select_next(false);
call_actemp.perform();
break;
case 0x21:
call_actemp.select_previous(false);
call_actemp.perform();
break;
case 0x22:
id(fan).publish_state(true);
break;
case 0x23:
id(fan).publish_state(false);
break;
case 0x24:
id(acswept).publish_state("air swing up and down");
break;
case 0x25:
id(acswept).publish_state("air swing left and right");
break;
case 0x26:
id(acmode).publish_state("automatic mode");
id(acwind).publish_state("automatic fan");
id(actemp).publish_state("twenty six centigrade");
id(fan).publish_state(false);
break;
case 0x27:
id(light).publish_state(true);
break;
case 0x28:
id(light).publish_state(false);
break;
case 0x29:
id(cold_light).publish_state(true);
break;
case 0x2A:
id(cold_light).publish_state(false);
break;
case 0x2B:
id(warm_light).publish_state(true);
break;
case 0x2C:
id(warm_light).publish_state(false);
break;
default:
ESP_LOGW("main", "Unknown hex code: %02X", id(hex_code));
break;
}

switch:
- platform: template
name: "air conditioner"
id: ac
optimistic: True
- platform: template
name: "fan"
id: fan
optimistic: True
- platform: template
name: "light"
id: light
optimistic: True
- platform: template
name: "cold light"
id: cold_light
optimistic: True
- platform: template
name: "warm light"
id: warm_light
optimistic: True

select:

- platform: template
name: Air conditioner mode
id: acmode
optimistic: True
options:
- "automatic mode"
- "cold mode"
- "heat mode"
- "dry mode"
- "fan mode"
- "sleeping mode"
initial_option: "automatic mode"

- platform: template
name: Fan mode
id: acwind
optimistic: True
options:
- "automatic fan"
- "low fan"
- "medium fan"
- "high fan"
initial_option: "automatic fan"

- platform: template
name: Temperature
id: actemp
optimistic: True
options:
- "sixteen centigrade"
- "seventeen centigrade"
- "eighteen centigrade"
- "nineteen centigrade"
- "twenty centigrade"
- "twenty one centigrade"
- "twenty two centigrade"
- "twenty three centigrade"
- "twenty four centigrade"
- "twenty five centigrade"
- "twenty six centigrade"
- "twenty seven centigrade"
- "twenty eight centigrade"
- "twenty nine centigrade"
- "thirty centigrade"
initial_option: "twenty six centigrade"

- platform: template
name: Fan direction
id: acswept
optimistic: True
options:
- "air swing up and down"
- "air swing left and right"
note

当我们创建一个新设备时,由于不同的配置和设备类型,自动生成的 yaml 文件会有所不同,因此我们建议不要更改文件的开头部分,只需在末尾添加代码即可。

  • 您可以在这里了解更多关于 Uart Bus 的信息
  • 您可以在这里了解更多关于 Switch Component 的信息
  • 您可以在这里了解更多关于 Select Component 的信息

步骤2. 在仪表板上可视化

  • 现在回到设备页面,选择离线语音识别设备
  • 点击 ADD TO DASHBOARDNEXTADD TO DASHBOARD,然后返回 OVERVIEW,现在您的 Home Assistant 仪表板将如下所示

步骤3. 对传感器说唤醒词"hello pudding",然后您将听到语音反馈并在 Home Assistant 上看到动作反馈。更多说明,您可以在本文底部的资源部分找到。

资源

技术支持与产品讨论

感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...