Built-in AEC cancels human voice — how to configure correctly?

We are testing built-in AEC (Acoustic Echo Canceler) on Samsung Tab A9+ (Model: SM-X210, Android 10).

When AEC is enabled, the human voice is significantly suppressed during music playback from a separate app (B.apk).

Our goal is to enable AEC while preserving the human voice clearly, even when music is playing.


Setup

  • apk – Recorder with AEC and NS enabled

if (android_recorder == null) {

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); // Required for AEC?

android_recorder = new AudioRecord(

      MediaRecorder.AudioSource.VOICE_COMMUNICATION, // AEC-supported source

      16000,

      AudioFormat.CHANNEL_IN_MONO,

      AudioFormat.ENCODING_PCM_16BIT,

      bufferSize * 2

);

}

// Enable built-in AEC

if (AcousticEchoCanceler.isAvailable()) {

AcousticEchoCanceler aec = AcousticEchoCanceler.create(android_recorder.getAudioSessionId());

if (aec != null) {

  aec.setEnabled(true);

  Log.d(TAG, "AEC enabled: " + aec.getEnabled());

}

}

// Enable Noise Suppressor

if (NoiseSuppressor.isAvailable()) {

NoiseSuppressor ns = NoiseSuppressor.create(android_recorder.getAudioSessionId());

if (ns != null) {

  ns.setEnabled(true);

  Log.d(TAG, "NS enabled: " + ns.getEnabled());

}

}

android_recorder.startRecording();

android_recorder.read(buffer, 0, bufferSize, AudioRecord.READ_BLOCKING);

  • apk – Playback using ExoPlayer

AudioAttributes audioAttributes = new AudioAttributes.Builder()

  .setUsage(C.USAGE_MEDIA) // Also tried C.USAGE_VOICE_COMMUNICATION

  .setContentType(C.CONTENT_TYPE_MUSIC)

  .build();

player = new SimpleExoPlayer.Builder(context)

  .setAudioAttributes(audioAttributes, /* handleAudioFocus= */ false)

  .build();

player.setPlayWhenReady(false);


Questions:

  • Is there any configuration we are missing to allow AEC to work correctly, while keeping the human voice intact?
  • Do we need any specific KNOX permissions?
  • How to capture audio playback for AEC to function correctly?
  • Can you provide us with sample code?

AEC seems to be a standard Android API and it doesn’t seem to say anything about canceling human voice or music playback. Are you sure the music volume isn’t just overpowering the voice volume? Try disabling dolby atmos and other effects from your device and check if it helps.