《ESP32 AI 机器人入门教程从原理到实现--ESP-AI》快速上手指南
ESP32 AI 机器人入门教程从原理到实现–ESP-AI
基础原理
ESP-32 S3 N16R8
- 芯片概述
ESP32-S3 N16R8 是乐鑫(Espressif)推出的高性能 Wi-Fi & Bluetooth 5 (LE) 双模物联网 SoC,专为低功耗、高算力场景设计。其命名规则中:
N16:内置 16MB SPI Flash,用于程序存储和文件系统。
R8:集成 8MB PSRAM(伪静态随机存储器),支持高速数据缓存。
核心定位:适用于语音交互、边缘 AI 及复杂 IoT 应用(如智能音箱、工业控制器)。 - 特点
·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)。
- 流式对话的核心需求
实时性:对话内容需要即时传输(如逐词生成回复)。
双向通信:客户端(设备)与服务器可主动推送消息。
长连接:避免 HTTP 轮询的开销,降低延迟。 - 协议特性对比
一、
协议 | 适用场景 | 流式对话缺点 |
---|---|---|
HTTP 轮询 | 简单数据拉取 | 高延迟、高资源消耗 |
HTTP 长轮询 | 低频更新场景 | 连接重建开销大,实时性不足 |
Server-Sent Events (SSE) | 服务器单向推送 | 不支持客户端主动发送消息 |
WebSocket | 双向实时交互 | 全双工、低延迟、高效 |
二、
特性 | WebSocke | RTC (WebRTC) | MQTT |
---|---|---|---|
核心用途 | 双向实时文本/指令交互 | 实时音视频传输 | 轻量级设备消息发布/订阅 |
传输层协议 | TCP | UDP (SRTP/SCTP) | TCP |
连接模式 | 客户端-服务器 | 点对点 (P2P) | 客户端-代理-客户端 |
数据格式 | 自由格式(文本/二进制 | 音视频流(编码帧) | 结构化消息(主题+负载) |
典型延迟 | 10-100ms | 50-500ms(音视频优化) | 100ms-2s |
适用场景 | 聊天、实时指令 | 视频会议、直播 | 物联网传感器数据上报 |
- 核心组件
核心组件
客户端:浏览器、 IoT 设备(如 ESP32-S3)。
WebSocket 服务器:处理连接、消息路由及业务逻辑(Node.js)。
对话引擎:集成 NLP 模型(例qwen2.5),实时生成回复。 - 通信流程
总体而言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 依赖库安装
-
下载第三方依赖 点击下载依赖
只是在第一次准备环境时需要这个依赖,升级时候只需要去下面发布页面下载最新 ESP-AI 依赖即可。 -
将依赖 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 | -)
ESP32S3 | INMP441 | Max98357A | 电位器(选) | WS2812(选) | ASRPRO(选) | 三脚按钮信(选) |
---|---|---|---|---|---|---|
3v3 | VCC | VCC | VCC | VCC | VCC | VCC |
GND | GND | GND | GND | GND | GND | GND |
GND | L/R | |||||
4 | SCK | |||||
5 | WS | |||||
6 | SD | |||||
15 | DIN | |||||
16 | BCLK | |||||
17 | LRC | |||||
7 | OUT | |||||
18 | DIN | |||||
11 | pb6 | |||||
12 | pb5 | |||||
10 | OUT |
开放平台扩展接线
开放平台还支持下面模组,如果是使用开放平台可以选择接线,用于完善电量检测、充放电、屏幕表情功能。
ESP32s3 | 电压传感器(选) | 锂电池(3.7v)(选) | 充电板(I:3.7v,O:5v)(选) | oled(128 * 64)(选) | 情绪指示灯(WS2812) |
---|---|---|---|---|---|
3v3 | VCC | VCC | VCC | ||
GND | GND | GND | GND | ||
GND | L/R | ||||
8 | S | ||||
+ | + | + | |||
- | - | - | |||
38 | SCL | ||||
39 | SDA | ||||
45 | IN |
情绪灯光: 快乐->蓝色 / 伤心->绿色 / 愤怒->红色 / 恐惧->黄色
硬件代码
硬件代码也就是 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 环境。
1 | 2 | 3 |
---|---|---|
环境 | 版本 | 备注 |
Nodejs | >= v18.x 建议18.x | npm版本需要低于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