在Android上查找语音音调

Ill*_*lia 5 java audio android fft

如何从我的语音记录中找到min,max,mean,std dev pitch?我使用AudioRecord录制我的声音.

frequency = 8000;
channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

recordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC,frequency, channelConfiguration, audioEncoding, bufferSize);
Run Code Online (Sandbox Code Playgroud)

我使用FFT算法处理语音原始数据并得到浮点数[]

我使用这个功能后:

private float[] spectrumAnalyz(float[] spectr) {
float Re;
float Im;
float[] spectruData = spectr;
float[] mySpectrum = new float[(spectruData.length / 2) - 1];
for (int i = 1, j = 0; i < spectruData.length / 2; i++, j++) {
Re = spectruData[2 * i];
Im = spectruData[2 * i + 1];
mySpectrum[j] = (float) Math.sqrt(Re * Re + Im * Im);
}
return mySpectrum;
}
Run Code Online (Sandbox Code Playgroud)

这个函数返回频率数组.在谷歌搜索后我发现这个公式 http://en.wikipedia.org/wiki/Pitch_(music)

pitch = 69+12*log2(F/440Hz), where F is frequency in Hz.
Run Code Online (Sandbox Code Playgroud)

使用这个公式我可以找到min,max,mean和std dev pitch.

一切都正确吗?

hot*_*aw2 0

FFT 返回一组选定的音频频谱频率箱的复幅度数组。它不直接估计音调频率,因为音调不仅仅是一个频谱频率段。

如果您确实使用音调检测或估计方法(加权自相关、倒谱、RAPT 等),您引用的公式将为您提供该音调频率的 MIDI 数字。