扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

智能语音控制系统中的关键角色:i.MX8MP 客户端设计深度解析

03/27 16:11
185
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

物联网和人工智能快速发展的今天,语音控制已经成为人机交互的主流方式之一。本文将通过一个真实落地的项目案例,详细解读 i.MX8MP LPDDR4 EVK 如何在基于百度云的语音控制系统中扮演客户端角色,实现远程设备的智能控制。

资料获取:【应用笔记】LAT1167 STM32G474 HRTIME PWM 丢波问题分析与解决

1. 系统架构概述

整个系统以 NXP RT106L/S 本地语音识别芯片为核心,构建了一个完整的语音控制生态。RT106L/S 芯片在本地就能完成唤醒词和语音命令的识别,无需将语音数据上传云端,既保证了响应速度,也兼顾了数据隐私。

当用户说出“小恩小恩”时,SLN-LOCAL/2-IOT 开发板被唤醒并回应“小恩来了,请吩咐”。随后用户可以说出各种控制命令,比如“开红灯”“关绿灯”“灯闪烁”等。这些命令一部分用于控制本地设备,另一部分则通过网络传输,实现远程控制

其中,“开远程灯”“关远程灯”“开音乐”“关音乐”“开显示”“关显示”这六条命令,正是通过 MQTT 协议和百度云平台,传递给远端的 i.MX8MP LPDDR4 EVK 和 MIMXRT1060-EVK 开发板,完成跨设备的协同控制。

2. i.MX8MP 在系统中的角色定位

i.MX8MP LPDDR4 EVK 在这套系统中充当的是“远程客户端”的角色。它通过有线或无线网络接入互联网,订阅百度云平台上特定主题的数据。当本地语音识别系统识别到远程控制命令时,会向百度云发布一条 JSON 格式的控制消息,而 i.MX8MP 作为订阅者,会实时收到这条消息,解析后执行相应的动作。

这种架构的优势在于:语音识别的处理放在本地,响应更快;而控制指令通过云端转发,实现了跨设备的联动。i.MX8MP 强大的多媒体处理能力,使其不仅能够执行简单的开关控制,还可以完成视频播放等复杂任务。

3. MQTT 协议与 Mosquitto 的选择

在物联网通信协议的选择上,MQTT 无疑是轻量级、可靠且广泛应用的方案。它基于发布/订阅模型,非常适合带宽有限、网络不稳定的场景。

项目中采用了 Mosquitto 作为 MQTT 协议的实现。Mosquitto 不仅支持作为消息的发布者和订阅者,还可以充当服务器,功能全面且稳定。对于 i.MX8MP 而言,它只需要作为客户端,通过 MQTT 协议连接到百度云服务器,订阅特定主题,等待云端推送控制指令即可。

4. 开发环境搭建与系统编译

硬件平台选用 i.MX8MP LPDDR4 EVK 开发板,搭配 HDMI 显示屏;软件方面使用 NXP 官方提供的 Linux BSP 版本 LF6.1.1_1.0.0,在 Ubuntu 20.04 环境下进行 Yocto 项目编译。

编译过程大致分为以下几个步骤:

  1. 安装依赖包:包括 gawk、wget、git-core、python3 等必要的工具链。
  2. 配置 Repo 工具:Repo 是 Google 开发的 Git 仓库管理工具,用于管理多个 Git 仓库。将其添加到 PATH 环境变量中,方便后续使用。
  3. 设置 Git 用户信息:配置 user.name 和 user.email,用于版本提交记录。
  4. 下载 BSP 源码:通过 repo init 和 repo sync 命令,同步 NXP 官方的 i.MX Linux BSP 代码库。
  5. 编译 i.MX8MP 镜像:设置 DISTRO 为 fsl-imx-wayland,MACHINE 为 imx8mp-lpddr4-evk,执行 bitbake imx-image-full 进行编译。

整个编译过程耗时较长,最终会在 buildwayland 目录下生成可烧写的镜像文件。

5. 集成 MQTT 功能到系统中

为了让 i.MX8MP 具备 MQTT 通信能力,需要在 Yocto 编译配置中添加 mosquitto 包。具体操作是:在 local.conf 文件中添加一行 IMAGE_INSTALL:append = "mosquitto",然后重新编译系统镜像。

这一步骤虽然简单,但至关重要。它确保了编译出的系统镜像中已经包含了 Mosquitto 客户端工具,后续可以直接在开发板上使用 mosquitto_sub 和 mosquitto_pub 命令进行 MQTT 通信。

6. 镜像烧写与系统启动

编译完成后,使用 NXP 提供的 UUU 工具将镜像烧写到 i.MX8MP LPDDR4 EVK 的 eMMC 存储中。烧写前需要将开发板的 BOOT MODE 设置为下载模式(SW4 拨码开关配置为 0001),烧写完成后切换回启动模式(0010)。

系统启动后,通过串口终端可以看到完整的启动日志,确认系统正常启动、网络接口初始化成功。

7. MQTT 功能测试与联调

在正式集成应用之前,先进行 MQTT 功能的基础测试。将 i.MX8MP 开发板接入路由器,确保能够访问公网。使用 mosquitto_sub 命令订阅百度云平台上的特定主题:

mosquitto_sub -h "akxflk.iot.gz.baidubce.com" -u "thingidp@akxflk|RT1060BTCDShadow|0|SHA256" -P "60859bbc10e4e32023bae0f232e4dcc0cdcef217f0188054fd1ac20bc3f1a9e" -t "$iot/RT1060BTCDShadow/user/LEDStatus" -p 1883

如果连接正常,开发板会进入等待状态,随时准备接收云端推送的消息。

8. 应用代码实现与调试

从 GitHub 下载 Mosquitto 源码后,重点修改 sub_client.c 文件,实现消息解析和动作执行的逻辑。

代码的核心是对 JSON 格式的 payload 进行解析,判断 display 字段的值。如果 display 为 true,则调用系统命令播放指定路径的视频文件;如果为 false,则输出相应的日志信息。

这里有一个关键细节值得分享:JSON 字符串在代码中的匹配必须使用转义后的格式。例如,{"reported":{"LEDstatus":false,"voice":false,"display":true}} 在 C 语言字符串中需要写成 "{\"reported\":{\"LEDstatus\":false,\"voice\":false,\"display\":true}}"。如果这个细节处理不当,字符串比较就会失败,导致无法正确响应指令。这也是项目调试过程中花费较长时间的地方。

播放视频的命令如下:

system("/usr/bin/gst-play-1.0 /home/root/client/ChinaTest1.mp4");

这里使用了 GStreamer 框架中的 gst-play-1.0 工具,它能够直接播放本地视频文件,并将画面输出到 HDMI 显示屏上。

9. 联调测试与效果验证

所有准备工作完成后,进入最终的联调测试阶段。语音识别端通过唤醒词触发远程控制命令,云端将指令推送给 i.MX8MP 客户端。开发板收到消息后,成功解析出 display:true,随后调用播放器在 HDMI 屏幕上播放测试视频。

整个过程从语音指令发出到视频开始播放,延时控制在可接受范围内,验证了整个系统架构的可行性和稳定性。

通过这个项目,我们可以清晰地看到 i.MX8MP 在智能语音控制系统中的定位和价值。它不再只是一个单纯的嵌入式处理器,而是作为物联网生态中的一个节点,通过 MQTT 协议与云端和其他设备协同工作。

这种基于云端转发、本地处理的架构,具有很好的扩展性。未来可以在此基础上增加更多远程控制功能,比如调整屏幕亮度、播放指定曲目、推送通知等。同时,i.MX8MP 强大的多媒体处理能力,也为更丰富的交互方式(如音视频通话、多屏互动)提供了硬件基础。

对于从事嵌入式 Linux 和物联网开发的工程师来说,这个案例不仅展示了 MQTT 协议的实际应用,也提供了一个完整的从编译、烧写到应用开发的工程实践参考。

相关推荐