Skip to main content

reSpeaker XVF3800 USB麦克风阵列与XIAO ESP32S3 UDP音频流传输

概述

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

pir

功能概述

此代码执行以下任务:

  • 连接到指定的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波特率)确认连接和流传输状态。

pir

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(用于检查)

技术支持与产品讨论

感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您对我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...