M-Design设计竞赛 -基于ESP32S3的语音唤醒AI助手
该项目使用了esp32s3和其他附属元件,实现了语音唤醒的ai助手的设计,它的主要功能为:通过mic接收语音,转文字后发送到大模型,回复的内容通过tts进行语音输出,从而实现AI对话。。
标签
嵌入式系统
ai大模型
M-Design创意设计
xusp99
更新2025-04-01
56

1. 项目简介

本项目是参加2025贸泽电子M-Design创意设计竞赛的方向一:边缘智能、智能设备旨在利用ESP32S3开发板开发一个语音助手,主要的功能如下:

  • 通过语音模块进行语音唤醒
  • 录音后进行大模型对话
  • 最后的文字进行tts转换为语音进行播放
  • 对话内容通过TTF模块进行文字显示
  • 可以播放网络广播

2.整体流程图

3.硬件介绍

核心微控制器:ESP32-S3
ESP32-S3 是一款集成 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE) 的 MCU 芯片,支持远距离模式 (Long Range)。ESP32-S3 搭载 Xtensa 32 位 LX7 双核处理器,主频高达 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管脚和丰富的通信接口。

ESP32-S3 支持更大容量的高速 Octal SPI flash 和片外 RAM,支持用户配置数据缓存与指令缓存。Xtensa 32 位 LX7 双核处理器,主频高达 240 MHz内置 512 KB SRAM、384 KB ROM 存储空间,并支持多个外部 SPI、Dual SPI、 Quad SPI、Octal SPI、QPI、OPI flash 和片外 RAM额外增加用于加速神经网络计算和信号处理等工作的向量指令 (vector instructions)45 个可编程 GPIO,支持常用外设接口如 SPI、I2S、I2C、PWM、RMT、ADC、UART、SD/MMC 主机控制器和 TWAITM 控制器等,基于 AES-XTS 算法的 Flash 加密和基于 RSA 算法的安全启动,数字签名和 HMAC 模块,“世界控制器 (World Controller)”模块

ASRPRO是一款专注于中文语音识别与合成的离线模块,支持语音指令控制、多场景应用及硬件扩展。以下是其核心功能和应用特点:

支持中文语音转文字,并通过AI合成自然语音输出,具备多语种识别和场景适配能力‌

采用离线模式运行,需预先下载语言模型到本地,仅支持预设指令识别,无法实现任意语音识别‌

提供3组串口(UART0用于程序升级,UART1/UART2用于外部通讯),支持3.3V电平,建议外接5V上拉电阻以提高稳定性‌

支持IIC协议扩展外设,如通过PCA9685模块增加GPIO端口,解决引脚不足问题‌


4.软件介绍

使用了asrpro进行唤醒操作,当识别到语音“家家同学”,系统被唤醒,扬声器播放我在的声音。系统进入录音状态

void ASR_CODE(){
switch (snid) {
case 0:
Serial.println("识别到 0号 唤醒词");
digitalWrite(2,0);
Serial.println("已设为低电平!");
delay(300);
digitalWrite(2,1);
break;
}
}
void setup()
{
setPinFun(13,SECOND_FUNCTION);
setPinFun(14,SECOND_FUNCTION);
Serial.begin(9600);
Serial.println("模块已成功上电!");
//{ID:0,keyword:"唤醒词",ASR:"家家同学",ASRTO:""}
setPinFun(2,FIRST_FUNCTION);
pinMode(2,output);
}

通过识别唤醒词进行后续对话操作

  // 检测按键是否按下
    if (audio2.isplaying == 0 && Answer == "" && subindex == subAnswers.size() && conflag == 1)
    {
        conflag = 0;
        Serial.print("loopcount:");
        Serial.println(loopcount);
        loopcount++;
        // 停止播放音频
        audio2.isplaying = 0;
        startPlay = false;
        isReady = false;
        Answer = "";
        flag = 0;
        subindex = 0;
        subAnswers.clear();
        // answerTemp = "";
        // text.clear();
        printf("Start recognition2\n");


        adc_start_flag = 1;


        // 如果距离上次时间同步超过4分钟
        if (urlTime + 240000 < millis()) // 超过4分钟,重新做一次鉴权
        {
            // 更新时间戳
            urlTime = millis();
            // 从服务器获取当前时间
            getTimeFromServer();
            // 更新WebSocket连接的URL
            url = getUrl("ws://spark-api.xf-yun.com/v4.0/chat", "spark-api.xf-yun.com", "/v4.0/chat", Date);
            url1 = getUrl("ws://iat-api.xfyun.cn/v2/iat", "iat-api.xfyun.cn", "/v2/iat", Date);
        }


        // 连接到WebSocket服务器1
        ConnServer1();


        adc_complete_flag = 0;
    }


语音识别和大模型在讯飞进行注册和申请,

进行录音并把数据发送到讯飞语音转文字接口

            // 处理第一帧音频数据
            if (firstframe == 1)
            {
                data["status"] = 0;
                data["format"] = "audio/L16;rate=8000";
                data["audio"] = base64::encode((byte *)audio1.wavData[0], 1280);
                data["encoding"] = "raw";
                j++;

                JsonObject common = doc.createNestedObject("common");
                common["app_id"] = appId1;
                JsonObject business = doc.createNestedObject("business");
                business["domain"] = "iat";
                business["language"] = "zh_cn";
                business["accent"] = "mandarin";
                business["dwa"] = "wpgs";
                business["vad_eos"] = 1000;

                String jsonString;
                serializeJson(doc, jsonString);

                webSocketClient1.send(jsonString);
                firstframe = 0;
                delay(40);
            }

需要更新的密码及相关token

//wifi密码
String ssid ="XXXXXXXX";
String password = "XXXXXXXX";

// 讯飞websocket调用stt和大模型服务的参数
String APPID = "xxxxxxxxx";                             // App ID,必填
String APISecret = "xxxxxxxxxx"; // API Secret,必填
String APIKey = "xxxxxxxxxxxx";    // API Key,必填

//mqtt
const char* mqtt_server = "xxx.com";//默认,MQTT服务器
const int mqtt_server_port = 9501;//默认,MQTT服务器
#define ID_MQTT  "XXXXXXX"     //修改,你的Client ID
const char*  topic = "XXXXXX";  //主题名字,可在巴法云控制台自行创建,名称随意
WiFiClient espClient;
PubSubClient client(espClient);


5.功能演示

系统上电,初始化完成后,连接网络,显示初始信息,唤醒后进行对话。

通过巴法云进行mqtt连接,可以控制ai助手进行播放网络广播

具体参见bilibili上的视频


6. 心得体会

通过本次活动,加深了对嵌入式开发的理解,感谢硬禾学堂提供的训练机会,本次活动使我受益良多。

附件下载
esp32AI.zip
团队介绍
热心的嵌入式开发者
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号