peterf@2: #!/usr/bin/env python peterf@2: ''' peterf@2: CREATED:2013-02-12 16:33:40 by Brian McFee peterf@2: peterf@2: Beat tracking with HPSS filtering peterf@2: peterf@2: Usage: ./hpss_beats.py [-h] input_audio.mp3 output_beats.csv peterf@2: ''' peterf@2: from __future__ import print_function peterf@2: peterf@2: import argparse peterf@2: import numpy as np peterf@2: import sys peterf@2: import librosa peterf@2: peterf@2: # Some magic number defaults, FFT window and hop length peterf@2: N_FFT = 2048 peterf@2: peterf@2: # We use a hop of 64 here so that the HPSS spectrogram input peterf@2: # matches the default beat tracker parameters peterf@2: HOP_LENGTH = 64 peterf@2: peterf@2: peterf@2: def hpss_beats(input_file, output_csv): peterf@2: '''HPSS beat tracking peterf@2: peterf@2: :parameters: peterf@2: - input_file : str peterf@2: Path to input audio file (wav, mp3, m4a, flac, etc.) peterf@2: peterf@2: - output_file : str peterf@2: Path to save beat event timestamps as a CSV file peterf@2: ''' peterf@2: peterf@2: # Load the file peterf@2: print('Loading ', input_file) peterf@2: y, sr = librosa.load(input_file) peterf@2: peterf@2: # Do HPSS peterf@2: print('Harmonic-percussive separation ... ') peterf@2: y = librosa.effects.percussive(y) peterf@2: peterf@2: # Construct onset envelope from percussive component peterf@2: print('Tracking beats on percussive component') peterf@2: onset_env = librosa.onset.onset_strength(y=y, peterf@2: sr=sr, peterf@2: hop_length=HOP_LENGTH, peterf@2: n_fft=N_FFT, peterf@2: aggregate=np.median) peterf@2: peterf@2: # Track the beats peterf@2: tempo, beats = librosa.beat.beat_track(onset_envelope=onset_env, peterf@2: sr=sr, peterf@2: hop_length=HOP_LENGTH) peterf@2: peterf@2: beat_times = librosa.frames_to_time(beats, peterf@2: sr=sr, peterf@2: hop_length=HOP_LENGTH) peterf@2: peterf@2: # Save the output peterf@2: print('Saving beats to ', output_csv) peterf@2: librosa.output.times_csv(output_csv, beat_times) peterf@2: peterf@2: peterf@2: def process_arguments(args): peterf@2: '''Argparse function to get the program parameters''' peterf@2: peterf@2: parser = argparse.ArgumentParser(description='HPSS beat-tracking example') peterf@2: peterf@2: parser.add_argument('input_file', peterf@2: action='store', peterf@2: help='path to the input file (wav, mp3, etc)') peterf@2: peterf@2: parser.add_argument('output_file', peterf@2: action='store', peterf@2: help='path to the output file (csv of beat times)') peterf@2: peterf@2: return vars(parser.parse_args(args)) peterf@2: peterf@2: peterf@2: if __name__ == '__main__': peterf@2: # Get the parameters peterf@2: parameters = process_arguments(sys.argv[1:]) peterf@2: peterf@2: # Run the beat tracker peterf@2: hpss_beats(parameters['input_file'], parameters['output_file'])