基于 i.MX6ULL 架构的智能语音交互终端【嵌入式linux应用开发项目】

前情提要

本项目是我在深入学习嵌入式 Linux 应用开发过程中的独立动手做的一个小项目。项目原型借鉴了正点原子的语音识别项目的 Demo,但在后续开发过程中,独立完成了功能扩展演进的全过程。涵盖了线程调度、MQTT 协议、系统/网络编程以及嵌入式系统资源分配等诸多底层知识。目前,项目已由单一的本地控制演进为一个具备端云协同能力的完整 AIoT 系统。细节上可能还不够完美,后续有时间会慢慢优化,以及该项目开发细节后续系列也会更新可以先关注,欢迎交流学习。【源码链接在最后】

项目简介

本项目是一款集成 AI 语音识别、多维环境感知、端云协同控制于一体的嵌入式边缘智能终端。系统基于 Qt/C++ 框架开发,适配 i.MX6ULL 工业级处理器,旨在构建一个高性能、低延迟的 AIoT(人工智能物联网)交互节点。

功能特点

🎤 语音交互

  • 基于百度云语音识别API的实时语音识别
  • 支持中文语音命令识别,支持“开灯”、“关灯”、“播放音乐”、“环境数据查询”等多种场景化指令
  • 直观的语音交互界面(GIF动画反馈)
    在这里插入图片描述

☁️ 云端远程控制

  • 双向同步:基于 MQTT 协议接入中国移动 OneNET Studio 平台
  • 状态上报:环境数据(光照、红外、接近距离)自动上报云端,支持手机 App 实时查看。
  • 远程控制:支持手机端APP远程设备控制(LED、蜂鸣器、音乐播放器)
  • 物模型对齐:完整实现 OneNET OneJson 协议,支持 set_reply 与 post_reply 响应机制。
    在这里插入图片描述

💡 硬件控制

  • LED灯开关控制
  • 蜂鸣器报警控制
  • 音乐播放器控制
  • 可扩展支持多种硬件设备
    在这里插入图片描述

🌡️ 环境感知与性能优化

  • AP3216C传感器数据采集(光照强度、接近距离、红外数据)
  • 多线程架构:传感器采集在独立线程运行,确保 GUI 响应优先级。
  • 实时环境数据显示
    在这里插入图片描述

🎵 音频播放

  • 支持语音控制音乐文件播放
  • 循环播放、暂停、上一曲/下一曲切换等功能
  • 自动扫描应用目录下的myMusic文件夹

📱 用户界面

  • 现代化简洁UI设计
  • 语音识别状态实时反馈
  • 传感器数据可视化显示
  • 音乐播放状态和当前曲目显示
    在这里插入图片描述

硬件要求

  • 基于正点原子i.mx6ull alpha开发板(支持Linux/Qt运行环境)
  • AP3216C环境传感器
  • LED灯(或其他可控制硬件)
  • 音频输入设备(麦克风)
  • 音频输出设备(扬声器或耳机)

软件依赖

  • Qt 5.12+ (支持Widgets模块)
  • GCC/G++编译器
  • 百度云语音识别API密钥
  • Linux系统(支持sysfs硬件访问)

项目结构

  • 02_asr_demo/:主应用程序代码
  • -mainwindow.h:主窗口头文件
  • -mainwindow.cpp:主窗口代码
  • beep/:蜂鸣器控制代码
  • led/:LED灯控制代码
  • asr/:语音识别模块代码
  • sensor/:传感器数据采集代码
  • musicplayer/:音频播放控制代码
  • mqttclient/:MQTT客户端通信代码
  • myMusic/:音乐文件存储目录

安装与编译

1. 克隆项目

git clone https://github.com/your-username/VoiceControl-SmartDevice.git
cd VoiceControl-SmartDevice

2. 配置百度云API密钥

asr/asr.cpp 文件中配置您的百度云API密钥:

// 关键:替换为您的百度云API密钥!!!!
QString apiKey = "your_api_key";
QString secretKey = "your_secret_key";

3. 配置OneNET云端参数

使用工具生成 设备级 Token(资源路径需包含 devices/device_name)
确保 OneNET 控制台定义的标识符(Identifier)与代码中的 als、ir、led 完全一致。
mqttclient/mqttclient.h 文件中配置您的OneNET设备参数:

// 替换为您自己的OneNET设备参数
const QString m_productId = "your_product_id";
const QString m_deviceName = "your_device_name";
const QString m_token = "your_device_token";

4. 添加音乐文件

将WAV格式的音乐文件复制到 myMusic/ 目录下。

5. 编译项目

使用Qt Creator打开 02_asr_demo/02_asr_demo.pro 文件,然后点击"构建"按钮。

或者使用命令行编译:

cd 02_asr_demo
qmake
make

使用说明

1. 启动应用

运行编译生成的可执行文件:

./02_asr_demo

在正点原子 I.MX6U 开发板上运行此录音程序,需要先配置是麦克风(板子上的麦头)。麦头录音,则在板子上运行开启麦头录音的脚本:/home/root/shell/audio/mic_in_config.sh

2. 语音交互

  • 点击屏幕中央的GIF动画开始说话
  • 等待"正在听您说话"提示
  • 说出语音命令,如:
    • 硬件控制
      • “开灯” - 控制LED灯开启
      • “关灯” - 控制LED灯关闭
      • “报警”/“鸣笛” - 触发蜂鸣器报警
    • 环境查询
      • “环境数据”/“光照强度如何”/“传感器数据” - 查询所有环境传感器数据
    • 音乐控制
      • “播放音乐”/“播放歌曲” - 开始播放音乐
      • “暂停音乐”/“暂停歌曲” - 暂停播放
      • “停止音乐”/“停止歌曲” - 停止播放
      • “下一首”/“下一曲” - 播放下一首
      • “上一首”/“上一曲” - 播放上一首

3. 云端远程控制

  • 通过OneNET平台或手机APP远程控制设备
  • 支持远程开关LED、蜂鸣器、音乐播放器
  • 实时查看设备状态和传感器数据
  • 设备状态变化会同步至云端

4. 查看环境数据

当识别到环境数据查询命令时,系统会:

  • 自动启动传感器数据采集线程
  • 在UI上显示实时环境数据(光照强度、接近距离、红外数据)
  • 数据显示7秒后自动隐藏

核心功能实现

语音识别流程

  1. 用户点击界面启动录音
  2. 音频录制模块捕获音频数据
  3. 语音识别模块将音频发送到百度云API
  4. 接收并解析识别结果
  5. 根据识别结果执行相应操作(硬件控制或数据查询)

多线程环境数据采集

// SensorThread::run() 核心实现
void SensorThread::run() {
    while (m_isRunning) {
        // 采集传感器数据
        m_sensor->updateSensorData();
        
        // 获取并存储最新数据
        m_alsData = m_sensor->alsData();
        m_psData = m_sensor->psData();
        m_irData = m_sensor->irData();
        
        // 发送数据更新信号
        emit sensorDataUpdated();
        
        // 控制采集频率
        msleep(m_updateInterval);
    }
}

模块化设计

项目采用模块化架构,每个功能模块独立封装:

  • asr模块:语音识别功能
  • audiorecorder模块:音频录制功能
  • led模块:LED控制功能
  • sensor模块:环境传感器功能

扩展指南

添加新的硬件控制

  1. 创建新的硬件控制模块(参考led模块结构)
  2. 实现硬件控制类
  3. 在MainWindow中集成新模块
  4. 在onAsrReadyData()中添加语音命令处理逻辑

支持新的传感器

  1. 在sensor模块中添加新传感器驱动
  2. 扩展SensorThread支持新传感器数据采集
  3. 更新UI显示逻辑

添加音乐文件

  1. 将WAV格式的音乐文件复制到myMusic/目录
  2. 程序会自动扫描并添加到播放列表中
  3. 用户可以在音乐控制命令中使用添加的音乐文件

项目依赖

模块 依赖项 版本要求
核心框架 Qt 5.12+
语音识别 百度云API -
硬件访问 Linux sysfs -
编译工具 GCC/G++ 4.8+

联系方式

如有问题或建议,请通过以下方式联系:

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐