reSpeaker XVF3800 USB Mic Array with XIAO ESP32S3 UDP Audio Streaming
概要
このプロジェクトでは、ReSpeaker XVF3800マイクロフォンアレイとXIAO ESP32S3ボードを使用したリアルタイム音声ストリーミングを実演します。音声はI2S経由でキャプチャされ、UDP経由でローカルマシン上で動作するサーバーに送信され、そこで.wavファイルとして保存・処理されます。
機能概要
このスケッチは以下のタスクを実行します:
- 指定されたWi-Fiネットワークに接続します。
- UDPサーバー(例:ホストPC上で動作するPythonスクリプト)に接続します。
- XIAO ESP32S3を使用してReSpeaker XVF3800からI2S経由でリアルタイム音声をキャプチャします。
- キャプチャした音声を生データとして送信します。
Arduinoコード
アップロード前に以下のフィールドを更新してください:
// WiFi credentials
const char* ssid = "Your-SSID";
const char* password = "WIFI-PASSWORD";
// UDP target
const char* udpAddress = "192.168.X.X"; // Change to PC/server IP
const int udpPort = 12345; // Port to send audio
完全なコード(約5秒間の音声をストリーミング)
#include "WiFi.h"
#include "WiFiUdp.h"
#include "AudioTools.h"
// WiFi credentials
const char* ssid = "Your-SSID";
const char* password = "WIFI-PASSWORD";
// UDP target
const char* udpAddress = "192.168.X.X"; // Change to PC/server IP
const int udpPort = 12345; // Port to send audio
WiFiUDP udp;
// Audio: 16kHz, stereo, 32-bit
AudioInfo info(16000, 2, 32);
I2SStream i2s_in;
I2SConfig i2s_config;
// 5 sec of audio = 128kB/s × 5 = 640 kB
#define PACKET_SIZE 1024
#define NUM_PACKETS 625 // 5 seconds worth
// Encoded WAV output to UDP
EncodedAudioStream out_stream(&udp, new WAVEncoder());
StreamCopy copier(out_stream, i2s_in, PACKET_SIZE);
void connectWiFi() {
Serial.printf("Connecting to WiFi: %s\n", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\nConnected!");
}
void setupI2SInput() {
i2s_config = i2s_in.defaultConfig(RX_MODE);
i2s_config.copyFrom(info);
// XVF3800 pins
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 input started.");
}
void setup() {
Serial.begin(115200);
AudioLogger::instance().begin(Serial, AudioLogger::Info);
connectWiFi();
setupI2SInput();
// Begin UDP
udp.begin(WiFi.localIP(), udpPort);
out_stream.begin(info);
// Start UDP transmission
Serial.printf("Sending 5 seconds of audio via UDP to %s:%d\n", udpAddress, udpPort);
udp.beginPacket(udpAddress, udpPort);
copier.copyN(NUM_PACKETS); // Copy exactly 5 sec of audio
udp.endPacket();
Serial.println("Finished sending 5 seconds of audio!");
}
void loop() {
// Nothing else, only runs once
}
シリアルモニター(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("Listening for audio...")
while True:
data, addr = sock.recvfrom(4096)
f.write(data)
音声の再生
ファイルが保存されたら(output.wav)、以下のような任意の音声プレーヤーで開くだけです:
- VLC
- Windows Media Player
- Audacity(検査用)
技術サポート & 製品ディスカッション
弊社製品をお選びいただきありがとうございます!弊社製品での体験が可能な限りスムーズになるよう、さまざまなサポートを提供しています。さまざまな好みやニーズに対応するため、複数のコミュニケーションチャンネルを提供しています。