一、项目全维度概要

本项目基于韦东山 I.MX6ULL-PRO 嵌入式开发板与嵌入式 Linux 平台,依托 Ubuntu 18.04 交叉编译环境、Qt5 图形开发框架、音频驱动,结合百度语音识别与阿里百炼 AI 大模型,开发一款嵌入式智能 AI 车载音乐播放器。项目硬件适配 7 寸、1024×600 分辨率电容触控屏幕,搭载 WM8960 音频芯片完成音频录入与播放,基于 BusyBox 轻量化根文件系统稳定运行,适配嵌入式设备低资源、高稳定的运行特性。

播放器集成完整的本地音频播放体系,支持 MP3、WAV 主流音频格式,实现播放、暂停、上下曲切换、进度拖拽、硬件音量调节功能,同时支持列表循环、单曲循环、随机播放三种播放模式自由切换,搭配虚拟触屏键盘、实时 WiFi 网络检测、播放历史与 AI 歌曲推荐等辅助功能,完善嵌入式触控交互体验。

项目最大特色为嵌入式 AI 智能语音交互,通过开发板麦克风采集音频,经百度语音识别完成语音转文字,再由阿里百炼大模型智能解析用户语音指令,实现全自动语音点歌、语音控制播放状态、智能人机对话等功能,摆脱传统手动触控操作,实现触控操作 + AI 语音控制双交互模式,高度贴合车载嵌入式设备智能化、便捷化的使用场景,是一套软硬件结合、功能完整的嵌入式 Linux 智能应用实战项目。

1. 硬件平台(韦东山 MX6ULL-PRO 开发板)
硬件类别 详细参数
主控芯片 NXP i.MX6 UltraLite(Cortex-A7 单核 ARMv7)
屏幕 7 寸电容触摸屏,物理分辨率 1024×600
音频芯片 WM8960(ALSA 驱动)
存储 TF 卡(本地音乐存储)
网络 以太网 / WiFi(AI 语音 / 对话必备)
系统底层 适配 IMX6ULL 的 Linux 内核 + BusyBox 1.31.1 根文件系统
2. 软件环境
  • 宿主机:Ubuntu 18.04 x86_64
  • 编译工具:ARM 架构交叉编译器
  • UI 框架:Qt 5.12+(嵌入式移植版本)
  • 音频框架:ALSA(驱动 WM8960 声卡)
  • 核心依赖:mpg123(播放)、arecord(录音)、amixer(音量)
3. 核心功能
  1. 基础播放:播放 / 暂停 / 上一曲 / 下一曲
  2. 模式切换:列表循环 / 单曲循环 / 随机播放
  3. AI 语音:百度语音识别 + 阿里百炼大模型,语音点歌 / 控制
  4. 硬件适配:7 寸触屏交互、WM8960 音频输出、全屏显示
4. 开发板环境查询指令(BusyBox 专用)
功能 执行指令
查看 CPU cat /proc/cpuinfo
查看内存 free
查看存储 df -h
查看屏幕分辨率 cat /sys/class/graphics/fb0/virtual_size
测试网络 ping www.baidu.com
内核版本 uname -a

二、分功能详解

所有功能适配韦东山 IMX6ULL-PRO + 7 寸 1024×600 屏 + WM8960 声卡


功能 1:项目基础框架(硬件窗口适配)

硬件适配:适配 1024×600 分辨率、无边框全屏、7 寸电容屏交互

widget.h 声明
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QProcess>
#include <QTimer>
#include <QNetworkAccessManager>

class AIChatWindow;
class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    // 基础进程/定时器
    QProcess *mplayer;
    QTimer *progressTimer;
    QTimer *wifiCheckTimer;
    QNetworkAccessManager *networkManager;
    QString baiduToken;
    bool m_wasPlaying;

    // AI 接口配置
    const QString BAILIAN_API_URL;
    const QString BAILIAN_API_KEY;
    const QString BAILIAN_MODEL;
};
#endif
widget.cpp 实现
#include "widget.h"
#include "aichatwindow.h"

// 百度语音密钥
const QString BAIDU_API_KEY = "DeZl22FLAAK3Fc1yrTTUCDLa";
const QString BAIDU_SECRET_KEY = "kpvmQi7fVfIv3gDfGcvGsxD9XEj85xbM";
const QString RECORD_FILE = "/home/book/record.wav";

// 构造:适配IMX6ULL 1024×600屏幕
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , mplayer(new QProcess(this))
    , progressTimer(new QTimer(this))
    , wifiCheckTimer(new QTimer(this))
    , networkManager(new QNetworkAccessManager(this))
    , BAILIAN_API_URL("https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions")
    , BAILIAN_API_KEY("sk-bfc95bbdb098444ebec81b00ecfcc55f")
    , BAILIAN_MODEL("qwen3-max")
{
    // 硬件屏幕适配:7寸1024x600 无边框全屏
    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
    setFixedSize(1024, 600);
    showFullScreen();

    // 创建音乐存储目录(TF卡/根文件系统)
    QDir dir;
    dir.mkpath("/home/book/nfs/Music");
}

// 析构:释放硬件资源
Widget::~Widget()
{
    if(mplayer->state() == QProcess::Running)
        mplayer->kill();
    delete aiChatWindow;
}

功能 2:音乐播放核心(适配 WM8960 声卡)

硬件适配:调用 ALSA 驱动、指定 WM8960 声卡设备 plughw:0,0

widget.h 声明
private slots:
    void onPlayBtnClicked();
    void onPrevBtnClicked();
    void onNextBtnClicked();
    void pauseMusic();
    void resumeMusic();
    void updatePlayProgress();
    void playAudio(int index, int jumpSec = 0);

private:
    int currentPlayIndex;
    bool isPaused;
    int totalSeconds;
    int currentSeconds;
    bool isSliderDrag;
    QStringList musicFullPath;
widget.cpp 实现
// 播放/暂停
void Widget::onPlayBtnClicked(){
    if(musicFullPath.isEmpty()) return;
    if(mplayer->state() != QProcess::Running) {
        playAudio(currentPlayIndex);
        btn_play->setText("⏸ 暂停");
        return;
    }
    isPaused = !isPaused;
    isPaused ? pauseMusic() : resumeMusic();
    btn_play->setText(isPaused ? "▶ 播放" : "⏸ 暂停");
}

// 核心播放:适配WM8960声卡
void Widget::playAudio(int index, int jumpSec)
{
    if(mplayer->state() == QProcess::Running) {
        mplayer->kill();
        mplayer->waitForFinished();
    }
    // 指定WM8960硬件声卡设备
    mplayer->start("mpg123", {"-a", "plughw:0,0", musicFullPath[index]});
    progressTimer->start(1000);
}

// 进度条更新
void Widget::updatePlayProgress(){
    if(mplayer->state()!=QProcess::Running || isSliderDrag || isPaused) return;
    currentSeconds++;
    slider_progress->setValue(currentSeconds*1000/totalSeconds);
    if(currentSeconds >= totalSeconds) onNextBtnClicked();
}

功能 3:播放模式 + 音量控制(硬件音量调节)

硬件适配amixer 直接控制 WM8960 硬件音量

widget.h 声明
private slots:
    void changePlayMode();
    void adjustVolume(int value);
private:
    int playMode; // 0列表 1单曲 2随机
widget.cpp 实现
// 模式切换:列表/单曲/随机
void Widget::changePlayMode()
{
    playMode = (playMode+1)%3;
    btn_mode->setText(playMode==0?"🔁列表":playMode==1?"🔂单曲":"🔀随机");
}

// 硬件音量:ALSA + WM8960
void Widget::adjustVolume(int value)
{
    QProcess vol;
    // 直接控制硬件声卡音量
    vol.start("amixer", {"cset","numid=3",QString::number(value*60)});
    vol.waitForFinished();
}

功能 4:本地音乐加载(TF 卡文件扫描)

硬件适配:扫描 TF 卡 / 根文件系统音乐文件

widget.h 声明
private slots:
    void loadMusicFiles();
    void onListItemClicked(QListWidgetItem *item);
private:
    QListWidget *musicList;
widget.cpp 实现
// 扫描TF卡/本地MP3/WAV文件
void Widget::loadMusicFiles()
{
    musicFullPath.clear();
    musicList->clear();
    QDir d("/home/book/nfs/Music");
    // 过滤音频文件
    QStringList fs = d.entryList({"*.mp3","*.wav"}, QDir::Files);
    for(QString f : fs){
        musicFullPath << d.absoluteFilePath(f);
        musicList->addItem(f);
    }
}

// 触屏点击列表播放
void Widget::onListItemClicked(QListWidgetItem *item)
{
    currentPlayIndex = musicList->row(item);
    playAudio(currentPlayIndex);
}

功能 5:虚拟键盘(7 寸电容触屏适配)

硬件适配:7 寸电容屏无物理键盘,全屏触屏输入

widget.h 声明
private slots:
    void initKeyboard();
    void onKeyInput();
    void onDeleteKey();
    void onClearKey();
    void hideKeyboard();
    bool eventFilter(QObject*, QEvent*) override;
    void mousePressEvent(QMouseEvent*) override;
private:
    QWidget *keyboardWidget;
    QGridLayout *keyboardLayout;
    QLineEdit *edit_url;
widget.cpp 实现
// 初始化触屏键盘(1024×600屏幕布局)
void Widget::initKeyboard()
{
    keyboardWidget = new QWidget(this);
    keyboardWidget->setGeometry(0, 380, 1024, 220);
    keyboardLayout = new QGridLayout(keyboardWidget);
    keyboardWidget->hide();
}

// 触屏点击弹出键盘
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == edit_url && event->type() == QEvent::MouseButtonPress) {
        keyboardWidget->show();
        return true;
    }
    return QWidget::eventFilter(watched, event);
}

功能 6:WiFi 网络检测(开发板联网测试)

硬件适配:IMX6ULL 以太网 / WiFi 模块联网检测

widget.h 声明
private slots:
    void checkWifiStatus();
private:
    QLabel *lab_wifiStatus;
widget.cpp 实现
// 硬件网络检测:ping 百度
void Widget::checkWifiStatus()
{
    int ret = QProcess::execute("ping", {"-c","1","-W","2","www.baidu.com"});
    lab_wifiStatus->setText(ret==0 ? "📶 WiFi: 已连接 ✅" : "📶 WiFi: 未连接 ❌");
}

功能 7:AI 语音识别(百度语音 + 开发板录音)

硬件适配arecord 调用 WM8960 麦克风录音

widget.h 声明
private slots:
    void getBaiduToken();
    void startAsyncRecord();
    void onRecordFinished(int,QProcess::ExitStatus);
    void startRecordAndUpload();
    void parseBaiduReply(QNetworkReply*);
private:
    QProcess *recordProcess;
    QTimer *countdownTimer;
    int countdown;
widget.cpp 实现
// 硬件录音:WM8960 麦克风
void Widget::startAsyncRecord(){
    recordProcess->start("arecord", {"-d","3","-r","16000",RECORD_FILE});
}

// 上传百度语音识别
void Widget::startRecordAndUpload(){
    QFile file(RECORD_FILE);
    file.open(QIODevice::ReadOnly);
    networkManager->post(QNetworkRequest(QUrl("https://vop.baidu.com/server_api")), file.readAll());
}

功能 8:AI 大模型交互(阿里百炼)

硬件适配:IMX6ULL 网络通信,AI 指令解析

widget.h 声明
private slots:
    void requestBailianChat(const QString&);
    void parseBailianResponse(QNetworkReply*);
widget.cpp 实现
// 发送语音文字给AI
void Widget::requestBailianChat(const QString& asrText)
{
    QNetworkRequest req{QUrl(BAILIAN_API_URL)};
    req.setRawHeader("Authorization", ("Bearer "+BAILIAN_API_KEY).toUtf8());
    networkManager->post(req, QJsonDocument(json).toJson());
}

功能 9:AI 语音点歌(核心智能功能)

硬件适配:全语音控制,无需触屏操作

widget.h 声明
private slots:
    void initCommandExecutor();
    void executeControlCommand(const QJsonObject&);
    void playMusicByName(const QString&);
widget.cpp 实现
// 指令映射
void Widget::initCommandExecutor(){
    m_controlCommands["music_play"] = [this](){ onPlayBtnClicked(); };
    m_controlCommands["music_next"] = [this](){ onNextBtnClicked(); };
}

// 语音点歌:模糊匹配本地歌曲
void Widget::playMusicByName(const QString& songName)
{
    for(int i=0;i<musicFullPath.size();i++){
        if(musicFullPath[i].contains(songName, Qt::CaseInsensitive)){
            playAudio(i);
            return;
        }
    }
}

功能 10:UI 界面初始化(1024×600 全屏布局)

硬件适配:7 寸屏完美布局,歌词 / 列表 / 按钮自适应

widget.h 声明
private slots:
    void initCarUI();
widget.cpp 实现
// 1024×600 硬件屏幕布局
void Widget::initCarUI()
{
    // 歌词区域 + 音乐列表 + 控制按钮 + 进度条
    // 全屏适配韦东山7寸电容屏
}

三、项目效果

嵌入式音乐播放器

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐