Using Android's build-in acoustic echo cancellation

12,511

I was finally able to get echo cancellation to work on my Arm5 (WM8650) processor (Android 2.2). Below are the steps I took.

  1. I wrapped Speex with JNI and called echo processing routines before sending PCM frames to encoder. No echo was canceled no matter what Speex settings I tried.

  2. Because Speex is very sensitive to delay between playback and echo frames I implemented a queue and queued all packets sent to AudioTrack. The size of the queue should be roughly equal to the size of internal AudioTrack buffer. This way packet were sent to echo_playback roughly at the time when AudioTrack send packets to the sound card from its internal buffer. The delay was removed with this approach but echo was still not cancelled

  3. I wrapped WebRtc echo cancellation part with JNI and called its methods before sending packets to encoder. The echo was still present but the library obviously was trying to cancel it.

  4. I applied the buffer technique described in P2 and it finally started to work. The delay needs to be adjusted for each device though. Note also that WebRtc has mobile and full version of echo cancellation. The full version substantially slows the processor and should probably be run on ARM7 only. The mobile version works but with lower quality

I hope this will help someone.

Share:
12,511
BenYL
Author by

BenYL

Updated on June 27, 2022

Comments

  • BenYL
    BenYL almost 2 years

    Does anyone know how to use Android device's built-in acoustic echo cancellation? It is located somewhere in silicon and is used for GSM/CDMA speakerphone calls. We'd really like to tap into it for a VoIP application instead of rolling our own.

    Ben

  • Sureshkumar Menon
    Sureshkumar Menon almost 12 years
    hi can u guide me how to make it work.i am struggling to cancel the echo when both device are in loudspeaker mode.
  • Dean Wild
    Dean Wild over 8 years
    Does the queue need to be the same size as the AudioTrack's internal buffer PLUS the size of the AudioRecord's internal buffer?
  • PKlumpp
    PKlumpp almost 8 years
    This is indeed true, but since API level 11, this is not really working on most of the devices I used so far. It just does, well, nothing....