树莓派语音识别-物联网实验

    前几篇文章介绍了,如何利用Respeaker读取语音,然后又如何通过BaiduApi获取语音文字,以及长文本如何切词获取所需的命令关键字;接下来这篇文章将做个简单的实验,实现如果通过语音控制电灯的开关(其他的实验后续会继续探索)。
    首先来看一下实验效果,如下效果:
    由上可看到,我们对着Respeaker说“天太热了开灯”(突然想起来天热貌似和开灯没啥关系),可见发送baidu分析,然后获得长文本“天太热了开灯”;接着分词切出"开灯"命令;由于这个命令是可执行命令,所以提示写入命令;然后可见另一个树莓派控制的led灯开始闪烁。当然这个时候我们可以控制很多东西,比如天热了开风扇等。
    见下图,第一行为识别文本,第三行是切词效果,由于开灯是关键词,所以命中了可执行命令,触发命令写入。具体的命令写入可参考:mongo操作。
识别效果

{ "_id" : 8, "status" : 1, "subject" : "电灯", "act_dely" : 0, "act" : "开灯", "add_time" : "2021-07-21 08:52:58" }
其中status标示是否已执行,subject为执行主体,act_dely是否延迟执行,act是执行动作,add_time是命令写入时间。
#接下来我们阐述一下具体的实验过程,需要用到的材料以及接线如下图:
接线示例
具体的接线可参考文章:继电器实验
接线完成后,如何获取的命令如何传递的可以参考文章:多个树莓派之间通信

实验的具体思路和流程如下:

  • 语音通过传感器捕获;
  • 发送语音流然后Api解析;
  • 长文本获取;
  • 文本筛选切词;
  • 切词后获取关键命令;
  • 命令捕获格式化存储;
  • 执行端远程通信并捕获命令;
  • 命令校验报错或执行;
  • 命令执行后销毁;
  • 完成。

具体实现代码,先看语音命令识别写入部分:

命令捕获切词
切词后命令写入
接下来是执行端代码:
命令发现和定义执行代码
命令发现到执行到结束
其中命令获取采用的是crontab,每5秒检测一次,因此最大会出现5秒的延迟。

#check led task
* * * * * cd /home/pi/shumeijiang/act/led && /usr/bin/python led.py
* * * * * sleep 5;  cd /home/pi/shumeijiang/act/led && /usr/bin/python led.py
* * * * * sleep 10; cd /home/pi/shumeijiang/act/led && /usr/bin/python led.py
* * * * * sleep 15; cd /home/pi/shumeijiang/act/led && /usr/bin/python led.py
* * * * * sleep 20; cd /home/pi/shumeijiang/act/led && /usr/bin/python led.py
* * * * * sleep 25; cd /home/pi/shumeijiang/act/led && /usr/bin/python led.py
* * * * * sleep 30; cd /home/pi/shumeijiang/act/led && /usr/bin/python led.py
* * * * * sleep 35; cd /home/pi/shumeijiang/act/led && /usr/bin/python led.py
* * * * * sleep 40; cd /home/pi/shumeijiang/act/led && /usr/bin/python led.py
* * * * * sleep 45; cd /home/pi/shumeijiang/act/led && /usr/bin/python led.py
* * * * * sleep 50; cd /home/pi/shumeijiang/act/led && /usr/bin/python led.py
* * * * * sleep 55; cd /home/pi/shumeijiang/act/led && /usr/bin/python led.py