没错, 这是智 zhang 语音助手
本系统基于自美系统二次开发, 添加连接 EMQ 服务器, 语音远程控制 LED(Nodemcu), 当然也可以扩展控制更多的设备, 只需要将下位机设备连接到 EMQ 服务器即可.
由于使用自美系统, 需要配套的驱动板官方文档有相关链接.(有兴趣的同学可以了解一下 悟空项目 , 也是一个开源智能音箱项目)
自美系统已经将基础的语音交互框架做好, 支持自定义唤醒词 (snowboy 平台), 不过有一点需要了解, 如果想使用自美系统, 需要购买其专用驱动板, 用来驱动扬声器和麦克风. 如下图
这不是广告哈
对了, 有一点需要主要, 对于这类智能语音交互系统, 麦克风的质量真的很重要, 不然都唤醒不了, 那就尴尬了.
开机界面如下 (界面还是很简洁的)
这里主要介绍一下, 二次开发插件的过程, 使用 Python 语言, 代码很简单.
自美文档详细介绍了如何添加插件 (这里直接上代码)
- # encoding: utf-8
- import paho.mqtt.client as mqtt
- from plugin import Plugin
- HOST = "47.98.xxx.58" #EMQ 服务器地址
- PORT = 1883 #端口固定 1883
- MQTT_ID="Client_Test" #自定义客户端
- class Test(Plugin):
- def start(self,name):
- client = mqtt.Client(MQTT_ID)
- client.connect(HOST, PORT, 60)
- if name["data"].count("开")>=1:
- client.publish("LED","1024",2) # 发布一个主题为'LED'
- return {'state':True,'data': "主人, 灯已打开" ,'msg':'','stop':True}
- elif name["data"].count("关")>=1:
- client.publish("LED","0",2) # 发布一个主题为'LED'
- return {'state':True,'data': "主人, 灯已关闭" ,'msg':'','stop':True}
- else:
- return {'state':True,'data': "没有执行任何操作" ,'msg':'','stop':True}
语音控制 Nodemcu 上的一个 LED 演示视频 https://www.bilibili.com/video/av88435517
附加 Nodemcu 的代码 (使用 arduino 平台开发)
- #include <ESP8266WiFi.h>
- #include <PubSubClient.h>
- #include <math.h>
- int pinLED = D2;
- const char* ssid = "123";// 连接的路由器的名字
- const char* password = "12345678";// 连接的路由器的密码
- const char* mqtt_server = "47.98.xxx.58";// 服务器的地址
- const int port=1883;// 服务器端口号
- WiFiClient espClient;
- PubSubClient client(espClient);
- int light=1024;//led 的亮度值
- void setup_wifi() {// 自动连 Wi-Fi 接入网络
- delay(10);
- Wi-Fi.begin(ssid, password);
- while (Wi-Fi.status() != WL_CONNECTED) {
- delay(500);
- Serial.print("hello 8266\n");
- Serial.print("...");
- }
- }
- void callback(char* topic, byte* payload, unsigned int length) {// 用于接收数据
- // 将 char* 转换为 int
- int l=0;
- int p=1;
- for (int i = length-1; i>=0; i--) {
- l+=(int)((char)payload[i]-'0')*p;
- p*=10;
- }
- light=l;// 赋值给 light
- Serial.println(l);
- }
- void reconnect() {// 等待, 直到连接上服务器
- while (!client.connected()) {// 如果没有连接上
- if (client.connect("nodemcu")+random(999999999)) {// 接入时的用户名, 尽量取一个很不常用的用户名
- client.subscribe("LED");// 接收外来的数据时的 intopic
- } else {
- Serial.print("failed, rc=");// 连接失败
- Serial.print(client.state());// 重新连接
- Serial.println("try again in 5 seconds");// 延时 5 秒后重新连接
- delay(5000);
- }
- }
- }
- void setup() {// 初始化程序, 只运行一遍
- pinMode(LED_BUILTIN, OUTPUT);
- Serial.begin(115200);// 设置串口波特率 (与烧写用波特率不是一个概念)
- setup_wifi();// 自动连 Wi-Fi 接入网络
- client.setServer(mqtt_server, port);// 端口号
- client.setCallback(callback); // 用于接收服务器接收的数据
- }
- void loop() {// 主循环
- reconnect();// 确保连上服务器, 否则一直等待.
- client.loop();//MUC 接收数据的主循环函数.
- analogWrite(LED_BUILTIN,1024-light);// 设置 led 亮度
- }
- // 代码是网上下载的, 找不到作者了, 如有侵权联系删除, 谢谢
源码会上传到 GitHub(有需要自行下载)
小白一枚, 欢迎评论指正
来源: https://www.cnblogs.com/meng-he/p/12299452.html