使用TARSOS DSP从JAVA文件中提取MFCC的困难

使用TARSOS DSP从JAVA文件中提取MFCC的困难,java,wav,mfcc,dtw,tarsosdsp,Java,Wav,Mfcc,Dtw,Tarsosdsp,在使用DTW计算它们之间的距离之前,我尝试使用TARSOS DSP库从wav文件中提取MFCC值 不幸的是,我在理解MFCC类中的代码如何在wav文件上使用时遇到了困难 我不确定是否需要先将wav文件转换为某种数组缓冲区 请在此链接中查看MFCC类库中的代码 如果我能得到关于如何正确使用此代码从wav文件中获取MFCC值的建议,或者是关于另一种方法的建议,我将不胜感激。这是一个示例代码,可以用于小文件。它将整个.wav文件加载到一个字节数组中,因此对于大文件来说,这不是正确的方法。最终的变量可

在使用DTW计算它们之间的距离之前,我尝试使用TARSOS DSP库从wav文件中提取MFCC值

不幸的是,我在理解MFCC类中的代码如何在wav文件上使用时遇到了困难

我不确定是否需要先将wav文件转换为某种数组缓冲区

请在此链接中查看MFCC类库中的代码


如果我能得到关于如何正确使用此代码从wav文件中获取MFCC值的建议,或者是关于另一种方法的建议,我将不胜感激。

这是一个示例代码,可以用于小文件。它将整个.wav文件加载到一个字节数组中,因此对于大文件来说,这不是正确的方法。最终的变量可能应该根据您的用例进行更改。我对java还是新手,所以不能保证这是最好的方法

public class App {
private final static String pathToFile = "D:\\TarsosWavTest\\wavs\\1000HzTone.wav";
private final static int audioBufferSize = 2048;
private final static int bufferOverlap = 1024;
private final static int amountOfMelFilters = 20;
private final static int amountOfCepstrumCoef = 30;
private final static float lowerFilterFreq = 133.33f;
private final static float upperFilterFreq = 8000f;

public static void main(String[] args) {
    File file = new File(pathToFile);
    AudioInputStream audioInputStream;
    byte[] byteAudioArray;
    AudioDispatcher audioDispatcher;

    try {
        audioInputStream = AudioSystem.getAudioInputStream(file);
        byteAudioArray = audioInputStream.readAllBytes();
    } catch (Exception e) {
        System.out.println("Exception occured");
        e.printStackTrace();
        return;
    }

    try {
        audioDispatcher = AudioDispatcherFactory.fromByteArray(byteAudioArray, audioInputStream.getFormat(),
                audioBufferSize, bufferOverlap);
    } catch (Exception e) {
        e.printStackTrace();
        return;
    }

    final MFCC mfccProcessor = new MFCC(audioBufferSize, audioInputStream.getFormat().getSampleRate(),
            amountOfCepstrumCoef, amountOfMelFilters, lowerFilterFreq, upperFilterFreq);

    audioDispatcher.addAudioProcessor(mfccProcessor);
    audioDispatcher.addAudioProcessor(new AudioProcessor() {

        @Override // gets called on each audio frame
        public boolean process(AudioEvent audioEvent) {
            float[] mfccs = mfccProcessor.getMFCC();
            /*  do whatever necessary with the mfcc elements here
                e.g print them  */
            //System.out.println(Arrays.toString(mfccs));
            return true;
        }

        @Override // gets called when end of the audio file was reached
        public void processingFinished() {
            System.out.println("end of file reached");
        }
    });
    audioDispatcher.run();// starts a new thread

}}

请注意,即使使用相同的输入参数,不同的库(例如librosa)也不能保证计算相同的MFCC。

“请注意,不同的库(例如librosa)即使使用相同的输入参数也不能计算相同的MFCC。”我不明白,为什么会产生不同的MFCC?@RohanBojja,因为计算MFCC的算法在引擎盖下可能会有微小的差异。这种差异可能是mel比例公式,因为没有普遍接受的mel比例公式。Librosa还在WAV文件的音频开始和结束处使用反射填充,这可能与其他库不同。最后,结果将是相似的,但不能保证完全相同。感谢您的输入,我想我会坚持使用相同的库来提取一致的音频特征。