diff options
Diffstat (limited to 'python/demos/demo_reading_speed.py')
-rwxr-xr-x | python/demos/demo_reading_speed.py | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/python/demos/demo_reading_speed.py b/python/demos/demo_reading_speed.py new file mode 100755 index 0000000..90739f3 --- /dev/null +++ b/python/demos/demo_reading_speed.py @@ -0,0 +1,139 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +""" + +Compare the speed of several methods for reading and loading a sound file. + +Optionally, this file can make use of the following packages: + + - audioread https://github.com/beetbox/audioread + - scipy https://scipy.org + - librosa https://github.com/bmcfee/librosa + - pydub https://github.com/jiaaro/pydub + +Uncomment the function names below and send us your speed results! + +""" + + +test_functions = [ + "read_file_aubio", + "load_file_aubio", + #"load_file_scipy", + #"load_file_scipy_mmap", + #"read_file_audioread", + #"load_file_librosa", + #"read_file_pydub", + #"load_file_pydub", + ] + + +import numpy as np + +def read_file_audioread(filename): + import audioread + # taken from librosa.util.utils + def convert_buffer_to_float(buf, n_bytes = 2, dtype = np.float32): + # Invert the scale of the data + scale = 1./float(1 << ((8 * n_bytes) - 1)) + # Construct the format string + fmt = '<i{:d}'.format(n_bytes) + # Rescale and format the data buffer + out = scale * np.frombuffer(buf, fmt).astype(dtype) + return out + + with audioread.audio_open(filename) as f: + total_frames = 0 + for buf in f: + samples = convert_buffer_to_float(buf) + samples = samples.reshape(f.channels, -1) + total_frames += samples.shape[1] + return total_frames, f.samplerate + +def load_file_librosa(filename): + import librosa + y, sr = librosa.load(filename, sr = None) + #print y.mean(), y.shape + return len(y), sr + +def load_file_scipy(filename): + import scipy.io.wavfile + sr, y = scipy.io.wavfile.read(filename) + y = y.astype('float32') / 32767 + #print y.mean(), y.shape + return len(y), sr + +def load_file_scipy_mmap(filename): + import scipy.io.wavfile + sr, y = scipy.io.wavfile.read(filename, mmap = True) + #print y.mean(), y.shape + return len(y), sr + +def read_file_pydub(filename): + from pydub import AudioSegment + song = AudioSegment.from_file(filename) + song.get_array_of_samples() + return song.frame_count(), song.frame_rate + +def load_file_pydub(filename): + from pydub import AudioSegment + song = AudioSegment.from_file(filename) + y = np.asarray(song.get_array_of_samples(), dtype = 'float32') + y = y.reshape(song.channels, -1) / 32767. + return song.frame_count(), song.frame_rate + +def read_file_aubio(filename): + import aubio + f = aubio.source(filename, hop_size = 1024) + total_frames = 0 + while True: + _, read = f() + total_frames += read + if read < f.hop_size: break + return total_frames, f.samplerate + +def load_file_aubio(filename): + import aubio + f = aubio.source(filename, hop_size = 1024) + y = np.zeros(f.duration, dtype = aubio.float_type) + total_frames = 0 + while True: + samples, read = f() + y[total_frames:total_frames + read] = samples[:read] + total_frames += read + if read < f.hop_size: break + assert len(y) == total_frames + #print y.mean(), y.shape + return total_frames, f.samplerate + +def test_speed(function, filename): + times = [] + for _ in range(10): + start = time.time() + try: + total_frames, samplerate = function(filename) + except ImportError as e: + print ("error: failed importing {:s}".format(e)) + return + elapsed = time.time() - start + #print ("{:5f} ".format(elapsed)), + times.append(elapsed) + + #print + times = np.array(times) + duration_min = int(total_frames/float(samplerate) // 60) + str_format = '{:25s} took {:5f} seconds avg (±{:5f}) to run on a ~ {:d} minutes long file' + print (str_format.format(function.__name__, times.mean(), times.std(), duration_min )) + +if __name__ == '__main__': + import sys, time + if len(sys.argv) < 2: + print ("not enough arguments") + sys.exit(1) + filename = sys.argv[1] + + for f in test_functions: + # get actual function from globals + test_function = globals()[f] + test_speed(test_function, filename) |