java - 使用 TARSOS DSP 从 WavFiles JAVA 中提取 MFCC 的困难
问题描述
在使用 DTW 计算它们之间的距离之前,我正在尝试使用 TARSOS DSP 库从 wav 文件中提取 MFCC 值。
不幸的是,我无法理解 MFCC 类中的代码如何用于 wav 文件。
我不确定是否需要先将 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 - 可以从多个模块访问包 javax.xml.stream:
, java.xml - imagemagick - 使用 Imagemagick 创建随机无缝图案
- javascript - 更改 react js 中日历组件的样式
- c# - 在 selenium C# 中面临来自 html 表单的问题和选择下拉值
- angular - 在 Angular 的 Jasmine 测试用例中配置 TestBed 的推荐方法是什么?
- javascript - 如何使用来自 ReactJS 的 MaskedInput 为 CPF 或 CNPJ 设置掩码?
- javascript - 如何重新渲染具有不同值的 PayPal 智能按钮?
- wordpress - 单击项目时关闭移动菜单(elementor kit,wordpress)
- reactjs - 如何将道具传递给将参数作为不可变字符串的组件属性
- python - 为什么交换奇数个变量的列表时变量会消失?