啥?你想diy一個智能音箱,來吧


沒錯,這是智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(有需要自行下載

小白一枚,歡迎評論指正


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM