Home/Case Studies/VoiceRelay Live Audio Relay
Back to case studies
Mobile / Real-Time Audio Case Study

VoiceRelay: A Live Bluetooth Mic to Speaker Relay

Pick a Bluetooth microphone, pick a speaker, and the phone carries your voice between them live. The hard part is not the routing but the echo, so the app cancels its own.

KotlinJetpack ComposeC++OboeDSP
VoiceRelay Live Audio Relay

The Problem

A PA system is overkill for an announcement, a classroom or a shop floor, and a phone already has the radio and the processing power. But Android does not make it easy to record from one Bluetooth device and play to another at once, and once the microphone and speaker share a room, they feed each other.

The Audio Engine

Full-duplex and callback-driven in C++ on Oboe, with a lock-free ring buffer between input and output. No allocation, no locks and no logging inside the audio callbacks. The buffer grows when the platform reports underruns and shrinks back when things settle.

Echo Cancellation, From Scratch

Android's canceller is built for handset-length delays, not a Bluetooth speaker 150 to 400 ms away. The relay estimates the delay with GCC-PHAT, subtracts the echo with a 768-tap NLMS filter that freezes if it ever starts adding energy, and protects double talk so it never removes the voice it is carrying.

How the relay cancels its own echo

Honest Status

The C++ core and the Android app are built and run. Latency figures in the screenshots were measured on the development device. The Bluetooth path still has to be validated on physical hardware, so no Bluetooth performance is claimed.

Need real-time audio in a mobile app?

Low-latency engines, native modules and DSP that survives a real room. Baydot builds the audio layer your app sits on.

Book a Free Call