65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 ESP8266 进行热词/语音识别

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2020 年 6 月 20 日

CPOL

5分钟阅读

viewsIcon

17495

downloadIcon

234

使用 MicroPython 通过 ESP8266 为您的智能家居添加热词识别。

引言

我的大部分家庭自动化都是通过对网络中的设备进行 HTTP 请求来控制的。
(例如:打开灯,打开收音机,控制供暖系统……)。
使用 ESP8266 可以轻松实现这一点。我有一个这样的控制器,并结合了一个触摸传感器,当我在床上时,我用它来控制灯光和音乐。

添加像 Amazon Echo 或 Google Homepod 那样的语音控制将是一个不错的功能。

背景

ESP 8266 有限的能力导致需要一个附加模块来完成热词检测的繁重任务。最近,我注意到《Make》杂志上有一篇文章,介绍了基于 Arduino 的类似主题,并使用了不同的语音识别板。我想知道是否有可能将该功能移植到使用 Micropython 的 ESP 上。

这并非您可以添加到自己产品中的某种库,这只是一个展示如何实现热词训练和热词识别的代码。

我使用的是 Wemos D1 mini,因为我手边有一些。接线非常简单,因为 Easy VR 的一个电源引脚既可以接受 5 V 也可以接受 3.3 V。除了电源,只需要 RX/TX 用于串行通信。

Wemos 需要刷入 Micropython(1.12 分支)。

我建议将这两个模块放在一块面包板上,并将 USB 电源连接到 Wemos。

如果您倾向于焊接,您可以选择这条路

为了编程和测试,我启用了 repl,并在加入 Wemos 提供的热点后,通过 192.168.4.1 连接到它。

EasyVR 手册(可在网上找到 此处)对通信协议进行了非常详细的文档说明。

EasyVR 接受两种语音命令。一种是扬声器独立(SI)命令,您需要一个特殊的工具(在制造商网站上可用[不免费])来创建,另一种是扬声器依赖(SD)命令,可以使用 EasyVR 的麦克风录制。语音命令在 EasyVR 中按组组织,其中组 0 应该包含热词,其他组应包含语音命令。组 16 保留用于密码。您可以在文档中查看技术细节。

Using the Code

我集成了三个 Python 代码文件(train.pyrecognition.pymanage.py),您可以将它们复制到 ESP 上,并通过 Micropython shell 中的以下语法导入来运行它们。

import train
import recognize
import manage

在某些 ESP 8266 上,您会注意到在导入一个模块后,当您想导入另一个模块时,它会抱怨内存不足。这是因为某些 8266 的内存占用空间很小。为了避免这种情况,您可以使用 ESP32,或者只需按 **Ctrl-D**,重新连接 webrepl 会话,然后导入。这将执行软重置,释放大部分已使用的内存。

函数详解

模块中的大多数函数都是不言自明的。

导入训练模块

  1. 显示每个组中定义的命令数
  2. 显示组中每个命令的详细信息(编号、训练次数、标志、冲突命令、命令标签)

  3. 将语言设置为英语(对于内置词很重要)
  4. 将语言设置为德语(对于内置词很重要)
  5. 将麦克风灵敏度距离设置为非常短(直接对着嘴巴)
  6. 将麦克风灵敏度距离设置为约 1-2 米
  7. 将麦克风灵敏度距离设置为超过 2 米(整个房间)
    1. 在组中添加(插入)一个新命令并定义其标签。该组中所有现有命令将向上移动一步。
    2. 训练该特定组和命令编号的语音命令。(应执行两次以提高命中率)

识别菜单具有以下功能

  1. 将语言设置为英语(对于内置词很重要)
  2. 将语言设置为德语(对于内置词很重要)
  3. 将麦克风灵敏度距离设置为非常短(直接对着嘴巴)
  4. 将麦克风灵敏度距离设置为约 1-2 米
  5. 将麦克风灵敏度距离设置为超过 2 米(整个房间)
  6. 开始特定组的语音识别。进行一次尝试。
    结果将是识别出的命令编号或错误编号。
  7. 开始特定组的语音识别。进行十次识别尝试。
    结果将是识别出的命令编号或错误编号。

管理菜单提供以下功能

  1. 显示组中每个命令的详细信息(编号、训练次数、标志、冲突命令、命令标签)

  2. 从特定组中删除已定义的命令(后续命令将移至该位置)。

关注点

一个值得关注的点是,基本的 ESP8266 只有一个 UART,它也用于 REPL 接口,用于与设备(USB 或 WIFI)通信。在运行时环境中,这可能不是问题,因为您通常不会频繁使用(Web)REPL。但在开发和调试过程中,(Web)REPL 是监控设备上发生情况的重要方式,所以我到处寻找解决方案。我在网上找到一个论坛帖子,它指引了我正确的方向。诀窍是在与 EasyVR(或其他任何串行设备)通信时禁用 webrepl。但您必须确保即使在错误情况下也能将其重新启用,否则您将失去与设备的连接。

我按此方式实现了它

    try:
        uos.dupterm(None, 1) # turn off the repl
        uart=UART(0,9600)
        uart.init(9600, bits=8, parity=None, stop=1)

        *** do your serial communication stuff here ***

    except Exception:
        print ("Error occured")
    finally:
        uos.dupterm(machine.UART(0, 115200), 1)  # enable the repl

结论

可以轻松地将热词识别集成到 ESP8266 中,以控制其他设备,例如在您的智能家居中,甚至在商业环境中。

EasyVR 模块具有多种附加功能,例如,切换 I/O、语音提示等。您可以查看文档了解详细信息。通信始终以相同的方式进行,因此您可以将此代码作为一种蓝图使用。

历史

  • 2020 年 6 月 20 日:发布 1.00 版本
© . All rights reserved.