Skip to main content

使用 I2S 在 reSpeaker Flex 上录音与回放音频

目标

本示例的目标是使用 ESP32-S3 上的 I2S 接口,从 reSpeaker Flex XVF3800 语音处理器录制音频数据将其临时存储在内存中,然后通过同一音频通路回放。这种环回测试有助于验证 XVF3800 的输入和输出通道在通过 I2C 控制时,是否都已正确初始化并正常工作。

代码概览

在开头,我们配置了一个 AudioInfo 对象,指定每个采样的16kHz 采样率、2 个音频通道和 32 位深度,这与典型的 XVF3800 音频设置相匹配。名为 out 的 I2SStream 对象同时用于录音(RX 模式)和回放(TX 模式)。 setup() 函数初始化串口控制台用于调试,使用自定义引脚 (BCK = 引脚 8,WS = 引脚 7,DATA OUT = 引脚 44,DATA IN = 引脚 43) 配置 I2S 外设,并将 ESP32 配置为 I2S 主设备。该设置反映了 ESP32 与 reSpeaker Flex XVF3800 模块之间的硬件连线。 在 loop() 函数中,首先通过 out.end() 停止 I2S 输出,然后将其重新配置为 RX 模式,以从 XVF3800 的输出端录制输入音频数据。它使用 out.readBytes() 将原始音频采样填充到 buffer[] 中。录制完成后,再切换回 TX 模式,重新初始化 I2S,并使用 out.write() 将音频发送回去。这样在每次循环迭代中就形成了一个完整的录制–存储–回放周期

note

本示例中使用的固件为 I2S 16 kHz 版本。请确保你的 XIAO ESP32S3 固件已配置为 16 kHz 的 I2S 音频。


#include "AudioTools.h"

AudioInfo info(16000, 2, 32);

I2SStream out;
I2SConfig config;


uint8_t buffer[128000];
size_t bytes_read = 0;
size_t bytes_write = 0;

// Arduino Setup
void setup(void) {
// Open Serial
Serial.begin(115200);
while(!Serial);
AudioLogger::instance().begin(Serial, AudioLogger::Info);

// start I2S
Serial.println("starting I2S...");
config = out.defaultConfig(TX_MODE);
config.copyFrom(info);
// Custom I2S output pins
config.pin_bck = 8;
config.pin_ws = 7;
config.pin_data = 44;
config.pin_data_rx = 43;
config.is_master = false;
out.begin(config);
Serial.println("started...");
}

// Arduino loop - copy sound to out
void loop() {
// copier.copy();
out.end();
config.rx_tx_mode = RX_MODE;
out.begin(config);
bytes_read = out.readBytes(buffer, 128000);
out.end();
config.rx_tx_mode = TX_MODE;
out.begin(config);
bytes_write= out.write(buffer, 128000);
}

技术支持与产品讨论

感谢你选择我们的产品!我们将通过多种支持方式,确保你在使用我们产品的过程中尽可能顺利。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...