注:本教程属于功能验证性质

思维导图:

Ubuntu espeak语音包 ubuntu 语音助手_物联网

1、搭建MQTT服务器(腾讯云为例)

  1. 购买云服务器,镜像选择为ubuntu系统,服务器的概要页面的网络信息栏中点击管理规则,自行添加8083、1883、18083端口,(详情查看EMQX的文档说明:链接,其中18083为web控制端:链接)。
  2. 设置云服务器的登陆密码,腾讯云的ubuntu默认不能使用root用户,需修改(参考:链接))。
  3. ssh连接云服务器,在emqx的文档中找到shell脚本安装命令(链接))安装完成后启动EMQX服务(后台启动:链接)。
  4. 浏览器中输入 服务器公网ip+:18083 访问,默认账户admin,密码public在设置中更换中文显示,点击工具栏的Websocket,点击连接。
  5. 打开MQTT.fx,新建连接,测试发送消息是否能成功接收。

2、购买域名并配置SSL证书到MQTT服务器

(该部分参考emqx的文档说明)

  1. 购买域名后添加域名解析(mqtt.域名),再在域名解析中添加解析记录,类型为TXT,验证…
  2. 下载证书,选择“其他”,解压出后缀为.key和.pem的两个文件,修改为mqtt.key,mqtt.pem,将两个文件复制到服务器的 /bin/etc/emqx/certs 目录下。
  3. 修改nano /etc/emqx/emqx.conf文件,在emqx文档中找到要修改的配置项(链接)):
  • listener.ssl.external.keyfile:指定SSL的私钥文件。
  • listener.ssl.external.certfile:指定SSL的证书文件。
  • listener.ssl.external.cacertfile:指定 SSL 的 CA 证书文件。

将文件名修改为mqtt.key,mqtt.pem,然后重启emqx服务。

3、esp8266测试

arduino代码:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// WiFi
const char *ssid = "luobo"; //WiFi name
const char *password = "88888888";  //WiFi password

// MQTT Broker
const char *mqtt_broker = "mqtt.luomingxiong.xyz"; //域名或IP地址
const char *topic = "esp8266/led";	//topic
const char *mqtt_username = "admin";	//默认为admin
const char *mqtt_password = "public";
const int mqtt_port = 1883;		//1883端口

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
    // Set software serial baud to 115200;
    Serial.begin(115200);
    pinMode(LED_BUILTIN, OUTPUT);
    // connecting to a WiFi network
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.println("Connecting to WiFi..");
    }
    Serial.println("Connected to the WiFi network");
    //connecting to a mqtt broker
    client.setServer(mqtt_broker, mqtt_port);
    client.setCallback(callback);
    while (!client.connected()) {
        String client_id = "esp8266-client-";
        client_id += String(WiFi.macAddress());
        Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str());
        if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
            Serial.println("Public emqx mqtt broker connected");
        } else {
            Serial.print("failed with state ");
            Serial.print(client.state());
            delay(2000);
        }
    }
    // publish and subscribe
    client.publish(topic, "hello emqx");
    client.subscribe(topic);
}

void callback(char *topic, byte *payload, unsigned int length) {
    Serial.print("Message arrived in topic: ");
    Serial.println(topic);
    Serial.print("Message:");
    String message;
    for (int i = 0; i < length; i++) {
        message = message + (char) payload[i];  // convert *byte to string
    }
    Serial.print(message);
    if (message == "on") { digitalWrite(LED_BUILTIN, LOW); }   // LED on
    if (message == "off") { digitalWrite(LED_BUILTIN, HIGH); } // LED off
    Serial.println();
    Serial.println("-----------------------");
}

void loop() {
    client.loop();
}

复制到arduino IDE,下载的esp8266中,通过Websocket测试(域名+:18083),主题为esp8266/led,发送on开灯,off关灯

4、Linux下QT导入MQTT模(源码移植)

参考:链接 测试程序:

  • 创建界面
  • 编写代码
    单击连接按钮的槽函数:
void Widget::on_connectBt_clicked()
{
    mqtt = new QMQTT::Client(QHostAddress(QString(ui->hostLe->text())),ui->portLe->text().toInt());
    connect(mqtt, SIGNAL(connected()), this, SLOT(mqtt_connect_success()));
    connect(mqtt, SIGNAL(disconnected()), this, SLOT(mqtt_disconnect()));
    connect(mqtt, SIGNAL(subscribed(QString,quint8)), this, SLOT(mqtt_sub_success()));
    connect(mqtt, SIGNAL(received(QMQTT::Message)), this, SLOT(mqtt_recv_msg(QMQTT::Message)));

    mqtt->setClientId("Qt-test0x10");	//客户端ID,任取
    mqtt->setUsername("admin");			//EMQx的默认用户名
    mqtt->setPassword("public");		//EMQx的默认密码

    mqtt->setCleanSession(true);
    mqtt->connectToHost(); //连接mqtt
}
  • 测试
    输入云服务器的ip地址、端口、主题,点击连接,订阅,发布:

    EMQx的后台连接:

    成功接收到“hello”

    完整工程代码:

5、Linux安装QT for Android

安装参考链接

需要注意的地方:

  • 版本尽量与参考链接里的保持一致,否则会有很多问题,特别是QT的版本
  • Ubuntu espeak语音包 ubuntu 语音助手_开发板_02

  • 多次尝试均失败后(一直报错:”All essential packages installed …“)。百度了一圈链接,原来是在某个文件中显示安装的安卓环境是只支持Qt5.12.[0-5]以及5.13.[0-1]的,而我原来用的版本是5.12.9,这点在官方文档中并没有说明。
  • 在配置环境变量的时候,如果修改后仍有问题,就在~/.bashrc中同样配置一次,并且执行source ~/.bashrc命令让配置生效。
  • 如果在打开安卓模拟器时提示/dev/kvm device:permission denied,参考链接解决。

6、esp8266与手机APP通信

手机APP测试:

Ubuntu espeak语音包 ubuntu 语音助手_开发板_03


手机APP的订阅主题与esp8266代码中保持一致,即可通过手机APP发送”on“,”off“控制LED灯亮灭。

7、语音唤醒及识别

  1. 硬件部分:使用夸克开发板(全志H3芯片,也可使用树莓派或者其他能运行ubuntu的开发板)。
  2. 软件部分:参考开源项目wukong-robot(链接)

8、“小爱同学”离线唤醒关键词训练

离线唤醒关键词的识别使用的是一个开源引擎叫snowboy,但官方在2021年之后就关闭了线上训练功能,因此需要把源码下载到自己的ubuntu系统中进行本地训练关键词模型。snowboy源码地址,详细步骤可参考github中的文档说明。

注意:在开发板上搭建训练的环境可能会报错,因此建议在电脑的ubuntu系统中搭建(一定要是16版本的)。搭建好后用开发板录制音频,然后通过电脑训练出模型。 [参考链接](snowboy本地模型训练 基于树莓派4b | Never的个人博客

9、wukong通过mqtt控制esp8266

  • wukong-robot的安装与配置参考文档。
  • esp8266的代码参考wukong-robot文档。

10、wukong-robot与app控制esp8266

Ubuntu espeak语音包 ubuntu 语音助手_物联网_04

  • 将订阅主题和发布主题修改为“开发板一”,发送“开灯”,“关灯”或者“on”,“off”即可控制esp8266的灯亮灭
  • 通过语音识别“开灯”,“关灯”也可控制灯亮灭。

11、通过hass控制小米、华为、苹果等智能家居设备

待补充。。。