我正在尝试为语音检测器编程。到目前为止,我可以使用音频记录读取音频数据,但是获得了怪异的频率响应。

我正在这样读取数据:

private int channelConfiguration = AudioFormat.CHANNEL_IN_MONO;
private int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
private int sampleRate = 44100;
private int frameByteSize = 1024;
short[] buffer;

int recBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfiguration, audioEncoding);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, channelConfiguration, audioEncoding, recBufSize);
buffer = new short[frameByteSize];

audioRecord.read(buffer, 0, frameByteSize);

为了进行校准,我使用FFT将输入音频转换到频域并获得最大值。
然后,我在Matlab中创建音频音调,就像这里的How do you generate dual tone frequencies in MATLAB?一样,然后播放它们。我获得了300至20000 Hz的良好读数。在300 Hz之前,我没有很好的结果,只是振荡值。这使我认为存在某种频带滤波器。

另外,我还面临其他问题。频率响应在较低频率下也有增益。

我录制的音频完全无声,有声音和背景噪音,这就是频率响应。

在静音情况下录制时得到了以下信息:

录制语音时,我得到以下提示:

从图中可以看出,增益非常小,例如从1000到7000Hz。

我的问题是,是否有一种方法可以避免或禁用android默认具有的增益或过滤器。

注意:我尝试通过将媒体记录器更改为语音识别(MediaRecorder.AudioSource.VOICE_RECOGNITION),它具有相同的行为。

注意:我正在使用NEXUS 7设备。

最佳答案

您可以使用低通滤波器或任何其他平滑滤波器来滤除尖峰。

09-11 10:57