1. 从一次真实的翻车经历说起去年冬天我在工作室里折腾一块新入手的 ESP32-S3 开发板打算把之前在一块经典 ESP32-WROOM 板子上跑得好好的小智语音助手源码直接烧进去。按道理说都是 ESP32 家族都是乐鑫的芯片源码也是同一套能有多大差别结果编译一把过烧录也顺利串口日志一打开直接傻眼——I2C 初始化失败音频编解码器 ES8311 死活读不到麦克风没声音喇叭也没动静。折腾了大半天最后发现问题出在引脚定义上新板子的 I2S 和 I2C 走线跟老板子完全不是一回事。这件事让我意识到一个很现实的问题同一套小智源码换块 ESP32 开发板为什么还要重新适配这个问题看起来简单但背后牵扯到的东西其实挺多——芯片型号差异、引脚映射、外设配置、Flash 分区、PSRAM 有无、甚至开发板厂商自己加的电源管理芯片每一个环节都可能让你卡住。如果你也在做 ESP32 相关的语音助手、物联网终端或者 AI 交互设备这篇文章应该能帮你少走不少弯路。我打算把这次适配过程中踩过的坑、总结出来的方法、以及一套可以直接抄作业的板级适配流程完整地分享出来。不管你是刚接触 ESP32 的新手还是已经做过几个项目的老手只要涉及到“换板子”这件事这里面的经验应该都用得上。2. 为什么同一套源码换个板子就跑不起来2.1 芯片型号相同不等于硬件相同很多人有一个误区只要都是 ESP32源码就应该通用。这个想法在理论层面没错ESP32 系列芯片的指令集、外设控制器、内存映射大体一致乐鑫提供的 ESP-IDF 也做了很好的抽象。但问题在于芯片只是开发板上的一个零件开发板才是你真正面对的东西。一块 ESP32 开发板上除了主控芯片还有一堆外围器件Flash 存储芯片、PSRAM 扩展内存、晶振、电源管理 IC、USB 转串口芯片、音频编解码器、功放、麦克风、LED、按键、传感器接口等等。不同厂商、不同型号的开发板这些外围器件的选型和连接方式千差万别。源码里如果写死了某个引脚号、某个 I2C 地址、某个 Flash 容量换一块板子自然就跑不通。我拿自己手头的几块板子举例。一块是常见的 ESP32-DevKitC用的是 ESP32-WROOM-32 模组4MB Flash没有 PSRAM音频外设基本靠外接。另一块是 ESP32-S3-Korvo-2板载 ES8311 编解码器、双麦克风阵列、功放8MB Flash 加 8MB PSRAM。还有一块是某厂商定制的 ESP32-S3-AI-2 开发板引脚定义又跟 Korvo 完全不一样。这三块板子跑同一套小智源码如果不做板级适配能跑起来才怪。2.2 小智源码里的“硬编码”陷阱小智源码本身是一套挺完整的语音交互框架包含了唤醒词检测、语音识别、大模型对话、语音合成、音频播放等模块。但它的默认配置往往是针对某一块特定开发板写的比如官方推荐的 ESP32-S3-BOX 或者 Korvo 系列。源码里常见的硬编码包括I2S 引脚定义BCLK、WS、DATA_IN、DATA_OUT 这几个引脚不同板子接的 GPIO 完全不同。I2C 引脚定义SDA、SCL 用于控制编解码器芯片比如 ES8311、ES7210 等。编解码器 I2C 地址ES8311 通常是 0x18但有些板子会因为地址引脚接法不同而变成 0x19 或其他值。PA 使能引脚功放芯片的使能脚有些板子用 GPIO有些直接拉高。Flash 和分区表不同容量的 Flash 需要不同的分区表配置4MB 和 8MB 的分区布局完全不一样。PSRAM 配置有 PSRAM 和没有 PSRAM 的板子内存分配策略和任务栈大小都要调整。这些硬编码在源码里可能散落在各个文件中从board_config.h到audio_board.c再到sdkconfig.defaults找起来相当费劲。我第一次适配的时候光是把所有跟引脚相关的宏定义找全就花了将近两个小时。2.3 板级适配的本质是什么说白了板级适配就是让软件知道它跑在什么硬件上。这跟 PC 上装系统要装驱动是一个道理。你的源码是操作系统开发板是硬件中间需要一个“驱动层”来翻译。在 ESP-IDF 的体系里这个驱动层通常由board组件或者bspBoard Support Package来承担。乐鑫官方对一些主流开发板提供了 BSP比如esp-bsp仓库里就有 Korvo、BOX、Lyra 等板子的支持。但如果你用的是第三方厂商的板子或者自己画的板子那就得自己写 BSP 或者手动改配置。小智源码的适配本质上就是补全这个 BSP 层让音频、显示、按键、LED 这些外设都能正确初始化。理解了这个本质后面的适配工作就有了方向不是去改小智的核心逻辑而是去改硬件抽象层。核心逻辑是通用的硬件抽象层是板子相关的两者分离适配工作才能做得干净利落。3. 板级适配前必须搞清楚的硬件信息3.1 拿到一块新板子先做这三件事我现在的习惯是拿到任何一块新开发板先不急着烧源码而是花二十分钟把下面三件事做完。这三件事做完后面适配能省下大量时间。第一件事找到原理图或引脚定义表。这是最关键的。原理图会告诉你每个 GPIO 接了什么外设I2S 走哪几个脚I2C 走哪几个脚功放使能是哪个脚。如果厂商没提供原理图至少要找引脚定义表或者示例代码。有些厂商的 Wiki 上会有详细的引脚映射有些则只在 Arduino 示例里体现。实在找不到就得拿万用表自己量虽然麻烦但也不是不行。第二件事确认芯片型号和模组规格。ESP32、ESP32-S3、ESP32-C3、ESP32-P4 这些芯片的外设数量和引脚分布都不一样。S3 支持 USB OTGC3 是 RISC-V 架构P4 有更强的 AI 加速能力。确认芯片型号之后还要看模组是 WROOM 还是 WROVERWROVER 通常带 PSRAMWROOM 一般不带。Flash 容量也要确认4MB、8MB、16MB 的分区表配置完全不同。第三件事确认板载音频方案。小智源码的核心是语音交互音频通路必须搞清楚。板子上用的是哪个编解码器ES8311、ES7210、ES8388、WM8960 还是其他麦克风是模拟麦还是数字麦功放是什么型号使能脚怎么控制这些问题不搞清楚音频初始化肯定失败。3.2 常见 ESP32 开发板音频方案对比为了让大家有个直观的认识我整理了一张常见开发板的音频方案对比表。这张表是我自己踩坑之后总结的不一定全面但覆盖了市面上比较主流的几款。开发板型号主控芯片编解码器麦克风类型功放使能Flash/PSRAMESP32-DevKitCESP32-WROOM-32无板载需外接无4MB / 无ESP32-S3-Korvo-2ESP32-S3-WROOM-1ES8311 ES7210双模拟麦GPIO 拉高8MB / 8MBESP32-S3-BOXESP32-S3-WROOM-1ES8311双数字麦专用 GPIO16MB / 8MBESP32-S3-AI-2ESP32-S3-WROOM-1ES8311单模拟麦GPIO 拉高8MB / 8MBESP32-LyraTESP32-WROVER-BES8388双模拟麦GPIO 控制4MB / 8MB从这张表能看出来即使是同一颗 ESP32-S3 芯片不同板子的音频方案差异也很大。Korvo 用了 ES8311 加 ES7210 的组合BOX 只用了一颗 ES8311 配合数字麦AI-2 又是另一种接法。源码里如果只针对其中一种写死换板子必然出问题。3.3 引脚映射的坑同一个功能不同的 GPIO引脚映射是板级适配中最容易出错的地方。我拿 I2S 举例这是音频数据传输的核心接口包含 BCLK位时钟、WS帧同步、DATA_OUT输出、DATA_IN输入四根线。不同板子对这四根线的 GPIO 分配完全不同。Korvo-2 的 I2S 配置是 BCLK 用 GPIO 40WS 用 GPIO 41DATA_OUT 用 GPIO 42DATA_IN 用 GPIO 43。而 AI-2 开发板的配置是 BCLK 用 GPIO 15WS 用 GPIO 16DATA_OUT 用 GPIO 17DATA_IN 用 GPIO 18。如果你把 Korvo 的配置直接搬到 AI-2 上音频数据就会从错误的引脚进出结果就是没声音或者全是噪声。I2C 也一样。ES8311 的控制接口是 I2CSDA 和 SCL 的 GPIO 在不同板子上也不同。更坑的是有些板子把 ES8311 的 I2C 地址设成了 0x19 而不是默认的 0x18这个如果不知道初始化代码会一直返回错误。提示拿到新板子后第一件事就是把原理图上的 I2S、I2C、PA 使能、按键、LED 这几个关键引脚全部列出来做成一张对照表。后面改代码的时候直接查表比反复翻原理图高效得多。4. 小智源码板级适配的完整实操流程4.1 第一步建立板级配置文件我的做法是在源码里新建一个board_config.h文件把所有跟板子相关的宏定义集中放在这里。这样做的好处是换板子的时候只需要改这一个文件不用去各个源文件里翻找。这个文件里应该包含以下几类配置// board_config.h #ifndef _BOARD_CONFIG_H_ #define _BOARD_CONFIG_H_ // 芯片型号 #define BOARD_CHIP_ESP32S3 1 // I2S 引脚 #define BOARD_I2S_BCLK_GPIO 15 #define BOARD_I2S_WS_GPIO 16 #define BOARD_I2S_DOUT_GPIO 17 #define BOARD_I2S_DIN_GPIO 18 // I2C 引脚 #define BOARD_I2C_SDA_GPIO 8 #define BOARD_I2C_SCL_GPIO 9 // 编解码器 #define BOARD_CODEC_ES8311 1 #define BOARD_CODEC_I2C_ADDR 0x18 // 功放使能 #define BOARD_PA_ENABLE_GPIO 10 #define BOARD_PA_ENABLE_LEVEL 1 // 按键 #define BOARD_BUTTON_GPIO 0 // LED #define BOARD_LED_GPIO 48 #endif这个文件写好后其他源文件里所有跟硬件相关的部分都引用这些宏而不是直接写 GPIO 号。这样换板子的时候只改这一个文件就行。4.2 第二步修改音频初始化代码小智源码的音频初始化通常在audio_board.c或者类似的文件里。这里需要根据板子的实际硬件来配置 I2S 和编解码器。I2S 的配置相对直接把board_config.h里的引脚宏填进去就行。但编解码器的配置就麻烦一些因为不同编解码器的寄存器操作完全不同。ES8311 和 ES8388 的初始化序列差异很大不能通用。以 ES8311 为例初始化流程大致是先通过 I2C 写寄存器复位芯片然后配置时钟分频、采样率、数据格式、音量等参数。这些寄存器值在 ES8311 的数据手册里都有但手册是英文的而且寄存器数量不少第一次看会比较头疼。我的建议是直接参考乐鑫官方 BSP 里 ES8311 的驱动代码在它的基础上改 I2C 地址和引脚配置就行。// 音频初始化示例 esp_err_t board_audio_init(void) { // 配置 I2C i2c_config_t i2c_cfg { .mode I2C_MODE_MASTER, .sda_io_num BOARD_I2C_SDA_GPIO, .scl_io_num BOARD_I2C_SCL_GPIO, .sda_pullup_en GPIO_PULLUP_ENABLE, .scl_pullup_en GPIO_PULLUP_ENABLE, .master.clk_speed 100000, }; i2c_param_config(I2C_NUM_0, i2c_cfg); i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0); // 初始化 ES8311 es8311_init(I2C_NUM_0, BOARD_CODEC_I2C_ADDR); // 配置 I2S i2s_config_t i2s_cfg { .mode I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX, .sample_rate 16000, .bits_per_sample I2S_BITS_PER_SAMPLE_16BIT, .channel_format I2S_CHANNEL_FMT_RIGHT_LEFT, .communication_format I2S_COMM_FORMAT_STAND_I2S, .dma_buf_count 6, .dma_buf_len 160, }; i2s_driver_install(I2S_NUM_0, i2s_cfg, 0, NULL); i2s_pin_config_t pin_cfg { .bck_io_num BOARD_I2S_BCLK_GPIO, .ws_io_num BOARD_I2S_WS_GPIO, .data_out_num BOARD_I2S_DOUT_GPIO, .data_in_num BOARD_I2S_DIN_GPIO, }; i2s_set_pin(I2S_NUM_0, pin_cfg); // 使能功放 gpio_set_direction(BOARD_PA_ENABLE_GPIO, GPIO_MODE_OUTPUT); gpio_set_level(BOARD_PA_ENABLE_GPIO, BOARD_PA_ENABLE_LEVEL); return ESP_OK; }这段代码看起来简单但实际调试的时候I2S 的采样率和编解码器的采样率必须匹配否则会出现音频变速或者噪声。ES8311 支持 8kHz 到 48kHz 的采样率小智源码通常用 16kHz 做语音识别用 24kHz 或 48kHz 做音频播放。如果两个方向采样率不同需要在代码里做重采样或者配置编解码器支持双采样率。4.3 第三步调整 Flash 分区表和 PSRAM 配置Flash 分区表是另一个容易忽略的地方。小智源码通常需要存储唤醒词模型、语音识别模型、音频文件等资源这些都需要 Flash 空间。4MB 的 Flash 和 8MB 的 Flash分区表完全不一样。我一般用partitions.csv文件来定义分区然后在menuconfig里指定这个文件。一个典型的 8MB Flash 分区表长这样# Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x6000, phy_init, data, phy, 0xf000, 0x1000, factory, app, factory, 0x10000, 0x300000, model, data, spiffs, 0x310000,0x200000, storage, data, spiffs, 0x510000,0x2F0000,这里factory是应用程序分区给了 3MBmodel是模型分区给了 2MBstorage是存储分区给了将近 3MB。如果是 4MB Flash这些数字都要缩小模型分区可能只能给 1MB存储分区也要压缩。PSRAM 的配置在menuconfig里路径是Component config - ESP PSRAM - Support for external, SPI-connected RAM。如果有 PSRAM要勾选这个选项并选择正确的模式Quad SPI 或 Octal SPI。S3 的 PSRAM 通常是 Octal SPI速度更快。没有 PSRAM 的板子这个选项要关掉否则启动时会报错。注意PSRAM 配置错误是导致启动失败的常见原因之一。如果串口日志里出现PSRAM ID read error或者Failed to init PSRAM先检查板子到底有没有 PSRAM再检查 menuconfig 里的模式选对了没有。4.4 第四步处理按键和 LED 的差异按键和 LED 看起来是小问题但如果不处理用户体验会很差。小智源码通常用一个按键来触发唤醒或者切换模式这个按键的 GPIO 在不同板子上也不同。有些板子的按键是低电平有效有些是高电平有效代码里要对应调整。LED 也一样。有些板子用单色 LED有些用 RGB LED比如 WS2812。WS2812 需要专门的驱动不能用普通的 GPIO 高低电平来控制。如果源码里默认是普通 LED换到 WS2812 的板子上就要改驱动代码。我在适配 AI-2 开发板的时候就遇到了按键电平反过来的问题。源码里默认按键按下是低电平但 AI-2 的按键按下是高电平结果就是按键功能完全反了——不按的时候触发按下去反而不触发。后来在board_config.h里加了一个BOARD_BUTTON_ACTIVE_LEVEL宏根据板子实际情况配置问题就解决了。5. 适配过程中最常见的五个坑及排查方法5.1 音频初始化失败I2C 地址和引脚排查音频初始化失败是最常见的问题表现通常是串口日志里出现ES8311 init failed或者I2C write error。排查思路如下首先确认 I2C 引脚配置对不对。用万用表量一下 SDA 和 SCL 的电压正常应该是 3.3V 左右。如果电压不对可能是引脚配错了或者板子上没有上拉电阻。ESP32 的 I2C 需要外部上拉电阻通常 4.7k 到 10k 之间。有些板子自带上拉有些没有没有的话要在代码里使能内部上拉但内部上拉比较弱高速通信可能不稳定。然后确认 I2C 地址。用 I2C 扫描工具扫一下总线上的设备看看 ES8311 到底在哪个地址。ESP-IDF 里有一个i2c_scanner的示例可以直接拿来用。如果扫描不到任何设备说明 I2C 总线本身有问题如果扫描到了但地址不是 0x18那就改配置。最后确认编解码器的复位引脚。有些板子把 ES8311 的复位脚接到了 GPIO需要在初始化之前先拉低再拉高完成复位。如果复位脚没控制芯片可能一直处于复位状态I2C 自然读不到。5.2 有声音但全是噪声I2S 时钟和格式排查音频有输出但全是噪声通常跟 I2S 的时钟配置或数据格式有关。排查要点采样率是否匹配I2S 配置的采样率和编解码器配置的采样率必须一致。如果 I2S 设了 16kHz编解码器设了 48kHz出来的声音就会变调。数据位宽是否匹配I2S 设了 16bit编解码器也要设 16bit。如果编解码器设了 24bit数据对齐方式就不对会出噪声。I2S 模式是否正确主从模式要匹配。ESP32 通常做 I2S 主机编解码器做从机。如果两边都设成主机时钟会冲突。BCLK 和 WS 极性有些编解码器要求 BCLK 在下降沿采样有些要求上升沿。这个在编解码器寄存器里配置配错了也会出噪声。我遇到过一次噪声问题排查了半天发现是 I2S 的communication_format设错了。ES8311 用的是标准 I2S 格式但我配成了左对齐格式结果数据错位出来的全是噪声。改成I2S_COMM_FORMAT_STAND_I2S之后就正常了。5.3 启动就重启PSRAM 和 Flash 配置排查板子一上电就反复重启串口日志里能看到abort()或者Guru Meditation Error这种情况多半是 PSRAM 或 Flash 配置有问题。先看 PSRAM。如果板子没有 PSRAM 但 menuconfig 里开了 PSRAM 支持启动时初始化 PSRAM 会失败导致重启。反过来如果板子有 PSRAM 但没开支持代码里如果用了heap_caps_malloc分配 PSRAM 内存也会失败。再看 Flash 容量。如果分区表里定义的分区超出了实际 Flash 容量烧录的时候可能不报错但运行时访问超出范围的分区就会崩溃。比如 4MB 的 Flash分区表里却定义了一个 5MB 的分区肯定出问题。还有一个隐蔽的坑是 Flash 模式。有些板子的 Flash 是 QIO 模式有些是 DIO 模式。如果 menuconfig 里设错了启动时读取 Flash 会失败。这个通常在menuconfig - Serial flasher config - Flash SPI mode里配置不确定的话可以先用 DIO 模式兼容性最好。5.4 唤醒词不响应麦克风通路排查唤醒词不响应说明麦克风采集的音频数据没有正确传到唤醒词检测模块。排查思路先确认麦克风有没有数据。可以在代码里加一段调试代码把 I2S 读到的原始数据打印出来看看是不是全零或者全是噪声。如果全是零说明 I2S 接收通路没配好如果全是噪声说明麦克风偏置或者增益有问题。模拟麦克风需要偏置电压通常 1.65V 左右。有些板子用编解码器内部的偏置有些用外部偏置电路。如果偏置不对麦克风输出会很小或者失真。数字麦克风比如 INMP441不需要偏置但需要正确的时钟配置PDM 接口和 I2S 接口的配置方式不同。还有一个常见问题是麦克风增益太低。ES8311 的 ADC 增益寄存器可以调默认值可能偏小导致采集到的音频幅度不够唤醒词检测算法识别不出来。适当调高增益通常能解决问题。5.5 常见问题速查表为了方便大家快速定位问题我把上面这些常见问题整理成了一张速查表现象可能原因排查方法解决方法音频初始化失败I2C 引脚或地址错误用 I2C 扫描工具扫描总线修正引脚配置或 I2C 地址有声音但全是噪声I2S 采样率或格式不匹配检查 I2S 和编解码器配置统一采样率和数据格式启动反复重启PSRAM 或 Flash 配置错误查看串口日志中的错误信息修正 menuconfig 和分区表唤醒词不响应麦克风通路异常打印 I2S 原始数据检查偏置、增益和时钟配置按键功能反了按键电平配置错误测量按键按下时的电平修改按键有效电平宏定义LED 不亮LED 类型或引脚错误检查 LED 是普通还是 WS2812更换驱动或修正引脚这张表是我自己适配过程中总结的基本上覆盖了八成以上的常见问题。遇到新问题的时候先查表能省不少时间。6. 让板级适配更优雅的几个实践建议6.1 用 BSP 组件管理板级差异如果你的项目要支持多块板子最好的做法是给每块板子写一个 BSP 组件然后在编译时选择用哪个 BSP。ESP-IDF 的组件系统支持这种模式在CMakeLists.txt里根据配置条件包含不同的源文件。具体做法是建一个bsp目录里面每个板子一个子目录比如bsp/korvo/、bsp/ai2/、bsp/box/。每个子目录里有自己的board_config.h和board_init.c。然后在顶层CMakeLists.txt里根据CONFIG_BOARD_TYPE来选择编译哪个子目录。这样做的好处是板级代码完全隔离换板子的时候只需要在 menuconfig 里切换一下选项不用手动改代码。而且新增板子的时候复制一个现有目录改改就行不会影响其他板子的代码。6.2 把硬件配置做成 menuconfig 选项除了 BSP 组件还可以把一些关键的硬件配置做成 menuconfig 选项让用户在编译时选择。比如config BOARD_I2S_BCLK_GPIO int I2S BCLK GPIO default 15 config BOARD_I2C_SDA_GPIO int I2C SDA GPIO default 8 config BOARD_CODEC_I2C_ADDR hex Codec I2C Address default 0x18这些选项定义在Kconfig.projbuild文件里menuconfig 里就能看到。用户可以根据自己的板子填对应的值不用改代码。这种方式适合板子种类不多、配置差异不大的场景。6.3 保留一份适配检查清单每次适配新板子的时候我都会对照一份检查清单逐项确认。这份清单包括芯片型号和模组规格确认Flash 容量和分区表配置PSRAM 有无和模式配置I2S 引脚和采样率配置I2C 引脚和编解码器地址配置功放使能引脚和电平配置按键引脚和有效电平配置LED 类型和引脚配置串口日志波特率配置烧录方式和 Flash 模式配置这份清单看起来简单但每次都能帮我发现一两个遗漏的点。特别是 PSRAM 和 Flash 模式这两个很容易忘但忘了就会导致启动失败。6.4 调试音频问题的几个实用技巧音频问题是最难调的因为涉及模拟电路和数字电路的配合。我总结几个实用技巧第一先用示波器看 I2S 的 BCLK 和 WS 信号。正常应该有稳定的方波BCLK 频率是采样率乘以位宽乘以声道数。如果波形不对说明 I2S 配置有问题。第二用编解码器的回环模式测试。ES8311 支持把 ADC 采集的数据直接送到 DAC 输出形成一个回环。如果回环能听到清晰的声音说明编解码器和 I2S 都没问题问题出在麦克风或者功放。如果回环也是噪声那问题就在编解码器或 I2S 配置上。第三逐步排查增益。先把所有增益设成中间值确认有声音之后再逐步调整。麦克风增益、ADC 增益、DAC 增益、功放增益每一个都会影响最终效果。一次性改太多出了问题很难定位。第四注意电源噪声。音频对电源很敏感如果板子的电源纹波大音频输出会有嗡嗡声。可以在功放电源脚旁边加一个 100uF 的电解电容和一个 0.1uF 的陶瓷电容通常能改善不少。7. 关于适配这件事的一些个人体会适配了几块板子之后我最大的体会是板级适配不是写代码而是做翻译。你要把硬件的语言翻译成软件能听懂的话。原理图是硬件的语言board_config.h 是翻译的结果中间的翻译过程就是适配。另一个体会是不要怕麻烦该做的检查一个都不能少。我刚开始做适配的时候总想着快点烧录看效果结果每次都是烧进去跑不起来再回头查配置反而更慢。后来养成了习惯拿到新板子先花二十分钟把硬件信息整理清楚后面适配反而快了。还有一点多看看官方 BSP 的代码。乐鑫的 esp-bsp 仓库里有很多板子的参考实现虽然不一定跟你的板子完全一样但思路和结构是可以借鉴的。特别是音频初始化那部分ES8311、ES7210 这些常见编解码器的驱动代码官方都写得很完整拿来改改就能用。最后说一个我踩过的坑。有一次适配一块新板子所有配置都检查过了音频死活不出声。折腾了一下午最后发现是功放使能引脚的电平搞反了——我以为高电平使能实际是低电平使能。功放一直处于关闭状态当然没声音。这件事告诉我硬件手册上的每一个细节都要认真看不能想当然。如果你也在做 ESP32 相关的语音项目或者正在为换板子发愁希望这篇文章能帮你理清思路。板级适配这件事说难不难说简单也不简单关键是要有耐心一步一步来。把硬件信息搞清楚把配置写对剩下的就是调试和优化了。