Support AudioRecord in MediaPipe audio tasks in Java.
PiperOrigin-RevId: 501019327
This commit is contained in:
parent
b747fc481b
commit
25abd122b3
|
@ -14,6 +14,9 @@
|
||||||
|
|
||||||
package com.google.mediapipe.tasks.audio.core;
|
package com.google.mediapipe.tasks.audio.core;
|
||||||
|
|
||||||
|
import android.media.AudioFormat;
|
||||||
|
import android.media.AudioRecord;
|
||||||
|
import android.media.MediaRecorder;
|
||||||
import com.google.mediapipe.framework.MediaPipeException;
|
import com.google.mediapipe.framework.MediaPipeException;
|
||||||
import com.google.mediapipe.framework.Packet;
|
import com.google.mediapipe.framework.Packet;
|
||||||
import com.google.mediapipe.tasks.components.containers.AudioData;
|
import com.google.mediapipe.tasks.components.containers.AudioData;
|
||||||
|
@ -149,4 +152,71 @@ public class BaseAudioTaskApi implements AutoCloseable {
|
||||||
public void close() {
|
public void close() {
|
||||||
runner.close();
|
runner.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an {@link android.media.AudioRecord} instance to record audio stream. The returned
|
||||||
|
* AudioRecord instance is initialized and client needs to call {@link
|
||||||
|
* android.media.AudioRecord#startRecording} method to start recording.
|
||||||
|
*
|
||||||
|
* <p>Note that MediaPipe Audio tasks will up/down sample automatically to fit the sample rate
|
||||||
|
* required by the model. The default sample rate of the MediaPipe pretrained audio model, Yamnet,
|
||||||
|
* is 16kHz.
|
||||||
|
*
|
||||||
|
* @param numChannels the number of audio channels.
|
||||||
|
* @param sampleRate the audio sample rate.
|
||||||
|
* @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) {
|
||||||
|
int channelConfig = 0;
|
||||||
|
switch (numChannels) {
|
||||||
|
case 1:
|
||||||
|
channelConfig = AudioFormat.CHANNEL_IN_MONO;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
channelConfig = AudioFormat.CHANNEL_IN_STEREO;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"getAudioRecord method only supports 1 or 2 audio channels.");
|
||||||
|
}
|
||||||
|
|
||||||
|
int bufferSizeInBytes =
|
||||||
|
AudioRecord.getMinBufferSize(sampleRate, channelConfig, AudioFormat.ENCODING_PCM_FLOAT);
|
||||||
|
if (bufferSizeInBytes == AudioRecord.ERROR
|
||||||
|
|| bufferSizeInBytes == AudioRecord.ERROR_BAD_VALUE) {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
String.format("AudioRecord.getMinBufferSize failed. Returned: %d", bufferSizeInBytes));
|
||||||
|
}
|
||||||
|
AudioRecord audioRecord =
|
||||||
|
new AudioRecord(
|
||||||
|
// including MIC, UNPROCESSED, and CAMCORDER.
|
||||||
|
MediaRecorder.AudioSource.VOICE_RECOGNITION,
|
||||||
|
sampleRate,
|
||||||
|
channelConfig,
|
||||||
|
AudioFormat.ENCODING_PCM_FLOAT,
|
||||||
|
bufferSizeInBytes);
|
||||||
|
if (audioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
|
||||||
|
throw new IllegalStateException(String.format("AudioRecordfailed to initialize"));
|
||||||
|
}
|
||||||
|
return audioRecord;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an {@link android.media.AudioRecord} instance to record audio stream that has mono
|
||||||
|
* channel at sample rate at sample rate 16kHz, the sample rate required for models like Yamnet.
|
||||||
|
* The returned AudioRecord instance is initialized and client needs to call {@link
|
||||||
|
* android.media.AudioRecord#startRecording} method to start recording.
|
||||||
|
*
|
||||||
|
* @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() {
|
||||||
|
// TODO: Support creating AudioRecord based on the model specifications.
|
||||||
|
return createAudioRecord(1, 16000);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user