diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/core/BaseAudioTaskApi.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/core/BaseAudioTaskApi.java index 7abde72d..7a15e3d5 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/core/BaseAudioTaskApi.java +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/core/BaseAudioTaskApi.java @@ -164,12 +164,14 @@ public class BaseAudioTaskApi implements AutoCloseable { * * @param numChannels the number of audio channels. * @param sampleRate the audio sample rate. + * @param requiredInputBufferSize the required input buffer size in number of float elements. * @return an {@link android.media.AudioRecord} instance in {@link * android.media.AudioRecord#STATE_INITIALIZED} * @throws IllegalArgumentException if the model required channel count is unsupported * @throws IllegalStateException if AudioRecord instance failed to initialize */ - public static AudioRecord createAudioRecord(int numChannels, int sampleRate) { + public static AudioRecord createAudioRecord( + int numChannels, int sampleRate, int requiredInputBufferSize) { int channelConfig = 0; switch (numChannels) { case 1: @@ -190,6 +192,11 @@ public class BaseAudioTaskApi implements AutoCloseable { throw new IllegalStateException( String.format("AudioRecord.getMinBufferSize failed. Returned: %d", bufferSizeInBytes)); } + int bufferSizeMultiplier = 2; + int modelRequiredBufferSize = requiredInputBufferSize * Float.BYTES * bufferSizeMultiplier; + if (bufferSizeInBytes < modelRequiredBufferSize) { + bufferSizeInBytes = modelRequiredBufferSize; + } AudioRecord audioRecord = new AudioRecord( // including MIC, UNPROCESSED, and CAMCORDER. @@ -217,6 +224,6 @@ public class BaseAudioTaskApi implements AutoCloseable { */ public static AudioRecord createAudioRecord() { // TODO: Support creating AudioRecord based on the model specifications. - return createAudioRecord(1, 16000); + return createAudioRecord(1, 16000, 16000); } }