reSpeaker XVF3800 USB麦克风阵列与XIAO ESP32S3 UDP音频流传输
概述
本项目演示了使用ReSpeaker XVF3800麦克风阵列与XIAO ESP32S3开发板进行实时音频流传输。音频通过I2S捕获,并通过UDP传输到本地机器上运行的服务器,在那里可以存储和处理为.wav文件。

功能概述
此代码执行以下任务:
- 连接到指定的Wi-Fi网络。
- 连接到UDP服务器(例如,在主机PC上运行的Python脚本)。
- 使用XIAO ESP32S3通过I2S从ReSpeaker XVF3800捕获实时音频。
- 将捕获的音频作为原始数据传输。
Arduino代码
上传前请更新这些字段:
// WiFi凭据
const char* ssid     = "Your-SSID";
const char* password = "WIFI-PASSWORD";
// UDP目标
const char* udpAddress = "192.168.X.X";  // 更改为PC/服务器IP
const int udpPort      = 12345;            // 发送音频的端口
完整代码(流传输约5秒音频)
#include "WiFi.h"
#include "WiFiUdp.h"
#include "AudioTools.h"
// WiFi凭据
const char* ssid     = "Your-SSID";
const char* password = "WIFI-PASSWORD";
// UDP目标
const char* udpAddress = "192.168.X.X";  // 更改为PC/服务器IP
const int udpPort      = 12345;            // 发送音频的端口
WiFiUDP udp;
// 音频:16kHz,立体声,32位
AudioInfo info(16000, 2, 32);
I2SStream i2s_in;
I2SConfig i2s_config;
// 5秒音频 = 128kB/s × 5 = 640 kB
#define PACKET_SIZE 1024
#define NUM_PACKETS 625  // 5秒的数据量
// 编码WAV输出到UDP
EncodedAudioStream out_stream(&udp, new WAVEncoder());
StreamCopy copier(out_stream, i2s_in, PACKET_SIZE);
void connectWiFi() {
  Serial.printf("连接到WiFi: %s\n", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("\n已连接!");
}
void setupI2SInput() {
  i2s_config = i2s_in.defaultConfig(RX_MODE);
  i2s_config.copyFrom(info);
  // XVF3800引脚
  i2s_config.pin_bck = 8;     
  i2s_config.pin_ws = 7;      
  i2s_config.pin_data = 44;   
  i2s_config.pin_data_rx = 43;  
  i2s_config.is_master = true;  
  i2s_in.begin(i2s_config);
  Serial.println("I2S输入已启动。");
}
void setup() {
  Serial.begin(115200);
  AudioLogger::instance().begin(Serial, AudioLogger::Info);
  connectWiFi();
  setupI2SInput();
  // 开始UDP
  udp.begin(WiFi.localIP(), udpPort);
  out_stream.begin(info);
  // 开始UDP传输
  Serial.printf("通过UDP向%s:%d发送5秒音频\n", udpAddress, udpPort);
  udp.beginPacket(udpAddress, udpPort);
  copier.copyN(NUM_PACKETS);   // 复制正好5秒的音频
  udp.endPacket();
  Serial.println("完成发送5秒音频!");
}
void loop() {
  // 无其他操作,只运行一次
}
使用串口监视器(115200波特率)确认连接和流传输状态。

Python脚本(接收和保存音频)
import socket
udp_ip = "0.0.0.0"
udp_port = 12345
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((udp_ip, udp_port))
with open("output.wav", "wb") as f:
    print("正在监听音频...")
    while True:
        data, addr = sock.recvfrom(4096)
        f.write(data)
播放音频
文件保存完成后(output.wav),只需使用任何音频播放器打开它,例如:
- VLC
- Windows Media Player
- Audacity(用于检查)
技术支持与产品讨论
感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您对我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。