【问题标题】:Difficulties using TARSOS DSP to extract MFCC from WavFiles JAVA使用 TARSOS DSP 从 WavFiles JAVA 中提取 MFCC 的困难
【发布时间】:2019-11-06 13:55:06
【问题描述】:

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

很遗憾,我无法理解 MFCC 类中的代码如何用于 wav 文件。

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

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

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

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

【问题讨论】:

    标签: java wav mfcc dtw tarsosdsp


    【解决方案1】:

    这是示例代码,应该可以处理小文件。它将整个 .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 的算法在底层可能存在细微差别。这种差异可能是梅尔刻度公式,因为没有普遍接受的梅尔刻度公式。 Librosa 还在 WAV 文件的音频的开头和结尾使用反射填充,其他库可能不是这种情况。最终结果将是相似的,但不能保证完全相同。
    • 感谢您的输入,我想我会坚持使用相同的库来提取一致的音频特征。
    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 2015-02-12
    • 2014-11-15
    • 2018-11-23
    • 1970-01-01
    • 2016-11-21
    • 2014-07-03
    • 2020-07-27
    相关资源
    最近更新 更多