Skip to main content

reSpeaker XVF3800 USB 麦克风阵列与 XIAO ESP32S3 MQTT 音频流

概述

本项目演示了如何流式传输从嵌入 XIAO ESP32S3 开发板的 ReSpeaker XVF3800 麦克风阵列捕获的音频,并将其作为 .wav 文件传输到 MQTT 代理。音频通过 I2S 捕获,以 WAV 格式编码,并通过 MQTT 发布。

pir

库文件

Arduino MQTT Client

功能概述

此代码执行以下操作:

  • 连接到指定的 WiFi 网络。
  • 连接到 MQTT 代理(例如 test.mosquitto.org)。
  • 使用 I2S 从 ReSpeaker XVF3800 与 XIAO ESP32S3 捕获实时音频
  • 将音频编码为 WAV 格式
  • 将音频作为单个 MQTT 消息发布。
  • 使用 poll() 保持 MQTT 连接活跃。

Arduino 代码

上传前请更新这些字段:

const char* ssid = "your-SSID";
const char* password = "your-WIFI-password";
const char* broker = "test.mosquitto.org";
const char* topic = "xvf3800/audio.wav";
int port = 1883;

完整代码(流式传输约3秒音频)

#include "WiFi.h"                // 用于WiFi连接
#include "ArduinoMqttClient.h" // 用于MQTT通信
#include "AudioTools.h" // 用于处理I2S音频和WAV编码

// 定义要发送的音频数据量
#define MQTT_PACKET_SIZE 1024 // 每个MQTT数据包的大小(以字节为单位)
#define NUM_PACKETS 375 // 要发送的数据包数量(16kHz下约3秒音频)

// WiFi网络凭据
const char* ssid = "your-SSID"; // 替换为您的WiFi SSID
const char* password = "your-WIFI-password"; // 替换为您的WiFi密码

// MQTT代理配置
const char* broker = "test.mosquitto.org"; // 公共测试MQTT代理
const char* topic = "xvf3800/audio.wav"; // 发布音频的主题
int port = 1883; // 标准MQTT端口

// 创建MQTT和WiFi客户端
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);

// 配置音频:16kHz采样率,立体声(2通道),每样本32位
AudioInfo info(16000, 2, 32);
I2SStream i2s_in; // I2S音频输入流
I2SConfig i2s_config; // I2S硬件配置

// 以WAV格式编码音频并通过MQTT发送的流
EncodedAudioStream out_stream(&mqttClient, new WAVEncoder());
StreamCopy copier(out_stream, i2s_in, MQTT_PACKET_SIZE); // 处理将I2S数据复制到MQTT流中

// 连接到WiFi网络
void connectWiFi() {
Serial.printf("连接到WiFi: %s\n", ssid);
WiFi.begin(ssid, password); // 开始WiFi连接
while (WiFi.status() != WL_CONNECTED) { // 等待直到连接成功
Serial.print(".");
delay(1000);
}
Serial.println("\n已连接到WiFi!");
}

// 连接到MQTT代理
void connectMQTT() {
mqttClient.setId("xvf3800_stream"); // 设置MQTT客户端ID
Serial.printf("连接到MQTT代理: %s\n", broker);

if (!mqttClient.connect(broker, port)) { // 尝试连接到MQTT
Serial.print("MQTT连接失败! 错误代码: ");
Serial.println(mqttClient.connectError());
while (true); // 如果连接失败则停止在这里
}

Serial.println("已连接到MQTT代理!");
}

// 设置I2S音频输入配置
void setupI2SInput() {
i2s_config = i2s_in.defaultConfig(RX_MODE); // 设置RX模式用于音频输入
i2s_config.copyFrom(info); // 将音频格式应用到配置

// 为XVF3800分配正确的GPIO引脚
i2s_config.pin_bck = 8; // 位时钟
i2s_config.pin_ws = 7; // 字选择(LR时钟)
i2s_config.pin_data = 44; // RX模式下不使用,但库需要
i2s_config.pin_data_rx = 43; // 来自XVF3800的数据输入引脚
i2s_config.is_master = true; // XVF3800提供时钟,所以此板作为主设备

i2s_in.begin(i2s_config); // 使用给定配置初始化I2S输入
Serial.println("I2S输入已启动。");
}

void setup() {
Serial.begin(115200); // 启动串口监视器
AudioLogger::instance().begin(Serial, AudioLogger::Info); // 启用音频调试日志

connectWiFi(); // 连接到WiFi
connectMQTT(); // 连接到MQTT
setupI2SInput(); // 配置并启动I2S音频输入

out_stream.begin(info); // 使用音频格式初始化WAV编码器

// 开始新的MQTT消息并为完整音频流预留足够空间
mqttClient.beginMessage(topic, MQTT_PACKET_SIZE * NUM_PACKETS, true);

// 将音频从麦克风(I2S)复制到MQTT流中
copier.copyN(NUM_PACKETS); // 复制固定数量的数据包(3秒音频)

mqttClient.endMessage(); // 完成MQTT消息并发送
Serial.println("音频流已通过MQTT发送!");
}

void loop() {
mqttClient.poll(); // 保持MQTT连接活跃(如果代理需要ping则很重要)
delay(5000); // 可选延迟,在重复录制时有用
}

使用串口监视器(115200波特率)确认连接和流传输状态。

pir

Python脚本(接收并保存音频)

import paho.mqtt.client as mqtt

broker = "test.mosquitto.org"
port = 1883
topic = "xvf3800/audio.wav"
output_file = "output.wav"
audio_data = bytearray()

def on_message(client, userdata, msg):
global audio_data
print("🔊 Received audio message")
audio_data.extend(msg.payload)

with open(output_file, "wb") as f:
f.write(audio_data)
print(f"✅ WAV file saved as: {output_file}")

client = mqtt.Client()
client.on_message = on_message

print(f"Connecting to MQTT broker {broker}...")
client.connect(broker, port, 60)

client.subscribe(topic)
print(f"📡 Subscribed to: {topic}")
client.loop_forever()

播放音频

文件保存完成后(output.wav),只需使用任何音频播放器打开即可,例如:

  • VLC
  • Windows Media Player
  • Audacity(用于检查)

技术支持与产品讨论

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

Loading Comments...