From e52d02e8dbf413c117a28d56260e297fb6b6e470 Mon Sep 17 00:00:00 2001 From: Apostolof Date: Sun, 2 Dec 2018 13:12:27 +0200 Subject: [PATCH] Add more features --- .../batch_feature_extractor.py | 8 ++-- .../feature_extraction/feature_extractor.py | 42 +++++++++++++++++-- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/classifier/feature_extraction/batch_feature_extractor.py b/classifier/feature_extraction/batch_feature_extractor.py index 7c65815..0086249 100644 --- a/classifier/feature_extraction/batch_feature_extractor.py +++ b/classifier/feature_extraction/batch_feature_extractor.py @@ -12,6 +12,8 @@ audioFiles = [file for file in listdir(sys.argv[1]) if isfile(join(sys.argv[1], # sys.argv[2] + file[0:file.rfind('.')] + '.json', int(sys.argv[3])) pool = mp.Pool(processes = 8) -[pool.apply(extractFeatures, args=(sys.argv[1] + file, - sys.argv[2] + file[0:file.rfind('.')] + '.json', - int(sys.argv[3]))) for file in audioFiles] +for file in audioFiles: + pool.apply(extractFeatures,args=(sys.argv[1] + file, + sys.argv[2] + file[0:file.rfind('.')] + '.json',int(sys.argv[3]))) + +print('Batch feature extraction finished successfully.') diff --git a/classifier/feature_extraction/feature_extractor.py b/classifier/feature_extraction/feature_extractor.py index a29190c..131542c 100644 --- a/classifier/feature_extraction/feature_extractor.py +++ b/classifier/feature_extraction/feature_extractor.py @@ -1,8 +1,9 @@ # import essentia.standard import essentia from essentia.standard import (MonoLoader, Windowing, Spectrum, MFCC, - ZeroCrossingRate, SpectralCentroidTime, RollOff, Flux, FrameGenerator, - YamlOutput) + ZeroCrossingRate, SpectralCentroidTime, RollOff, Flux, Envelope, + FlatnessSFX, LogAttackTime, StrongDecay, FlatnessDB, HFC, LPC, + SpectralComplexity, FrameGenerator, YamlOutput) # Disable annoying info level logging essentia.log.infoActive = False @@ -22,6 +23,14 @@ def extractFeatures(audioPath, outputPath, sampleRate): sc = SpectralCentroidTime(sampleRate = sampleRate) sr = RollOff(sampleRate = sampleRate) sf = Flux() + env = Envelope(attackTime = 2, releaseTime = 300, sampleRate = sampleRate) + flat = FlatnessSFX() + logAtt = LogAttackTime(sampleRate = sampleRate) + strDec = StrongDecay(sampleRate = sampleRate) + flatDB = FlatnessDB() + hfc = HFC(sampleRate = sampleRate) + lpc = LPC(sampleRate = sampleRate) + spcComp = SpectralComplexity(sampleRate = sampleRate, magnitudeThreshold = 2) # Creates a pool to collect the values of the features pool = essentia.Pool() @@ -35,20 +44,47 @@ def extractFeatures(audioPath, outputPath, sampleRate): # Computes time domain features frameZCR = zcr(windowedFrame) frameSC = sc(windowedFrame) + frameEFlatness = flat(env(windowedFrame)) + frameLogAtt = logAtt(env(windowedFrame))[1] + frameStrDec = strDec(windowedFrame) + frameLPC, frameReflection = lpc(windowedFrame) # Computes spectral features frameSpectrum = spectrum(windowedFrame) frameSR = sr(frameSpectrum) frameSF = sf(frameSpectrum) + frameSEFlatness = flat(env(frameSpectrum)) + frameSLogAtt = logAtt(env(frameSpectrum))[1] + frameSStrDec = strDec(frameSpectrum) + frameSFlat = flatDB(frameSpectrum) + frameHFC = hfc(frameSpectrum) + frameSComp = spcComp(frameSpectrum) + # Discards the bands mfcc_coeffs = mfcc(frameSpectrum)[1] # Adds the values to the pool pool.add('ZCR', frameZCR) pool.add('SC', frameSC) + pool.add('Flat', frameEFlatness) + pool.add('LAtt', frameLogAtt) + pool.add('SDec', frameStrDec) + for index, coef in enumerate(frameLPC[1:frameLPC.size]): + pool.add('LPC' + str(index + 1), coef) + for index, coef in enumerate(frameReflection): + pool.add('REFL' + str(index), coef) + pool.add('SR', frameSR) pool.add('SF', frameSF) - pool.add('mfcc', mfcc_coeffs) + pool.add('SEFlat', frameSEFlatness) + pool.add('SFlat', frameSFlat) + pool.add('SLAtt', frameSLogAtt) + pool.add('SSDec', frameSStrDec) + pool.add('HFC', frameHFC) + pool.add('SComp', frameSComp) + + for index, coef in enumerate(mfcc_coeffs): + pool.add('mfcc' + str(index), coef) YamlOutput(filename = outputPath, format = 'json', writeVersion = False)(pool)