树莓派 vs ESP32-S3,做 AI 语音助手谁更合适?两种方案我都试试
一、开头:我是怎么入坑的
最近「小智」AI 桌面伴侣在嵌入式圈子里火得不行,作为一个嵌入式开发者,我也手痒了。
但第一步就卡住了:到底用树莓派还是 ESP32-S3?
网上说法五花八门,树莓派派说性能强生态好,ESP32 派说便宜够用才是王道。争来争去,没人真正两边都试过。
正所谓小孩子才做选择,我全都要,所以那我两个都试。 这篇文章先做个理论对比,然后分别用两种方案搭建,记录各自的踩坑过程,最终用实际体验来回答"到底选谁"。
二、六个维度理论对比
动手之前,先从纸面上比比看:
💰 成本
| 树莓派 | ESP32-S3 | |
|---|---|---|
| 主板 | 树莓派 Zero 2W ¥494 | ESP32-S3 ¥25 |
| 屏幕 | GC9A01 ¥10 或者其他HDMI屏幕 | GC9A01 ¥10 |
| 麦克风 | USB声卡麦克风 | ES8311 ¥ |
| 喇叭+功放 | USB声卡麦克风 ¥一起45 | ES8311 ¥一起12 |
| 总计 | ¥549 | ¥47 |
📝 对于成本方面来说,结果显而易见,如果你是学生党,不用犹豫直接选择ESP32-S3的方案;如果你是一个不缺钱的少爷,只是最求最极致的效果那么可以选择树莓派zero2w的方案。
⚡ 功耗
| 场景 | 树莓派 | ESP32-S3 |
|---|---|---|
| 待机 | 1.4W | 约 0.1~0.4W |
| 工作(满功耗运行) | 2.9W | 0.6W |
📝 ESP32-S3 是低功耗微控制器,适合电池设备;树莓派 Zero 2 W 是小型Linux电脑,功耗高很多。这个就要根据具体的应用场景做选择了,如果你需要在小智的基础上增加更多有意思的功能,那么就可以选择树莓派zero2w;如果你需要应用在随身携带的需要低功耗运行的场景,那么选择ESP32-S3就是一个不二之选。
🎤 音频
| 树莓派 | ESP32-S3 | |
|---|---|---|
| 麦克风方案 | USB麦克风 | I2S 数字麦,直连 |
| 喇叭方案 | USB声卡 | I2S 功放,直驱 |
| 踩坑指数 | 效果好,价格高 | 效果差,价格低 |
📝 花多少钱做多少事情,在开发方面使用USB的声卡和麦克风可以省去驱动的开发过程,同样的就需要花费更多的钱;使用I2S的麦克风在ESP32上就需要花费更多的时间去开发驱动,但是花费的成本较低且效果会比较差。
🧠 AI 算力
| 树莓派 | ESP32-S3 | |
|---|---|---|
| 能否本地跑模型 | ✅ 可跑轻量模型 / 联网调 API | ❌ 基本不行 |
| 实际方案 | 联网调 API | 联网调 API |
📝 对于树莓派来说,虽然可以部署轻量化的模型,但是效果一定是没有调用API大模型的效果好,所以我实际使用的方案都是联网调用API,还有两个个原因就是即使在本地部署了轻量化的模型可以节省成本,但是会占用大量的资源导致功耗上升;还有就是调用大模型的时间可能要比在本地部署后运算的时间快。对于ESP32就只能使用联网调用API,虽然都是调用API,但是实现方式也是不一样的,在树莓派上使用API可以通过直接连接AI平台,而使用ESP32连接则需要通过一个中转的服务器进行协议的转换后才可以连接到AI平台,所以联网调用API接口树莓派会更方便。
🔧 开发门槛
| 树莓派 | ESP32-S3 | |
|---|---|---|
| 语言 | Python / C++ | C / ESP-IDF |
| 环境搭建 | 刷系统即可 / 简单 | 安装 ESP-IDF 工具链 |
| 调试方式 | SSH / 插屏幕键盘 | 串口 / JTAG |
| 学习曲线 | 开发速度快 | 开发速度慢 |
📝 对于树莓派来说使用的硬件都可以使免驱动的,而ESP32基本上都需要从驱动开始开发,所以速度上树莓派要快不少,但是前提是你有一定的Linux开发的基础。
三、不纠结了,两种方案都试试
为啥不直接选一个?
- 理由 1:纯理论对比都是纸上谈兵,实际做一遍才知道哪个适合自己
- 理由 2:两种方案代表两种思路——树莓派是"性能优先",ESP32 是"够用就好"
- 理由 3:做系列博客,两条路都走一遍,内容更丰富,读者也能各取所需
两条线的计划
| 路线 | 平台 | 目标 | 当前进度 |
|---|---|---|---|
| 🅰️ 路线 A | ESP32-S3 | 低成本、低功耗、小巧的镜子伴侣 | ✅ 已完成屏幕/麦/喇叭驱动 |
| 🅱️ 路线 B | 树莓派 | 高性能、多功能的桌面助手 | 方案设计中 |
四、路线 A:ESP32-S3 方案 & 驱动踩坑
📌 这篇先把 ESP32-S3 的进展汇报了
硬件清单
| 模块 | 型号 | 接口 |
|---|---|---|
| 主控 | ESP32-S3-N8R2 | - |
| 屏幕 | GC9A01 | 接线表如下 |
| 麦克风和喇叭功放 | ES8311 | 接线表如下 |
LCD 显示引脚(GC9A01,SPI 接口)
| 功能 | GPIO | 说明 |
|---|---|---|
| SCLK | 18 | SPI 时钟 |
| MOSI | 19 | SPI 数据输出 |
| MISO | 21 | SPI 数据输入(GC9A01 未使用) |
| DC | 5 | 数据/命令选择 |
| RST | 3 | 硬件复位 |
| CS | 4 | SPI 片选 |
| BL | 2 | 背光控制(GPIO 高低电平) |
| TOUCH_CS | 15 | 触摸片选(已定义,未使用) |
- SPI 主机:SPI2_HOST
- SPI 模式:Mode 0
- SPI 时钟:40 MHz
- 分辨率:240×240
- 色深:16 位 RGB565(BGR 字节序)
音频引脚(ES8311,I2S + I2C 接口)
| 功能 | GPIO | 说明 |
|---|---|---|
| MCLK | 6 | I2S 主时钟 |
| BCLK | 7 | I2S 位时钟 |
| WS | 8 | I2S 字选(左右声道) |
| DO | 11 | I2S 数据输出(播放) |
| DI | 12 | I2S 数据输入(录音) |
| I2C_SCL | 9 | ES8311 I2C 时钟 |
| I2C_SDA | 10 | ES8311 I2C 数据 |
- I2S 端口:I2S_NUM_0
- I2C 端口:I2C_NUM_0
- 采样率:16000 Hz
- MCLK 倍频:384
- ES8311 I2C 地址:0x30(
ES8311_ADDRRES_0)
▲ ESP32-S3 驱动 GC9A01 屏幕显示眼睛动画效果
踩坑记录
屏幕驱动
- 驱动 IC:GC9A01
- 遇到的问题:使用LVGL驱动屏幕显示动画时系统总是重启
- 怎么解决的:原因是
images数组是局部栈变量,lv_animimg_set_src()内部保存了指向它的指针。当example_lvgl_demo_ui()返回后栈内存被回收,LVGL 动画定时器后续访问时读到垃圾数据(0x00000073)导致 LoadProhibited。解决办法:将images改为static,使其生命周期持续整个程序运行期间
麦克风驱动
esp_err_t es8311_microphone_config(es8311_handle_t dev, bool digital_mic)
{
uint8_t reg14 = 0x1A; // 使能模拟 MIC,设置最大 PGA 增益
if (digital_mic) {
reg14 |= BIT(6); // 数字 PDM 麦克风(不使用)
}
es8311_write_reg(dev, 0x17, 0xC8); // ADC 增益设置
return es8311_write_reg(dev, 0x14, reg14);
}
喇叭驱动
static esp_err_t es8311_codec_init(void)
{
// I2C 初始化,用于配置 ES8311 寄存器
const i2c_config_t es_i2c_cfg = {
.sda_io_num = GPIO_NUM_10,
.scl_io_num = GPIO_NUM_9,
.mode = I2C_MODE_MASTER,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = 100000,
};
i2c_param_config(I2C_NUM_0, &es_i2c_cfg);
i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0);
es8311_handle_t es_handle = es8311_create(I2C_NUM_0, 0x18);
const es8311_clock_config_t es_clk = {
.mclk_inverted = false,
.sclk_inverted = false,
.mclk_from_mclk_pin = true, // MCLK 来自专用 MCLK 引脚
.mclk_frequency = 16000 * 384, // = 6.144 MHz
.sample_frequency = 16000, // 16kHz 采样率
};
es8311_init(es_handle, &es_clk, ES8311_RESOLUTION_16, ES8311_RESOLUTION_16);
es8311_voice_volume_set(es_handle, CONFIG_EXAMPLE_VOICE_VOLUME, NULL); // 设置音量 (0-100)
}
五、当前效果(路线 A)
✅ 屏幕:正常点亮 ✅ 麦克风:收音正常 ✅ 喇叭:测试音频通过
展示视频
[video(video-LQCZwIMp-1784357000097)(type-csdn)(url-live.csdn.net/v/embed/535…)]
六、下一步
| 路线 | 下一步计划 |
|---|---|
| 🅰️ ESP32-S3 | WiFi 配网 + 接入大模型 API,让它真正"开口说话" |
| 🅱️ 树莓派 | 环境搭建 + 屏幕/麦/喇叭驱动,和路线 A 正面 PK |
▲ 树莓派 Zero 2W 主板,路线 B 的核心硬件
树莓派买回来了,花了主播470大洋好心疼,希望能为主播点个关注点个赞支持一下,我会为想入坑的家人们提供更好的参考建议。
吐槽一句怎么最近的树莓派和电子设备都在涨价啊,主播也只是个穷鬼啊,还想着最近换个新电脑开发更流畅的,我的钱包让我忍着TVT
下一篇预告:路线 A 续集——ESP32-S3 联网 + 大模型 API 对接
七、资源链接
- 小智开源项目:github.com/78/xiaozhi-…
- ESP-IDF 编程指南:docs.espressif.com/projects/es…
- 我的代码仓库链接:github.com/chunzhenda/…