How to get MFCC with TarsosDSP?

前端 未结 2 1017
感动是毒
感动是毒 2021-01-14 12:32

I searched everywhere and I couldn\'t figure out how to extract MFCC feature using TarsosDSP on Android. I know how to get FFT out of a file. Any help?

相关标签:
2条回答
  • 2021-01-14 13:16

    you can get the mfcc under the process event, i think that it is for each frame

        int sampleRate = 16000;
        int bufferSize = 512;
        int bufferOverlap = 128;
        new AndroidFFMPEGLocator(this);
        final List<float[]>mfccList = new ArrayList<>(200);
        InputStream inStream = new FileInputStream(audioFilePath);
       AudioDispatcher dispatcher = new AudioDispatcher(new UniversalAudioInputStream(inStream, new TarsosDSPAudioFormat(sampleRate, bufferSize, 1, true, true)), bufferSize, bufferOverlap);
        final MFCC mfcc = new MFCC(bufferSize, sampleRate, 20, 50, 300, 3000);
        dispatcher.addAudioProcessor(mfcc);
        dispatcher.addAudioProcessor(new AudioProcessor() {
    
            @Override
            public void processingFinished() {
            }
    
            @Override
            public boolean process(AudioEvent audioEvent) {
                mfccList.add( mfcc.getMFCC());
                return true;
            }
        });
        dispatcher.run();
    
    0 讨论(0)
  • 2021-01-14 13:19

    See official github page

    MFCC Test file

    public class MFCCTest {
    
    //  private static int counter = 0;
    
        @Test
        public void MFCCForSineTest() throws UnsupportedAudioFileException{
            int sampleRate = 44100;
            int bufferSize = 1024;
            int bufferOverlap = 128;
            final float[] floatBuffer = TestUtilities.audioBufferSine();
            final AudioDispatcher dispatcher = AudioDispatcherFactory.fromFloatArray(floatBuffer, sampleRate, bufferSize, bufferOverlap);
            final MFCC mfcc = new MFCC(bufferSize, sampleRate, 40, 50, 300, 3000);
            dispatcher.addAudioProcessor(mfcc);
            dispatcher.addAudioProcessor(new AudioProcessor() {
    
                @Override
                public void processingFinished() {
                }
    
                @Override
                public boolean process(AudioEvent audioEvent) {
                    return true;
                }
            });
            dispatcher.run();
        }
    
    }
    

    and TestUtilities audioBufferSine()

    public class TestUtilities {
    
        /**
         * Constructs and returns a buffer of a two seconds long pure sine of 440Hz
         * sampled at 44.1kHz.
         * 
         * @return A buffer of a two seconds long pure sine (440Hz) sampled at
         *         44.1kHz.
         */
        public static float[] audioBufferSine() {
            final double sampleRate = 44100.0;
            final double f0 = 440.0;
            final double amplitudeF0 = 0.5;
            final double seconds = 4.0;
            final float[] buffer = new float[(int) (seconds * sampleRate)];
            for (int sample = 0; sample < buffer.length; sample++) {
                final double time = sample / sampleRate;
                buffer[sample] = (float) (amplitudeF0 * Math.sin(2 * Math.PI * f0 * time));
            }
            return buffer;
        }
    
    0 讨论(0)
提交回复
热议问题