啥?你想diy一个智能音箱,来吧
阅读原文时间:2023年07月15日阅读:1

没错,这是智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 演示视频

附加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() {//自动连WIFI接入网络
  delay(10);
  WiFi.begin(ssid, password);
  while (WiFi.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();//自动连WIFI接入网络
  client.setServer(mqtt_server, port);//端口号
  client.setCallback(callback); //用于接收服务器接收的数据
}

void loop() {//主循环
   reconnect();//确保连上服务器,否则一直等待。
   client.loop();//MUC接收数据的主循环函数。
   analogWrite(LED_BUILTIN,1024-light);//设置led亮度
}

//代码是网上下载的,找不到作者了,如有侵权联系删除,谢谢

源码会上传到Github(有需要自行下载

小白一枚,欢迎评论指正