ESP32 AI 机器人入门教程从原理到实现【免费开源可商用】–ESP-AI

ESP32 AI 机器人入门教程从原理到实现–ESP-AI

基础原理

ESP-32 S3 N16R8
  1. 芯片概述
    ESP32-S3 N16R8 是乐鑫(Espressif)推出的高性能 Wi-Fi & Bluetooth 5 (LE) 双模物联网 SoC,专为低功耗、高算力场景设计。其命名规则中:
    N16:内置 16MB SPI Flash,用于程序存储和文件系统。
    R8:集成 8MB PSRAM(伪静态随机存储器),支持高速数据缓存。
    核心定位:适用于语音交互、边缘 AI 及复杂 IoT 应用(如智能音箱、工业控制器)。
  2. 特点
    ·1 AI 加速单元:向量指令扩展(Vectored ISA):加速 MFCC 特征提取、神经网络推理(如 WakeNet 唤醒模型)。FFT 硬件加速器:优化音频频域分析,降低语音处理延迟。
    ·2 音频接口:I2S/PCM:支持数字麦克风、音频编解码器(如 ES8388)。
    PDM 接口:直接连接模拟麦克风阵列,支持波束成形。
    ·3 通用接口:34 个可编程 GPIO:支持 SPI(80MHz)、I2C(1MHz)、UART(5Mbps)等协议。USB OTG:支持设备/主机模式,用于固件烧录或外接存储。
    ·4 动态电压频率调节(DVFS):根据负载自动调整 CPU 频率(80-240MHz),平衡性能与功耗。

那么显而易见可以的出ESP32-S3 N16R8 凭借 双核高性能 CPU + 大容量存储 + 硬件 AI 加速,成为语音交互及复杂 IoT 应用的理想选择。其低功耗设计、丰富外设及安全特性,尤其适用于需本地语音处理(如离线唤醒)的场景。开发者可通过 ESP-IDF 快速构建从传感器到云端的完整解决方案,同样可以通过Arduino进行开发,Arduino针对新手开发者快速上手学习,可以快速进行原型开发。

语音唤醒
1. ESP-SR

乐鑫官方提供了 ESP-SR (Speech Recognition)语音识别框架,包含唤醒词引擎(WakeNet)、命令词识别(MultiNet)等组件。其中唤醒词功能用于在设备待机时持续监听音频流,当检测到特定的唤醒词时触发设备进入对话/识别状态。例如,我们可以将“小明同学”设定为唤醒词。当 ESP32 运行 WakeNet 模型时,它会不断从麦克风录制音频并计算梅尔频谱倒谱系数(MFCC)等特征,然后通过一个针对 ESP32-S3 优化的神经网络算法对特征进行分类。参考文档

2.ASRPRO

ASRPRO语音模块是一种智能离线语音识别模块,设计适合用于DIY领域,开放用户设定命令此界面。内置脑神经网络处理器,支持DNN/TDNN/RNN等神经网络及卷积运算硬件运算,支持语音识别、声纹识别、语音增强、语音检测、单麦克风降噪增强等等功能。ASRPEO通过图像编程,让唤醒词的编写更改与编写更加容易与使用,可以高效率更简单的进行离线语音唤醒,适用于刚入门且快随落地原型机的开发者使用,快速跑通该功能。
参考文档
教学文档
代码文件存放于开发者群中,大家自取:952051286

流式对话的选择

ESP-AI选用WebSocket 通,相较与MQTT,WERTC,WebSocket 更方便与前期的功能实现与原型搭建,并且具有低延迟,高性价比的功能,在前期开发过程中面对需求仅为聊天,实时指令控制时,选择使用WebSocket 通信协议的方式进行开发,还会降低开发难度,各语言均有成熟库(如 Python 的 websockets、Java 的 Tyrus)。

  1. 流式对话的核心需求
    实时性:对话内容需要即时传输(如逐词生成回复)。
    双向通信:客户端(设备)与服务器可主动推送消息。
    长连接:避免 HTTP 轮询的开销,降低延迟。
  2. 协议特性对比

一、

协议适用场景流式对话缺点
HTTP 轮询简单数据拉取高延迟、高资源消耗
HTTP 长轮询低频更新场景连接重建开销大,实时性不足
Server-Sent Events (SSE)服务器单向推送不支持客户端主动发送消息
WebSocket双向实时交互全双工、低延迟、高效

二、

特性WebSockeRTC (WebRTC)MQTT
核心用途双向实时文本/指令交互实时音视频传输轻量级设备消息发布/订阅
传输层协议TCPUDP (SRTP/SCTP)TCP
连接模式客户端-服务器点对点 (P2P)客户端-代理-客户端
数据格式自由格式(文本/二进制音视频流(编码帧)结构化消息(主题+负载)
典型延迟10-100ms50-500ms(音视频优化)100ms-2s
适用场景聊天、实时指令视频会议、直播物联网传感器数据上报
  1. 核心组件
    核心组件
    客户端:浏览器、 IoT 设备(如 ESP32-S3)。
    WebSocket 服务器:处理连接、消息路由及业务逻辑(Node.js)。
    对话引擎:集成 NLP 模型(例qwen2.5),实时生成回复。
  2. 通信流程
    在这里插入图片描述
    总体而言ESP-AI项目是根据ESP32S3开发板为基础做的AI嵌入式设备开发的项目,该项目基于WebSocket通讯为基础,建立设备与服务端的联系,同时在服务端进行了多个接口的开发与适配,拥有多套唤醒方式例如语音唤醒,语音唤醒可以通过ESP32S3内置语音唤醒或通过ASRPRO模块进行离线唤醒,也可以通过触摸唤醒按键唤醒等等,为开发者提供了一个很好的参考案例,帮助更多的开发者快速搭建属于自己的AI嵌入式后台服务以及建立硬件通讯服务,更加快速的实现一个AI产品的开发验证。
    如果您看到了现在,想现在就去尝试以下,恰巧您手中又有一套ESP32S3的开发板,欢迎您现在访问ESP-AI的官网 ,体验效果及功能。

复刻指南:客户端

客户端环境

如果你是个人玩家或者新手,更推荐使用 ESP-AI 开放平台提供的固件与服务,只需要在线烧录即可,无需搭建本地复杂繁琐的环境。ESP-AI开放平台

一、Arduino IDE 环境

1.1、基本软件准备

环境版本备注
Arduino IDE>= v2.x如果你想用 platformio 来开发客户端,也可以选择 VsCode 等IDE

不想用 Arduino IDE ?
群文件中已经整理好了 Vscode 和 Cursor 编辑器的配置和资料,直接加QQ群(952051286)下载吧。
除了 Vscode 您也可以使用 Clion 进行开发和烧录环境准备,如果使用 Clion 请直接从:二、Clion开发环境 开始

1.2、Arduino 依赖库安装

  1. 下载第三方依赖 点击下载依赖
    只是在第一次准备环境时需要这个依赖,升级时候只需要去下面发布页面下载最新 ESP-AI 依赖即可。

  2. 将依赖 libraries.zip 和 esp-ai.xxx.zip 解压到 C:\Users[用户名]\Documents\Arduino\libraries (注意 用户名自己改成你电脑用户名,并且删除中括号。)
    esp-ai.xxx.zip 解压后将版本号删除掉。

这个地址在 Arduino IDE 中此处可以获取到:
在这里插入图片描述
在这里插入图片描述
3. 确认你的 libraries 目录中有如下几个文件夹
在这里插入图片描述
4. 下载 ESP-AI 库
打开仓库发布页面,下载最新的客户端发布版本即可:发布页面
一般第一个就是最新的,下面截图只是想表达需要点击哪里下载,并不代表图中是新版本。
将下载的 zip 文件一样解压到 libraries 目录中,并保证libraries\esp-ai目录的存在。
在这里插入图片描述
1.3、Arduino 开发板环境安装
·1 设置开发板地址,打开菜单: 文件->首选项->其他开发板管理器,并将地址填入
https://github.com/espressif/arduino-esp32/releases/download/2.0.4/package_esp32_index.json
然后等待编辑器下载完文件。
在这里插入图片描述
·2 下载 ESP32 开发板
注意:版本必须是 2.x 版本,不能大于 3.0 否则会报错
在这里插入图片描述
·3 Arduino IDE 设置,下图中的三个选项必须如图设置。
在这里插入图片描述

二、Clion 环境

注意:配置过程对新手有一定难度,谨慎选择。Clion开发环境,适合对环境有要求的程序员,Clion开发环境成熟度高,操作友好,有利于加快研发效率

2.1、硬件以及软件准备
适配硬件:ESP32-S3-N16R8
软件:Clion、PlatformIO

2.2、安装 Clion 和 PlatformIO
下载地址
打开 Clion 官网,点击右上角 Download 进入下载界面,选择对应版本进行下载
在这里插入图片描述
建议您选择相对新的版本,新版本可以自行下载部署工具链,免去您手动下载和设置
下载成功后安装 Clion ,安装时注意勾选[Add"bin"folder to the PATH]将 Clion 添加到环境变量中
在这里插入图片描述
激活 Clion,您可以选择试用30天或者购买正版授权,也可以尝试万能的淘宝
在这里插入图片描述
激活后打开 Clion,下载 PlatformIO for Clion 插件,下载成功后重启 Clion
在这里插入图片描述
2.3、创建项目,配置 PlatformIO
打开 Clion,选择新建项目
这时可以看到新建项目界面左侧有 Platform 标志,点击 PlatformIO 后会发现右侧没有开发板列表,只显示“找不到PlatformIO实用程序”
在这里插入图片描述
对于此问题我们需要按照提示点击安装指南进入 PlatformIO 官网Wiki,点击 [Installer Script] 进入另一个界面,页面地址 installation
在这里插入图片描述
在该界面点击installer script进入Github界面
在这里插入图片描述
找到 get-platformio.py 并下载到电脑
在这里插入图片描述
运行 python get-platformio.py 脚本,等待下载完成(如果您没有python环境请自行下载安装)
运行完成后找到 C:\Users{用户名} 该路径下的文件中多出来 .platformio 文件证明python脚本运行成功
将 C:\Users{用户名}.platformio\penv\Scripts 下的文件加入到环境变量
重启Clion,可以看到Clion加载出了开发板列表
在这里插入图片描述
2.4、程序下载,安装
点击创建项目,选择 PlatformIO, 选择对应开发框架
在这里插入图片描述
等待自动下载环境依赖
在这里插入图片描述
下载第三方依赖 ,只是在第一次准备环境时需要这个依赖,升级时候只需要去下面发布页面下载最新 ESP-AI 依赖即可。
打开仓库发布页面,下载最新的客户端发布版本即可:发布页面
将下载好的第三方依赖和客户端发布版本复制到项目的 lib 目录下
在这里插入图片描述
修改 platformio.ini 配置,可以copy下方配置,注意修改 lib_extra_dirs 为您的目录路径

[env:esp32-s3-devkitc-1]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
lib_extra_dirs =
    /Users/{用户名}/.platformio/packages/framework-arduinoespressif32/libraries
lib_deps =
    HTTPClient

board_build.arduino.partitions = default_16MB.csv
board_build.arduino.memory_type = qio_opi
build_flags = -DBOARD_HAS_PSRAM
board_upload.flash_size = 16MB
monitor_speed = 115200

2.5、程序编写烧录
至此您可以查看客户端其他文档,编写代码或者准备烧录,例如下列图片,您可以发现ESP_AI的引用已经成功被索引,代表着您的环境已经配置成功
在这里插入图片描述
烧录时点击 Upload And Monitor 即可完成烧录
在这里插入图片描述
请注意,烧录时连到左边的type-c插口
在这里插入图片描述
烧录成功后会显示如下信息
在这里插入图片描述

物料准备

详细可见博客其他文章,ESP-AI已将开发板免费开源供大家参考,同时为了广大开发者可以通过拥抱AI这个举动,已经把ESP-AI的开发板免费商用授权开放。

DIY 接线

只有 DIY 模块方式才需要进行接线,如果您使用的是官方 PCB 则无需接线。
说明
vcc 表示正极,GND 表示负极,其他都是信号线。
表中的asrpro和三脚按钮都是用来唤醒的,当你需要这两种唤醒是才必须接线。
串口唤醒或者asrpro唤醒都是使用串口来通信,默认使用 IO12 和 IO11(不同开发板默认引脚不一样,以表格内容为准),引脚可改,见下面的说明。
WS2812 是用来做交互灯光的, 引脚是可以改的,见客户端配置。
电位器用来进行音量调整的,电位器默认使用 10K。(区分电位器引脚方法,旋钮朝上,将引脚对着自己: + | OUT | -)

ESP32S3INMP441Max98357A电位器(选)WS2812(选)ASRPRO(选)三脚按钮信(选)
3v3VCCVCCVCCVCCVCCVCC
GNDGNDGNDGNDGNDGNDGND
GNDL/R
4SCK
5WS
6SD
15DIN
16BCLK
17LRC
7OUT
18DIN
11pb6
12pb5
10OUT

开放平台扩展接线
开放平台还支持下面模组,如果是使用开放平台可以选择接线,用于完善电量检测、充放电、屏幕表情功能。

ESP32s3电压传感器(选)锂电池(3.7v)(选)充电板(I:3.7v,O:5v)(选)oled(128 * 64)(选)情绪指示灯(WS2812)
3v3VCCVCCVCC
GNDGNDGNDGND
GNDL/R
8S
+++
---
38SCL
39SDA
45IN

情绪灯光: 快乐->蓝色 / 伤心->绿色 / 愤怒->红色 / 恐惧->黄色

硬件代码

硬件代码也就是 Arduino 代码。按照下面步骤来就可以。

创建一个文件 example/example.ino (注意:文件夹名字必须和文件一样)
在这里插入图片描述
用 Arduino IDE 打开 example.ino 文件
写入下面代码(按照你的实际情况修改一下网络或者服务器配置)

#include <esp-ai.h>

ESP_AI esp_ai;
 

void setup() {
  Serial.begin(115200);
  
  // [必  填] 是否调试模式, 会输出更多信息
  bool debug = true;

  // wifi 配置: { wifi 账号, wifi 密码 }  注意:要用双引号! 
  // 不填则需要打开配网页面进行配网。
  ESP_AI_wifi_config wifi_config = { "", "", "ESP-AI"  };
  
  // 服务地址,用开发者平台,只需要配置为空
  ESP_AI_server_config server_config = { };
  // 或者配置为自己部署的服务: { 服务IP, 服务端口, "连接自己业务服务的请求参数,用多个参数&号分割,服务端用 auth 接收" }
  // ESP_AI_server_config server_config = { "http", "192.168.1.5", 8088, "p1=111&p2=test" };

  // 离线唤醒方案:{ 方案, 识别阈值 }, "edge_impulse" | "diy",为 "diy" 时可调用 esp_ai.wakeUp() 方法进行唤醒 
  ESP_AI_wake_up_config wake_up_config = {};
  strcpy(wake_up_config.wake_up_scheme, "asrpro");  // 唤醒方案
  strcpy(wake_up_config.str, "start");              // 串口和天问asrpro 唤醒时需要配置的字符串,也就是从另一个开发版发送来的字符串

  // 开始运行 ESP-AI 
  esp_ai.begin({debug, wifi_config, server_config, wake_up_config });
}

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

天问代码:加qq群下载(952051286)
上传代码
上传代码前请检查你的 Arduino IDE 设置是否正确。
在这里插入图片描述

唤醒方案

ESP-AI 提供的唤醒方案有: 天问asrpro、内置语音唤醒、串口唤醒、引脚高/低电平唤醒(按钮唤醒)。

按钮唤醒

当给某一个引脚输入高电平或者低电平时触发。

#include <esp-ai.h>
ESP_AI esp_ai;

void setup() { 
    Serial.begin(115200);

    bool debug = true; 
    ESP_AI_wifi_config wifi_config = { "", "", "ESP-AI" };  
    ESP_AI_server_config server_config = { };  

    // [必  填] 唤醒方案: { 方案, 语音唤醒用的阈值(本方案忽略即可), 引脚IO }
    ESP_AI_wake_up_config wake_up_config = { "pin_high", 1, 10 };  // 如果按钮按下是低电平,那使用 pin_low 即可 


    esp_ai.begin({ debug, wifi_config, server_config, wake_up_config });

}

void loop() {
    esp_ai.loop();
}
天问唤醒

.实际上是对串口唤醒的封装。
天问代码:加qq群下载(952051286)

//...

ESP_AI_wake_up_config wake_up_config = {};
strcpy(wake_up_config.wake_up_scheme, "asrpro");  // 唤醒方案
strcpy(wake_up_config.str, "start");              // 串口和天问asrpro 唤醒时需要配置的字符串,也就是从另一个开发板发送来的字符串

esp_ai.begin({ wake_up_config });

// ...
内置语音唤醒
//...

// 唤醒方案: { 方案, 语音唤醒用的阈值 , 引脚唤醒方案(本方案忽略), 发送的字符串(本方案忽略) }
ESP_AI_wake_up_config wake_up_config = {"edge_impulse",  0.95}; 

esp_ai.begin({ wake_up_config });

// ...
串口唤醒
//...

// 唤醒方案: { 方案, 语音唤醒用的阈值(本方案忽略即可), 引脚唤醒方案(本方案忽略), 发送的字符串 }
ESP_AI_wake_up_config wake_up_config = {"serial", 1, 10, "start"};

esp_ai.begin({ wake_up_config });

// ...
按住对话

此方式下,用户按住按钮才才会启动 ASR 放开就会进行 LLM 推理

// 唤醒方案: { 方案, 语音唤醒用的阈值(本方案忽略即可), 引脚唤醒方案(本方案忽略), 发送的字符串 }
ESP_AI_wake_up_config wake_up_config = { "pin_high_listen", 1, 10 }; // pin_high_listen 为按下高电平 , pin_low_listen 为按下低电平

esp_ai.begin({ wake_up_config });

// ...
复刻指南:服务端
服务端环境
基本软件准备

docker 镜像或者window懒人包安装服务端时不需要 Nodejs 环境。

123
环境版本备注
Nodejs>= v18.x 建议18.xnpm版本需要低于10.x, 6.x到9.x都行
VsCode IDE最新版备注

点击跳转 Nodejs 下载地址
点击跳转 VsCode IDE 下载地址

服务端安装

一行代码即可完成服务端安装,在你的项目目录运行下面命令。
NMP:

npm install esp-ai  --registry=https://registry.npmmirror.com

YARN:

yarn add --registry=https://registry.npmmirror.com esp-ai

PNPM:

pnpm add --registry=https://registry.npmmirror.com esp-ai

BUN:

bun add --registry=https://registry.npmmirror.com esp-ai

deno:

deno add --registry=https://registry.npmmirror.com esp-ai
服务端代码

在项目目录中创建一个文件 index.js

在 index.js 中添加以下代码(自行修改代码中的 key)

你也可以用第三方的服务,比如讯飞、火山的,详情见: 内置的官方/讯飞/火山/阿里等服务配置

const espAi = require("esp-ai"); 
const config = { 
    gen_client_config: ()=>({
 
        // 官方 ASR 服务配置 
        iat_server: "esp-ai-asr",
        iat_config: {
            // 开放平台秘钥
            api_key: "xxx",

            // 等待用户首次说话时间(被唤醒后,多少时间检测不到说话就自动退下,单位 ms, 默认: 5000)
            // vad_first: 5000,
            // 对话过程中等待用户说话时间(对话过程中,多少时间检测不到说话就自动退下,单位 ms, 默认: 2000)
            // vad_course: 2000,
        }, 

        // 官方 LLM 服务
        llm_server: "esp-ai-llm",
        llm_config: { 
            // 开放平台秘钥
            api_key: "xxx",
            
            // [可选] 使用的大模型, 默认使用 qwen2.5:32b 
            // model: "wizardlm2",
        },

        // 官方 TTS 服务
        tts_server: "esp-ai-tts",
        tts_config: {  
            // 开放平台秘钥
            api_key: "xxx",
            // [可选] 音色ID,默认使用小明音色,到 ESP-AI 开放平台中可以轻松克隆音色或者使用别人的音色
            // reference_id: "f209d2acacfc407e95dedc91fe1b9741", 
        },


        // // 调用讯飞语音识别
        // iat_server: "xun_fei",
        // iat_config: {
        //     // 讯飞:https://console.xfyun.cn/services/iat  。打开网址后,右上角三个字段复制进来即可。
        //     appid: "xxx",
        //     apiSecret: "xxx",
        //     apiKey: "xxx",  
        // },

        // // 调用火山引擎LLM
        // llm_server: "volcengine",
        // llm_config: {
        //     // 1. 注册:https://console.volcengine.com/ark
        //     // 1. 开通: https://console.volcengine.com/ark/region:ark+cn-beijing/openManagement?LLM=%7B%7D&tab=LLM
        //     // 2. 创建接入点: https://console.volcengine.com/ark/region:ark+cn-beijing/endpoint
        //     apiKey: "xxx",
        //     epId: "ep-xxx", // 接入点ID 
        // },

        // // 调用火山引擎TTS
        // tts_server: "volcengine",
        // tts_config: {
        //     // 1. 注册:https://console.volcengine.com/speech/app
        //     // 2. 音色开通: https://console.volcengine.com/speech/service/8?AppID=6359932705
        //     // 3. 授权: xxx
        //     // 服务接口认证信息
        //     appid: "xxx",
        //     accessToken: "xxx",
        //     rate: 24000, //采样率,只支持 16k 或者 24k,大模型语音合成必须使用 24k
        //     // voice_type: "BV007_streaming", // 清切女声
        //     voice_type: "BV051_streaming", // 奶气萌娃
        // },


    })
};

const espAiIns = espAi(config);

// 在合适的时机可以调用方法来在服务端实现设备操作
// espAiIns.restart("[device_id]") // 重启设备
// espAiIns.tts("[device_id]", "你好啊")   // 让设备说话
// ...

详细内置接入的平台见:内置的各平台使用教程

运行项目
在项目目录打开命令行工具,然后执行下面命令。

node ./index.js

成功效果
在这里插入图片描述
完整配置项见:服务端配置/实例

Docker

我们将容器命名为:esp-ai-server
配置文件放到/esp-ai-server/index.js (请先手动创建好这个文件)
宿主机端口为8088
注意:上面这三个配置只能更改宿主机的,镜像的必须如下写死。

创建配置文件

sudo touch /esp-ai-server/index.js

编辑配置文件

sudo nano /esp-ai-server/index.js

打开后把下面代码复制进去:(记得自己去复制自己的key)

const espAi = require("esp-ai"); 
const config = { 
  // ...
};
espAi(config);

然后 ctrl + o 保存。 然后 ctrl + x 退出。
运行容器
必须先手动创建好 /esp-ai-server/index.js 文件,该文件案例在仓库的 example/index.js 目录下。

sudo docker run -itd -p 8088:8088 -v /esp-ai-server/index.js:/server/index.js --name esp-ai-server registry.cn-shanghai.aliyuncs.com/xiaomingio/esp-ai:1.0.0

配置文件将映射到了/esp-ai-server/index.js,需要自行更改配置文件,更改文件后重启服务即可:

sudo docker exec -it esp-ai-server pm2 restart all

容器内安装插件
直接在容器内执行安装插件的命令

sudo docker exec -it esp-ai-server npm i [插件名字]  --registry=https://registry.npm.taobao.org  --strict-ssl=false

然后自行修改配置文件后,依然需要重启容器

sudo docker exec -it esp-ai-server pm2 restart all

查看运行日志

sudo docker exec -it esp-ai-server pm2 logs

更新依赖
用最新的版本号替换下面代码中的版本号即可。

sudo docker exec -it esp-ai-server npm i esp-ai@1.xx.xx  --registry=https://registry.npm.taobao.org  --strict-ssl=false

更新完毕后需要查看package.json中的版本号是否正确,如果正确,则重启容器即可。

sudo docker exec -it esp-ai-server cat ./package.json
更多资料与教学

服务器部署详细链接
案例代码
对话速度优化、线上部署建议
客户端实例
服务端实例
开放接口 OPENAPI

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值