diff --git a/src/compute_librosa_audio_features.py b/src/compute_librosa_audio_features.py index e471984..31cc41e 100644 --- a/src/compute_librosa_audio_features.py +++ b/src/compute_librosa_audio_features.py @@ -4,7 +4,6 @@ Created by Oriol Nieto. """ - import argparse import glob import json @@ -12,7 +11,7 @@ import time import numpy as np -from joblib import Parallel, delayed +from pqdm.processes import pqdm import librosa @@ -23,23 +22,33 @@ N_JOBS = 12 # Features params -SR = 22050 -N_MELS = 80 +SR = 24000 N_FFT = 2048 HOP_LENGTH = 1024 -MEL_FMIN = 0 -MEL_FMAX = None +WINDOW = "hann" +CENTER = True +PAD_MODE = "constant" +POWER = 2.0 +N_MELS = 256 +MEL_FMIN = 30 +MEL_FMAX = 12000 def compute_melspecs(audio): """Computes a mel-spectrogram from the given audio data.""" - return librosa.feature.melspectrogram(y=audio, - sr=SR, - n_mels=N_MELS, - n_fft=N_FFT, - hop_length=HOP_LENGTH, - fmin=MEL_FMIN, - fmax=MEL_FMAX) + return librosa.feature.melspectrogram( + y=audio, + sr=SR, + n_fft=N_FFT, + hop_length=HOP_LENGTH, + window=WINDOW, + center=CENTER, + pad_mode=PAD_MODE, + power=POWER, + n_mels=N_MELS, + fmin=MEL_FMIN, + fmax=MEL_FMAX, + ) def compute_all_features(mp3_file, output_dir): @@ -52,7 +61,8 @@ def compute_all_features(mp3_file, output_dir): # Save out_file = os.path.join( - output_dir, os.path.basename(mp3_file).replace(".mp3", "-mel.npy")) + output_dir, os.path.basename(mp3_file).replace(".mp3", "-mel.npy") + ) np.save(out_file, mel) @@ -63,37 +73,48 @@ def save_params(output_dir): "librosa_version": librosa.__version__, "numpy_version": np.__version__, "SR": SR, - "N_MELS": N_MELS, "N_FFT": N_FFT, "HOP_LENGTH": HOP_LENGTH, + "WINDOW": WINDOW, + "CENTER": CENTER, + "PAD_MODE": PAD_MODE, + "POWER": POWER, + "N_MELS": N_MELS, "MEL_FMIN": MEL_FMIN, - "MEL_FMAX": MEL_FMAX + "MEL_FMAX": MEL_FMAX, } - with open(out_json, 'w') as fp: + with open(out_json, "w") as fp: json.dump(out_dict, fp, indent=4) if __name__ == "__main__": parser = argparse.ArgumentParser( - description="Computes audio features for the Harmonix set.", - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - - parser.add_argument("-i", - "--input_dir", - default=INPUT_DIR, - action="store", - help="Path to the Harmonix set audio.") - parser.add_argument("-o", - "--output_dir", - default=OUTPUT_DIR, - action="store", - help="Output directory.") - parser.add_argument("-j", - "--n_jobs", - default=N_JOBS, - action="store", - type=int, - help="Number of jobs to run in parallel.") + description="Computes audio features for the Harmonix set.", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + + parser.add_argument( + "-i", + "--input_dir", + default=INPUT_DIR, + action="store", + help="Path to the Harmonix set audio.", + ) + parser.add_argument( + "-o", + "--output_dir", + default=OUTPUT_DIR, + action="store", + help="Output directory.", + ) + parser.add_argument( + "-j", + "--n_jobs", + default=N_JOBS, + action="store", + type=int, + help="Number of jobs to run in parallel.", + ) args = parser.parse_args() start_time = time.time() @@ -106,9 +127,14 @@ def save_params(output_dir): mp3s = glob.glob(os.path.join(args.input_dir, "*.mp3")) # Compute features for each mp3 in parallel - Parallel(n_jobs=args.n_jobs)( - delayed(compute_all_features)(mp3_file, args.output_dir) - for mp3_file in mp3s) + pqdm_args = [[mp3_file, args.output_dir] for mp3_file in mp3s] + + pqdm( + pqdm_args, + compute_all_features, + n_jobs=args.n_jobs, + argument_type="args", + ) # Save parameters save_params(args.output_dir)