Трудности с использованием TARSOS DSP для извлечения MFCC из WavFiles JAVA - PullRequest
1 голос
/ 24 июня 2019

Я пытаюсь использовать библиотеку TARSOS DSP для извлечения значений MFCC из файлов wav, прежде чем использовать DTW для вычисления расстояния между ними.

К сожалению, у меня возникают проблемы с пониманием того, как код из класса MFCC может использоваться в файле wav.

Я не уверен, нужно ли мне сначала конвертировать файл wav в какой-нибудь буфер массива.

Пожалуйста, посмотрите код из библиотеки для класса MFCC по этой ссылке.

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

Если бы я мог получить совет о том, как правильно использовать этот код для получения значений MFCC из файла WAV, или, возможно, рекомендации о другом методе, я был бы очень признателен.

1 Ответ

1 голос
/ 04 июля 2019

Это пример кода, который должен выполнять работу с небольшими файлами. Он загружает весь файл .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 даже с одинаковыми входными параметрами.

...