Skip to main content

reSpeaker XVF3800 USB 麦克风阵列与 XIAO ESP32S3 DoA 和 VAD

简介

ReSpeaker XVF3800 是基于 XMOS XVF3800 的多麦克风语音处理解决方案,专为需要实时音频智能的嵌入式应用而设计。XVF3800 内部计算语音活动检测(VAD)和到达方向(DoA),以指示何时存在语音以及语音来源的方向。这些推理结果可以通过主机 MCU 使用基于资源的命令通过 I2C 直接访问,从而实现语音唤醒、声源定位和方向感知反馈等功能,而无需在主机上处理原始音频。

pir

note

支持此代码的固件是 respeaker_xvf3800_i2s_master_dfu_firmware_v1.0.x_48k_test5.bin。因此请确保首先刷写固件

Arduino 代码

#include <Wire.h>

#define XMOS_ADDR 0x2C // I2C 7-bit address

#define GPO_SERVICER_RESID 20
#define GPO_SERVICER_RESID_LED_EFFECT 12
#define GPO_SERVICER_RESID_DOA 19
#define GPO_DOA_READ_NUM_BYTES 4

void setup() {
Serial.begin(115200);
while (!Serial);
Wire.begin();
delay(2000);
Serial.println("XVF3800 DoA Read Test Starting...");
write_led_effect(4);
}

void loop() {
uint16_t doa_values[2] = {0};
uint8_t status = 0xFF;

bool success = read_doa_values((uint8_t *)doa_values, &status);

if (success) {
Serial.print("I2C Communication SUCCESS. Status byte: 0x");
Serial.print(status, HEX);
Serial.print(" | DOA_VALUE: ");
Serial.print(doa_values[0]);
Serial.print(" | SPEECH_DETECTED: ");
Serial.println(doa_values[1]);
} else {
Serial.println("Failed to read DoA values.");
}

delay(1000);
}

bool read_versions(uint8_t *buffer, uint8_t *status) {
const uint8_t resid = 48;
const uint8_t cmd = 0 | 0x80;
const uint8_t read_len = 3;

// Step 1: Write command
Wire.beginTransmission(XMOS_ADDR);
Wire.write(resid);
Wire.write(cmd);
Wire.write(read_len + 1);
uint8_t result = Wire.endTransmission();

if (result != 0) {
Serial.print("I2C Write Error: ");
Serial.println(result);
return false;
}

// Step 2: Read response (status + payload)
Wire.requestFrom(XMOS_ADDR, (uint8_t)(read_len + 1));
if (Wire.available() < read_len + 1) {
Serial.println("I2C Read Error: Not enough data received.");
return false;
}

*status = Wire.read();
for (uint8_t i = 0; i < read_len; i++) {
buffer[i] = Wire.read();
}

return true;
}

bool read_doa_values(uint8_t *buffer, uint8_t *status) {
const uint8_t resid = GPO_SERVICER_RESID;
const uint8_t cmd = GPO_SERVICER_RESID_DOA | 0x80;
const uint8_t read_len = GPO_DOA_READ_NUM_BYTES;

// Step 1: Write command
Wire.beginTransmission(XMOS_ADDR);
Wire.write(resid);
Wire.write(cmd);
Wire.write(read_len + 1);
uint8_t result = Wire.endTransmission();

if (result != 0) {
Serial.print("I2C Write Error: ");
Serial.println(result);
return false;
}

// Step 2: Read response (status + payload)
Wire.requestFrom(XMOS_ADDR, (uint8_t)(read_len + 1));
if (Wire.available() < read_len + 1) {
Serial.println("I2C Read Error: Not enough data received.");
return false;
}

*status = Wire.read();
for (uint8_t i = 0; i < read_len; i++) {
buffer[i] = Wire.read();
}

return true;
}

void write_led_effect(uint8_t effect) {
Wire.beginTransmission(XMOS_ADDR); // Begin I2C transmission to XVF3800
Wire.write(GPO_SERVICER_RESID); // Write the resource ID
Wire.write(GPO_SERVICER_RESID_LED_EFFECT); // Write the command ID
Wire.write(1); // Write number of payload bytes
Wire.write(effect); // Write each payload byte
Wire.endTransmission(); // End the I2C transmission
}

预期输出

pir

技术支持与产品讨论

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

Loading Comments...