nRF5340: Live I2S microphone audio streaming over BLE with low latency

Hi Nordic Team,

I am working on a custom device based on the nRF5340 SoC. My application captures live audio from an I2S microphone, processes the audio on the nRF5340, and then sends the audio over Bluetooth Low Energy.

My requirement is to achieve continuous live audio streaming from the nRF5340 to a mobile phone, with as little latency as possible.

Current implementation

The I2S microphone audio is continuously captured using the nRF5340.

I currently have two audio paths:

1. Local audio playback

The processed I2S audio is sent to a codec/headset connected to the device. I can listen to the audio through the headset with practically no noticeable delay.

2. BLE audio streaming

I am also trying to send the same live audio data over BLE to:

  • A custom Android application that I developed for audio playback
  • A custom Python tool for receiving and playing the audio

For BLE transmission, I am currently using:

bt_gatt_notify_cb(conn, &params);

Problem

The local headset playback works well without noticeable delay.

However, when I transmit the live audio over BLE and play the received data on my Android application or Python tool, I observe approximately 1 second of latency.

Problem

The local headset playback works well without noticeable delay.

However, when I transmit the live audio over BLE and play the received data on my Android application or Python tool, I observe approximately 1 second of latency.

For example:

If I tap my finger near the microphone, I hear the corresponding sound on the mobile phone/Python tool approximately 1 second later.

I would like to understand whether this latency is caused by the GATT notification-based approach, buffering, BLE connection parameters, or whether GATT is simply not the appropriate transport for continuous low-latency audio.

LE Audio / ISO question

While researching the nRF5340, I found that it supports features required for Bluetooth LE Audio, including Isochronous Channels, and that the nRF5340 is designed to support LC3 audio processing.

This made me consider using Bluetooth LE Audio (BAP/CIS/ISO) instead of sending the audio using GATT notifications.

My questions are:

  1. Can LE Audio be used to continuously stream live I2S microphone audio from an nRF5340-based device to a mobile phone with significantly lower latency than my current GATT notification implementation?
  2. Does Android 14/15 and newer support LE Audio connections from a custom BLE peripheral/source device?
  3. If I develop a custom Android application, can the application receive the LE Audio stream from my nRF5340 device and directly play the received live audio?
  4. If LE Audio is not suitable for my requirement, what is the recommended Nordic approach for achieving continuous low-latency live audio streaming from an nRF5340 to an Android phone?

    Current goal

    My main goal is:

    I2S microphone → nRF5340 processing → BLE → Android phone → real-time audio playback

    I am not looking to transfer recorded audio files. I need continuous live audio streaming, where an audio event occurring at the microphone should be heard on the phone with minimal latency.

  • Hi, 

    Can LE Audio be used to continuously stream live I2S microphone audio from an nRF5340-based device to a mobile phone with significantly lower latency than my current GATT notification implementation?

    Yes. With LE Audio, you can get latency down to a few tens of milliseconds. A phone supporting LE Audio should be able to receive.

    Does Android 14/15 and newer support LE Audio connections from a custom BLE peripheral/source device?

    Android has supported LE Audio for quite some time, starting with some support in Pixel 7 (2022). I believe versions 14 and 15 offer solid support for LE Audio. (Version 14 came in 2024.) (Android is at version 17 now, BTW.)

    If I develop a custom Android application, can the application receive the LE Audio stream from my nRF5340 device and directly play the received live audio?

    You probably can not do this unless you modify the Android OS itself. AFAIK, the OS takes control over the LE Audio services itself, making it difficult (impossible?) to access this from a user-space app. On the other hand, the OS may already handle what you need, so you might not need to build a custom app.

    If LE Audio is not suitable for my requirement, what is the recommended Nordic approach for achieving continuous low-latency live audio streaming from an nRF5340 to an Android phone?

    I would recommend sticking with LE Audio. If that isn't suitable, I do not really know. Google's own ASHA could be an option, but I am not sure whether it is still being maintained now that LE Audio is available.

    Regards,
    Amanda H.

Related