众力资讯网

ESP-SkaiNet 对外部硬件有着明确而集中的要求。它的官方 BSP 层围绕

ESP-SkaiNet 对外部硬件有着明确而集中的要求。它的官方 BSP 层围绕两颗核心音频芯片构建了完整的驱动体系,理解这些要求对于电路设计或硬件选型至关重要。

**麦克风采集链路**是整个系统最关键的输入通道。ESP-SkaiNet 官方支持的唯一录音模数转换芯片是顺芯半导体的 ES7210,这是一颗四通道音频 ADC,通过 I2S 接口与 ESP32 芯片连接。无论你使用的是 Korvo-2、ESP-BOX 还是其他官方开发板,录音端走的都是这颗芯片。ES7210 在 SkaiNet 中的工作参数是固定的:采样率 16000Hz,位深 32 比特,I2S 标准 Philips 格式,以立体声模式传输两个 I2S 时隙,每个时隙承载两个麦克风通道的数据。这意味着在硬件层面上,官方方案最多支持四路模拟麦克风输入。

不过,程序实际使用的麦克风数量取决于 AFE 的输入格式字符串。Korvo-2 和 ESP-BOX 系列使用"RMNM"格式,代表参考通道、麦克风、空通道、麦克风,即有效录音通道为两个麦克风加一个回声参考通道。而 ESP32-S3-Eye 则使用更简单的"MN"格式,仅有一个 MEMS 麦克风直连 I2S,无需外挂 ES7210。如果你使用的是没有 codec 的裸 I2S 麦克风(比如常见的 INMP441 MEMS 麦克风模块),就需要在 BSP 层自行实现 `esp_get_feed_data` 函数,直接从 I2S 读取 16 位或 32 位 PCM 数据,再喂给 AFE——这正是你当前项目的做法,虽然绕过了官方 BSP,但数据流完全兼容。

ES7210 通过 I2C 总线受控,I2C 地址为默认值,通信频率通常设为 600kHz。录音增益建议设置在 27 到 30dB 之间,这个值在室内近场语音场景下表现良好。

**功放和扬声器输出**涉及另一颗核心芯片——ES8311。这是一颗低功耗单声道音频编解码器,在 SkaiNet 中仅使用其 DAC 模式,负责将 ESP32 通过 I2S 发送的数字音频转换为模拟信号驱动扬声器。ES8311 同样通过 I2C 总线控制,接收的 I2S 数据格式为 16000Hz、32 比特位深、立体声时隙(实际只用其中一个声道的数据,16 位有效数据被左移 16 位填充到 32 位时隙中)。

功放部分的硬件要求相对简单。官方开发板使用集成的 D 类音频功放芯片,最大输出功率约 3 瓦特,推荐搭配 4 欧姆阻抗的扬声器。功放的使能由一个 GPIO 引脚控制,高电平有效,在 ES8311 的驱动配置中通过 `pa_pin` 字段管理。如果你的硬件方案不使用 ES8311 而是采用独立的 DAC 或直接使用 ESP32 内置 DAC 输出,则需要自行处理 I2S TX 通道的初始化和数据格式转换,但总体逻辑不变:将 16 位单声道 PCM 数据写入 TX 通道即可。

值得注意的是,对于语音交互类应用,扬声器与麦克风的物理布局非常关键。如果两者距离过近且没有回声消除算法支撑,扬声器播放的语音会被麦克风重新拾取,可能导致误唤醒或命令词误识别。因此官方推荐使用双麦克风阵列并启用 AFE 内置的 AEC(回声消除),此时需要将扬声器播放的音频作为参考信号反灌给 AFE。

**关于摄像头,需要明确一点:ESP-SkaiNet 完全不含任何摄像头支持。** 全部源码中不存在 `esp_camera` 的初始化或调用代码,也没有任何图像处理相关的模块。尽管部分开发板(如 ESP32-S3-Eye)硬件上集成了一颗摄像头,但在 SkaiNet 框架下仅使用了其麦克风功能。如果你的项目需要同时做语音和视觉处理,应该将 SkaiNet 的语音管线与独立的摄像头驱动(如 ESP-WHO 框架)并行运行,两者互不干扰。

**对于自定义硬件的适配**,核心要求可以简化为三点。第一,麦克风输入端必须能够提供 16000Hz 采样率、16 位深度的单声道或双声道 PCM 音频数据,无论通过 ES7210、INMP441 还是其他 ADC 方案均可。第二,扬声器输出端需要一个能接受 16000Hz、16 位 PCM 数据的 I2S DAC,并在播放前使能功放。第三,I2S 接口必须配置为主模式、Philips 标准格式,DMA 缓冲区建议设为 6 个描述符、每块 160 帧,以保证流畅的实时音频处理。只要满足这三个条件,就可以在任意硬件上运行 ESP-SkaiNet 的全部功能。