By the way, I’ve got them to update their documentation, so it will actually make people flash the right FW :
wasnt that what it was earlier today?
the original file they were telling you to download was 1.0.5, but the command line was actually flashing 2.0.5. which is not compatible.
It looks like it’s not connecting. Check your antenna connection, I had things like this when antenna wasn’t connected/working properly.
I power with ESP USB.
So bought a full kit with speaker, case, that cam without the s3 already on (didnt know)bought my own . had it working until i tried to remove the speaker wire to install in case and the connecter ripped off the board. It now just boot loops dead.
Oh crap!
Those connectors are very bad, i had many, many occurrences of that in my life.
No way to solder that back on?
it looks like it pulled up 2 wires ( string like) that runs 1/4 way up the board witch is prob shorting out somethin
Ohhh i feel your pain!..
That’s a shame these connections are that brittle!
Uff, new HA release has action assist_satellite.announce
, and that actually works with this Respeaker code, since it is using new Nabu media_player
with announce possibility!
Looks like i already want to move all my satellites there. Announce is great, it’s using assist-specific TTS engine.
I imagine you cleaned the build files before doing this install since the wake word and listen light switches are gone, correct? Also, never hurts to power cycle the Seeed after installing. Usually not necessary but it is on occasion.
Can you read the logs over WiFi? Going by the screenshot everything went unavailable at exactly the same time. You can add a WiFi sensor to see the strength. I have never been a fan of Seeed not using ceramic antennas. It’s like they tried to make it smaller by leaving it out but once attached the antenna is bigger then the esp32. I was noticing slow upload speeds and it turned out the antenna wasn’t completely on correctly.
It would also help to post some log output over WiFi or plugged in to a PC. This will also show the WiFi strength without adding a sensor. If it’s slow over WiFi try putting it closer to your router to see if you get better results. Posting the config with the API/OTA and HS keys/passwords out could also help. Lastly, does the device show up in ESPHome as available (no red at the top)?
When all else fails I delete everything (backing up the YAML file obviously) and recreate everything from scratch. Once again, shouldn’t be needed but has fixed issues for me before in the past on rare occasions.
Wish I would have found this sooner as the acrylic case mount is garbage and easily comes lose as it has 2 sticky square pads to hold the board to the speaker. It does require a different 2" 3 watt speaker (linked on the page) but it works out to be 2 or 3 dollars more than the full kit. Obviously a 3D printer is needed, or a friend with one.
Hmm I didnt do a clean Build Files command before. Just did it now.
I have installed this atm but also have your version compiled and ready if needed. The stopping all addons was annoying so did it all in one go.
This went unavailable when I setup the New Respeaker Micro under Voice assistants. Need to play more I think. I gave up after my kids started looking at me funny. Ok Nabu, Ok Nabu… lol. They had never heard that word before.
substitutions:
voice_assist_idle_phase_id: "1"
voice_assist_listening_phase_id: "2"
voice_assist_thinking_phase_id: "3"
voice_assist_replying_phase_id: "4"
voice_assist_not_ready_phase_id: "10"
voice_assist_error_phase_id: "11"
voice_assist_muted_phase_id: "12"
esphome:
name: respeakerv3
friendly_name: respeakerv3
min_version: 2024.9.0
platformio_options:
board_build.flash_mode: dio
on_boot:
priority: 600
then:
- script.execute: adjust_led
- delay: 30s
- if:
condition:
lambda: return id(init_in_progress);
then:
- lambda: id(init_in_progress) = false;
- script.execute: adjust_led
esp32:
board: esp32-s3-devkitc-1
variant: esp32s3
flash_size: 8MB
framework:
type: esp-idf
version: recommended
sdkconfig_options:
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: "y"
CONFIG_ESP32S3_DATA_CACHE_64KB: "y"
CONFIG_ESP32S3_DATA_CACHE_LINE_64B: "y"
CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB: "y"
CONFIG_ESP32_S3_BOX_BOARD: "y"
CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY: "y"
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP: "y"
# Settings based on https://github.com/espressif/esp-adf/issues/297#issuecomment-783811702
CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM: "16"
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM: "512"
CONFIG_ESP32_WIFI_STATIC_TX_BUFFER: "y"
CONFIG_ESP32_WIFI_TX_BUFFER_TYPE: "0"
CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM: "8"
CONFIG_ESP32_WIFI_CACHE_TX_BUFFER_NUM: "32"
CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED: "y"
CONFIG_ESP32_WIFI_TX_BA_WIN: "16"
CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED: "y"
CONFIG_ESP32_WIFI_RX_BA_WIN: "32"
CONFIG_LWIP_MAX_ACTIVE_TCP: "16"
CONFIG_LWIP_MAX_LISTENING_TCP: "16"
CONFIG_TCP_MAXRTX: "12"
CONFIG_TCP_SYNMAXRTX: "6"
CONFIG_TCP_MSS: "1436"
CONFIG_TCP_MSL: "60000"
CONFIG_TCP_SND_BUF_DEFAULT: "65535"
CONFIG_TCP_WND_DEFAULT: "65535" # Adjusted from linked settings to avoid compilation error
CONFIG_TCP_RECVMBOX_SIZE: "512"
CONFIG_TCP_QUEUE_OOSEQ: "y"
CONFIG_TCP_OVERSIZE_MSS: "y"
CONFIG_LWIP_WND_SCALE: "y"
CONFIG_TCP_RCV_SCALE: "3"
CONFIG_LWIP_TCPIP_RECVMBOX_SIZE: "512"
CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST: "y"
CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY: "y"
psram:
mode: octal # quad for N8R2 and octal for N16R8
speed: 80MHz
external_components:
- source:
type: git
url: https://github.com/esphome/voice-kit
ref: dev
components:
- aic3204
- audio_dac
- media_player
- micro_wake_word
- microphone
- nabu
- nabu_microphone
- voice_assistant
- voice_kit
refresh: 0s
api:
encryption:
key: "removed"
on_client_connected:
- script.execute: adjust_led
on_client_disconnected:
- script.execute: adjust_led
ota:
- platform: esphome
id: ota_esphome
password: "removed"
logger:
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
on_connect:
- script.execute: adjust_led
on_disconnect:
- script.execute: adjust_led
#ssid: !secret wifi_ssid
#password: !secret wifi_password
#manual_ip:
# static_ip: !secret respeaker_satellite_1_ip
# gateway: !secret gateway
# subnet: !secret subnet
# dns1: !secret dns1
captive_portal:
switch:
- platform: template
id: timer_ringing
optimistic: true
internal: true
restore_mode: ALWAYS_OFF
on_turn_on:
# Duck audio
- nabu.set_ducking:
decibel_reduction: 20
duration: 0.0s
# Ring timer
- script.execute: ring_timer
# Refresh LED
- script.execute: adjust_led
# If 15 minutes have passed and the timer is still ringing, stop it.
- delay: 15min
- switch.turn_off: timer_ringing
on_turn_off:
# Stop any current annoucement (ie: stop the timer ring mid playback)
- if:
condition:
lambda: return id(nabu_media_player)->state == media_player::MediaPlayerState::MEDIA_PLAYER_STATE_ANNOUNCING;
then:
lambda: |-
id(nabu_media_player)
->make_call()
.set_command(media_player::MediaPlayerCommand::MEDIA_PLAYER_COMMAND_STOP)
.set_announcement(true)
.perform();
# Set back ducking ratio to zero
- nabu.set_ducking:
decibel_reduction: 0
duration: 1.0s
# Refresh the LED ring
- script.execute: adjust_led
button:
- platform: safe_mode
id: button_safe_mode
name: Safe Mode Boot
- platform: factory_reset
id: factory_reset_btn
name: Factory reset
- platform: restart
name: Restart
id: but_rest
binary_sensor:
- platform: gpio
pin:
number: GPIO4 # D3
inverted: true
id: mute
name: "Mute"
- platform: gpio
pin:
number: GPIO3 # D2
inverted: true
id: user_button
name: "User button"
on_multi_click:
- timing:
- ON for at most 1s
- OFF for at least 0.25s
then:
- if:
condition:
lambda: return !id(init_in_progress);
then:
- if:
condition:
switch.is_on: timer_ringing
then:
- switch.turn_off: timer_ringing
else:
- if:
condition:
lambda: return id(nabu_media_player)->state == media_player::MediaPlayerState::MEDIA_PLAYER_STATE_ANNOUNCING;
then:
- lambda: |
id(nabu_media_player)
->make_call()
.set_command(media_player::MediaPlayerCommand::MEDIA_PLAYER_COMMAND_STOP)
.set_announcement(true)
.perform();
else:
- if:
condition:
voice_assistant.is_running:
then:
- voice_assistant.stop:
else:
- if:
condition:
media_player.is_playing:
then:
- media_player.pause:
else:
- if:
condition:
and:
# - switch.is_off: master_mute_switch
- not:
voice_assistant.is_running
then:
- voice_assistant.start:
light:
- platform: esp32_rmt_led_strip
id: led_ww
rgb_order: GRB
pin: GPIO1
num_leds: 1
rmt_channel: 0
chipset: ws2812
name: none
disabled_by_default: true
entity_category: config
default_transition_length: 0s
effects:
- pulse:
- pulse:
name: "Fast Pulse"
transition_length: 100ms
update_interval: 100ms
min_brightness: 50%
max_brightness: 100%
- pulse:
name: "Slow Pulse"
transition_length: 250ms
update_interval: 250ms
min_brightness: 50%
max_brightness: 100%
# Audio and Voice Assistant Config
i2s_audio:
- id: i2s_output
i2s_lrclk_pin:
number: GPIO7
allow_other_uses: true
i2s_bclk_pin:
number: GPIO8
allow_other_uses: true
i2s_mclk_pin:
number: GPIO9
allow_other_uses: true
- id: i2s_input
i2s_lrclk_pin:
number: GPIO7
allow_other_uses: true
i2s_bclk_pin:
number: GPIO8
allow_other_uses: true
i2s_mclk_pin:
number: GPIO9
allow_other_uses: true
microphone:
- platform: nabu_microphone
i2s_din_pin: GPIO44
adc_type: external
pdm: false
sample_rate: 16000
bits_per_sample: 32bit
i2s_mode: secondary
i2s_audio_id: i2s_input
channel_0:
id: nabu_mic_mww
channel_1:
id: nabu_mic_va
media_player:
- platform: nabu
id: nabu_media_player
name: Media Player
internal: false
sample_rate: 16000
i2s_dout_pin: GPIO43
bits_per_sample: 32bit
i2s_mode: secondary
i2s_audio_id: i2s_output
volume_increment: 0.05
volume_min: 0.4
volume_max: 0.85
on_announcement:
- nabu.set_ducking:
decibel_reduction: 20
duration: 0.0s
on_state:
if:
condition:
and:
- switch.is_off: timer_ringing
- not:
voice_assistant.is_running:
- not:
lambda: return id(nabu_media_player)->state == media_player::MediaPlayerState::MEDIA_PLAYER_STATE_ANNOUNCING;
then:
- nabu.set_ducking:
decibel_reduction: 0
duration: 1.0s
micro_wake_word:
models:
- model: https://github.com/kahrendt/microWakeWord/releases/download/okay_nabu/okay_nabu.json
vad:
microphone: nabu_mic_mww
on_wake_word_detected:
# If a timer is ringing: Stop it, do not start the voice assistant (We can stop timer from voice!)
- if:
condition:
switch.is_on: timer_ringing
then:
- switch.turn_off: timer_ringing
# Start voice assistant, stop current announcement.
else:
- if:
condition:
lambda: return id(nabu_media_player)->state == media_player::MediaPlayerState::MEDIA_PLAYER_STATE_ANNOUNCING;
then:
lambda: |-
id(nabu_media_player)
->make_call()
.set_command(media_player::MediaPlayerCommand::MEDIA_PLAYER_COMMAND_STOP)
.set_announcement(true)
.perform();
- voice_assistant.start:
wake_word: !lambda return wake_word;
voice_assistant:
id: va
microphone: nabu_mic_va
media_player: nabu_media_player
noise_suppression_level: 0
auto_gain: 0dBFS
volume_multiplier: 1
on_client_connected:
- lambda: id(init_in_progress) = false;
- micro_wake_word.start:
- lambda: id(voice_assistant_phase) = ${voice_assist_idle_phase_id};
- script.execute: adjust_led
on_client_disconnected:
- voice_assistant.stop:
- lambda: id(voice_assistant_phase) = ${voice_assist_not_ready_phase_id};
- script.execute: adjust_led
on_error:
- if:
condition:
lambda: return !id(init_in_progress);
then:
- lambda: id(voice_assistant_phase) = ${voice_assist_error_phase_id};
- script.execute: adjust_led
- delay: 1s
- lambda: id(voice_assistant_phase) = ${voice_assist_idle_phase_id};
- script.execute: adjust_led
on_start:
- nabu.set_ducking:
decibel_reduction: 20 # Number of dB quieter; higher implies more quiet, 0 implies full volume
duration: 0.0s # The duration of the transition (default is 0)
on_listening:
- lambda: id(voice_assistant_phase) = ${voice_assist_listening_phase_id};
- script.execute: adjust_led
on_stt_vad_end:
- lambda: id(voice_assistant_phase) = ${voice_assist_thinking_phase_id};
- script.execute: adjust_led
on_tts_start:
- lambda: id(voice_assistant_phase) = ${voice_assist_replying_phase_id};
- script.execute: adjust_led
on_end:
- wait_until:
not:
voice_assistant.is_running:
- nabu.set_ducking:
decibel_reduction: 0 # 0 dB means no reduction
duration: 1.0s
- lambda: id(voice_assistant_phase) = ${voice_assist_idle_phase_id};
- script.execute: adjust_led
on_timer_finished:
- switch.turn_on: timer_ringing
script:
- id: ring_timer
then:
- while:
condition:
switch.is_on: timer_ringing
then:
- media_player.play_media: http://192.168.0.110:8123/local/sounds/timer-ding.mp3
- delay: 1s
- wait_until:
not:
media_player.is_playing:
- id: adjust_led
then:
- if:
condition:
lambda: return !id(init_in_progress);
then:
- if:
condition:
switch.is_on: timer_ringing
then:
- light.turn_on:
id: led_ww
red: 0%
green: 100%
blue: 0%
brightness: 60%
effect: fast pulse
else:
- if:
condition:
wifi.connected:
then:
- if:
condition:
api.connected:
then:
- lambda: |
switch(id(voice_assistant_phase)) {
case ${voice_assist_listening_phase_id}:
id(led_ww).turn_on()
.set_brightness(0.6)
.set_rgb(1.0, 0.2, 1.0)
.set_effect("Slow Pulse")
.perform();
break;
case ${voice_assist_thinking_phase_id}:
id(led_ww).turn_on()
.set_brightness(0.6)
.set_rgb(1.0, 0.2, 1.0)
.set_effect("Fast Pulse")
.perform();
break;
case ${voice_assist_replying_phase_id}:
id(led_ww).turn_on()
.set_brightness(0.6)
.set_rgb(0.2, 1.0, 1.0)
.set_effect("Slow Pulse")
.perform();
break;
case ${voice_assist_error_phase_id}:
id(led_ww).turn_on()
.set_brightness(0.6)
.set_rgb(1.0, 1.0, 0.2)
.set_effect("Fast Pulse")
.perform();
break;
case ${voice_assist_muted_phase_id}:
id(led_ww).turn_on()
.set_brightness(0.3)
.set_rgb(1.0, 0.0, 0.0)
.perform();
break;
case ${voice_assist_not_ready_phase_id}:
id(led_ww).turn_on()
.set_brightness(0.3)
.set_rgb(1.0, 1.0, 0.2)
.perform();
break;
default:
id(led_ww).turn_off()
.perform();
}
else:
- light.turn_on:
id: led_ww
red: 100%
green: 0%
blue: 0%
brightness: 40%
effect: fast pulse
else:
- light.turn_on:
id: led_ww
red: 100%
green: 0%
blue: 0%
brightness: 40%
effect: slow pulse
else:
- light.turn_on:
id: led_ww
red: 100%
green: 100%
blue: 0%
brightness: 30%
effect: slow pulse
globals:
- id: init_in_progress
type: bool
restore_value: false
initial_value: "true"
- id: voice_assistant_phase
type: int
restore_value: false
initial_value: ${voice_assist_not_ready_phase_id}
I still have 2x bare Respeakers, and actually have Xiao S3 boards and exactly that speakers from Amazon.
But I’m thinking doing something more presentable. Will try to do some modeling on the weekend.
By the way, that default mount might be flimsy, but it actually buffers the speaker and the board from vibration. I scratched off the sticky tape from that cubes and added a drop of super glue.
Seems like it should be working. Only minor issue is no AP specified but captive_portal: is This shouldn’t cause issues but captive_portal is specifically for connecting to the AP hotspot to enter in your wifi creds. I would probably just add it even though it doesn’t become a drive until it can’t connect to WiFi after 60 seconds per the docs.
I also noticed the the previous screen screenshot there is an entry under Diagnostics that says “away” and wasn’t sure what that was all about. Is it still there after the clean build files and new install?
Lastly, are you doing installs over WiFi now or still plugging in the XIAO to a PC or laptop? If laptop/PC I would verify you can bring up the logs over WiFi. From the screenshot above it seems like “assist in progress” is the only thing not greyed out.
EDIT: You do have the ESPHome secrets file setup,.correct? Seeeds example has you hard code the credentials so just asking to make sure.
Regardless the logs via wifi should be similar.to the below.
Logs respeakerv3.yaml
INFO ESPHome 2024.9.2
INFO Reading configuration /config/esphome/respeakerv3.yaml...
INFO Updating https://github.com/esphome/voice-kit@dev
WARNING GPIO3 is a strapping PIN and should only be used for I/O with care.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
INFO Starting log output from 192.168.0.250 using esphome API
INFO Successfully connected to respeakerv3 @ 192.168.0.250 in 0.152s
INFO Successful handshake with respeakerv3 @ 192.168.0.250 in 0.084s
[21:48:47][I][app:100]: ESPHome version 2024.9.2 compiled on Oct 1 2024, 23:27:46
[21:48:47][C][wifi:600]: WiFi:
[21:48:47][C][wifi:428]: Local MAC: 24:EC:4A:00:09:4C
[21:48:47][C][wifi:433]: SSID: [redacted]
[21:48:47][C][wifi:436]: IP Address: 192.168.0.250
[21:48:47][C][wifi:440]: BSSID: [redacted]
[21:48:47][C][wifi:441]: Hostname: 'respeakerv3'
[21:48:47][C][wifi:443]: Signal strength: -72 dB ▂▄▆█
[21:48:47][C][wifi:447]: Channel: 11
[21:48:47][C][wifi:448]: Subnet: 255.255.255.0
[21:48:47][C][wifi:449]: Gateway: 192.168.0.1
[21:48:47][C][wifi:450]: DNS1: 192.168.0.1
[21:48:47][C][wifi:451]: DNS2: 0.0.0.0
[21:48:47][C][logger:185]: Logger:
[21:48:47][C][logger:186]: Level: DEBUG
[21:48:47][C][logger:188]: Log Baud Rate: 115200
[21:48:47][C][logger:189]: Hardware UART: USB_SERIAL_JTAG
[21:48:47][C][gpio.binary_sensor:015]: GPIO Binary Sensor 'Mute'
[21:48:47][C][gpio.binary_sensor:016]: Pin: GPIO4
[21:48:48][C][esp32_rmt_led_strip:187]: ESP32 RMT LED Strip:
[21:48:48][C][esp32_rmt_led_strip:188]: Pin: 1
[21:48:48][C][esp32_rmt_led_strip:189]: Channel: 0
[21:48:48][C][esp32_rmt_led_strip:214]: RGB Order: GRB
[21:48:48][C][esp32_rmt_led_strip:215]: Max refresh rate: 0
[21:48:48][C][esp32_rmt_led_strip:216]: Number of LEDs: 1
[21:48:48][C][gpio.binary_sensor:015]: GPIO Binary Sensor 'User button'
[21:48:48][C][gpio.binary_sensor:016]: Pin: GPIO3
[21:48:48][C][light:103]: Light 'Respeakerv3'
[21:48:48][C][light:105]: Default Transition Length: 0.0s
[21:48:48][C][light:106]: Gamma Correct: 2.80
[21:48:48][C][template.switch:068]: Template Switch 'timer_ringing'
[21:48:48][C][template.switch:091]: Restore Mode: always OFF
[21:48:48][C][template.switch:057]: Optimistic: YES
[21:48:48][C][psram:020]: PSRAM:
[21:48:48][C][psram:021]: Available: YES
[21:48:48][C][psram:024]: Size: 8191 KB
[21:48:48][C][safe_mode.button:024]: Safe Mode Button 'Safe Mode Boot'
[21:48:48][C][safe_mode.button:024]: Icon: 'mdi:restart-alert'
[21:48:48][C][factory_reset.button:011]: Factory Reset Button 'Factory reset'
[21:48:48][C][factory_reset.button:011]: Icon: 'mdi:restart-alert'
[21:48:48][C][restart.button:017]: Restart Button 'Restart'
[21:48:48][C][restart.button:017]: Icon: 'mdi:restart'
[21:48:48][C][captive_portal:089]: Captive Portal:
[21:48:48][C][mdns:116]: mDNS:
[21:48:48][C][mdns:117]: Hostname: respeakerv3
[21:48:48][C][esphome.ota:073]: Over-The-Air updates:
[21:48:48][C][esphome.ota:074]: Address: respeakerv3.local:3232
[21:48:48][C][esphome.ota:075]: Version: 2
[21:48:48][C][esphome.ota:078]: Password configured
[21:48:48][C][safe_mode:018]: Safe Mode:
[21:48:48][C][safe_mode:020]: Boot considered successful after 60 seconds
[21:48:48][C][safe_mode:021]: Invoke after 10 boot attempts
[21:48:48][C][safe_mode:023]: Remain in safe mode for 300 seconds
[21:48:48][C][api:139]: API Server:
[21:48:48][C][api:140]: Address: respeakerv3.local:6053
[21:48:48][C][api:142]: Using noise encryption: YES
[21:48:48][C][micro_wake_word:072]: microWakeWord:
[21:48:48][C][micro_wake_word:073]: models:
[21:48:48][C][micro_wake_word:015]: - Wake Word: okay nabu
[21:48:48][C][micro_wake_word:016]: Probability cutoff: 0.97
[21:48:48][C][micro_wake_word:017]: Sliding window size: 5
[21:48:48][C][micro_wake_word:021]: - VAD Model
[21:48:48][C][micro_wake_word:022]: Probability cutoff: 0.50
[21:48:48][C][micro_wake_word:023]: Sliding window size: 5
[21:50:58][D][micro_wake_word:347]: Detected 'okay nabu' with sliding average probability is 0.99 and max probability is 1.00
[21:50:58][D][voice_assistant:512]: State changed from IDLE to START_MICROPHONE
As usual super glue seems like the solution to my main issue. I just don’t like it falling off and yanking on the JST wire, especially after that post above. Super Glue and duct tape can fix almost anything although duct tape tends to lose some style points unless hidden.
Omg after multiple flashs, removal from esphome integration and the lot it finally works. woo hoo!!!
The performance is still crap though. My fault for expecting miracles. lol
Sorry dont mean to be nasty or anything. Just an observation I guess. I havent used it with local AI which was taking too long in my initial tests. Might try that.
Also I had to enable the respeakerv3 led to make it work after the flash. The seeed code it was working on its own.
Hi!
Does anyhave have the JTAG pinout of the ReSpeaker Lite available?
(We really need the schematic. Don’t want to find all the details by manually measuring.)
I plan to use my XMOS XTAG4 adapter to experiment with custom builds (I2S/UA variants) of the XMOS firmware from here with 48kHz enabled instead of the default 16kHz.
One could try that without a XTAG4 adapter, but I feel more comfortable when I am able to reflash in case of failing firmware images.
The design files of the XTAG-4 adapter can be found here. Fun fact: it also includes a XU-316 chip and could be reflashed.
Great news!
Maybe you could open up another thread for further discussions?
I have a couple of questions. Especially about the used XMOS processor and its firmware, because you are using 4 mics instead of only 2.
New thread created