啥?你想diy一個智慧音箱,來吧
阿新 • • 發佈:2020-02-12
沒錯,這是智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(有需要自行下載)
小白一枚,歡迎評論指正