gpt4 book ai didi

java - 使用 TARSOS DSP 从 WavFiles JAVA 中提取 MFCC 的困难

转载 作者:行者123 更新时间:2023-11-30 05:35:26 27 4
gpt4 key购买 nike

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

不幸的是,我无法理解如何在 wav 文件上使用 MFCC 类中的代码。

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

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

https://github.com/JorenSix/TarsosDSP/blob/master/src/core/be/tarsos/dsp/mfcc/MFCC.java

如果我能获得有关如何正确使用此代码从 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。

关于java - 使用 TARSOS DSP 从 WavFiles JAVA 中提取 MFCC 的困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56741980/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com