在智能家居或商业环境中,通过语音控制设备是一种便捷的方式。例如,可以在床上通过语音控制灯光、音乐或加热系统。ESP8266是一个低成本的微控制器,非常适合用于此类项目。本文将介绍如何使用ESP8266和EasyVR模块实现语音控制功能。
ESP8266的功能有限,因此需要一个额外的模块来执行热词检测的复杂任务。最近,在《制作》杂志上看到了一篇关于使用Arduino和不同语音识别板进行热词检测的文章。想知道是否可以将这个功能移植到ESP上,使用Micropython来实现。
使用的是Wemos D1 mini,因为桌子上有一些。接线非常简单,因为Easy VR可以接受5V和3.3V的电源。除了电源,还需要RX/TX进行串行通信。
Wemos需要刷入Micropython(1.12分支)。建议将两个模块放在面包板上,并连接USB电源到Wemos。如果更喜欢焊接,也可以选择这种方式。
为了编程和测试,启用了repl,并使用webrepl连接到192.168.4.1,这是加入Wemos提供的热点后的操作。EasyVR的通信协议在互联网上提供的手册中有非常详细的说明。
EasyVR接受两种类型的语音命令。一种是说话者独立的(SI)命令,需要一个特殊的工具(在制造商的网站上可用,但不是免费的)来创建。另一种是说话者依赖的(SD)命令,可以使用EasyVR的麦克风录制。语音命令在EasyVR中以组的形式组织,其中组0应该包含热词,其他组应该包含语音命令。组16保留用于密码。可以在文档中查看技术细节。
集成了三个Python代码文件(train.py、recognition.py和manage.py),可以将它们复制到ESP上,并通过以下语法在Micropython shell中导入它们。
Python
import train
import recognize
import manage
在一些ESP8266上,可能会注意到它在导入一个模块后抱怨内存不足,当想导入另一个模块时。这是因为一些8266的内存非常小。为了避免这个问题,可以使用ESP32,或者按下Ctrl-D,重新连接webrepl会话,然后导入。这将进行软重置,释放大部分已使用的内存。
模块中的大多数函数都是自解释的。导入train模块:
recognize菜单有这些功能:
manage菜单提供这些功能:
一个需要注意的点是,基本的ESP8266只有一个UART,这也被REPL接口使用,用于与设备(USB或WIFI)通信。在运行时环境中,这可能不是问题,因为通常不会频繁使用(web)repl。但在开发和调试过程中,(web)repl是监控设备上发生的事情的重要方式,所以寻找了解决这个问题的方法。在互联网上的某个论坛帖子上,找到了正确的方向。诀窍是在与EasyVR(或其他串行设备)通信的那一刻禁用webrepl。但必须确保在错误情况下再次启用它,否则将失去与设备的连接。
Python
try:
uos.dupterm(None, 1)
# 关闭repl
uart=UART(0, 9600)
uart.init(9600, bits=8, parity=None, stop=1)
*** 在这里做串行通信 ***
except Exception:
print("Error occured")
finally:
uos.dupterm(machine.UART(0, 115200), 1)
# 启用repl