hamel@149: #!/usr/bin/env python hamel@149: # hamel@149: # audio_example.py hamel@149: # hamel@149: # hamel@150: # Created by Philippe Hamel (hamel.phil@gmail.com) on 10-12-22. hamel@149: # hamel@149: # Script to extract SAIs from an audio file using python hamel@149: hamel@150: import aimc hamel@150: import numpy hamel@150: hamel@150: do_plot=True hamel@149: # Example wav file hamel@149: wavfile = '../test_data/short_example.wav' hamel@149: hamel@150: #Loading audio file hamel@150: try: hamel@150: #pygmy is available at hg clone https://bitbucket.org/douglaseck/pygmy/ hamel@150: from pygmy.io.audio import AudioFile hamel@150: af=AudioFile(wavfile) hamel@150: x,sr,z=af.read(mono=True) hamel@150: except: hamel@150: from scipy.io import wavfile as WF hamel@150: (sr,x) = WF.read(wavfile) hamel@150: x=x.astype('float')/float(pow(2,15) - 1) hamel@149: hamel@150: if x.ndim <= 1: hamel@150: x=reshape(x,(x.shape[0],1)) hamel@152: sr = 1.*sr hamel@150: hamel@150: nChannels = x.shape[1] hamel@149: hamel@150: nSamples = x.shape[0] hamel@150: buffer_length = 1024 hamel@152: hamel@152: #Zero-padding hamel@152: #zero_pad = numpy.zeros((buffer_length-(nSamples%buffer_length),nChannels)).astype('float') hamel@152: #x = numpy.vstack((x,zero_pad)) hamel@152: hamel@152: #OR hamel@152: hamel@152: #Drop last incomplete frame (this is what happens in the C++ code) hamel@152: nFrames = x.shape[0]/buffer_length hamel@152: x = x[:nFrames*buffer_length] hamel@152: hamel@150: assert(x.shape[0]%buffer_length == 0) hamel@149: hamel@149: hamel@149: sig = aimc.SignalBank() hamel@150: sig.Initialize(nChannels,buffer_length,sr) hamel@149: hamel@150: pzfc = aimc.ModulePZFC(aimc.Parameters()) hamel@150: hcl = aimc.ModuleHCL(aimc.Parameters()) hamel@150: local_max = aimc.ModuleLocalMax(aimc.Parameters()) hamel@150: sai = aimc.ModuleSAI(aimc.Parameters()) hamel@149: hamel@150: pzfc.AddTarget(hcl) hamel@150: hcl.AddTarget(local_max) hamel@150: local_max.AddTarget(sai) hamel@149: hamel@149: global_params = aimc.Parameters() hamel@150: pzfc.Initialize(sig,global_params) hamel@149: hamel@150: output_list = [] hamel@152: bank_list =[] hamel@149: hamel@150: for f in range(nFrames): hamel@150: for i in range(nChannels): hamel@150: sig.set_signal(i,x[buffer_length*f:buffer_length*(f+1),i]) hamel@149: hamel@150: pzfc.Process(sig) hamel@150: output_bank = sai.GetOutputBank() hamel@152: bank_list.append(output_bank) hamel@149: n_channel = output_bank.channel_count() hamel@149: sig_length = output_bank.buffer_length() hamel@149: output_matrix = numpy.zeros((n_channel,sig_length)) hamel@149: for i in range(n_channel): hamel@149: output_matrix[i] = numpy.array(output_bank.get_signal(i)) hamel@150: output_list.append(output_matrix) hamel@150: hamel@152: print 'nFrames, nChannels, nSamples, sample_rate' hamel@152: print nFrames, n_channel, sig_length, sr hamel@152: hamel@152: hamel@150: if do_plot: hamel@150: import pylab as P hamel@150: P.figure() hamel@150: P.imshow(output_list[0], aspect='auto', origin='lower') hamel@150: hamel@150: hamel@150: ################ DEPRECATED CODE (kept here for reference) ######################### hamel@150: hamel@150: #if True: hamel@150: # output_bank=output_list[0] hamel@150: # n_channel = output_bank.channel_count() hamel@150: # sig_length = output_bank.buffer_length() hamel@150: # output_matrix = numpy.zeros((n_channel,sig_length)) hamel@150: # for i in range(n_channel): hamel@150: # output_matrix[i] = numpy.array(output_bank.get_signal(i)) hamel@150: # print output_matrix hamel@150: # print output_matrix.shape hamel@150: # print output_matrix.sum() hamel@149: hamel@149: #output_signal = numpy.array(output_bank.get_signal(0)) hamel@149: hamel@150: #def process_module(module, input_signal, global_params): hamel@150: # module.Initialize(input_signal,global_params) hamel@150: # module.Process(input_signal) hamel@150: # return module.GetOutputBank() hamel@150: hamel@150: #pzfc_params = aimc.Parameters() hamel@150: ##pzfc_params.SetString('name','PZFCFilterBank') hamel@150: ##pzfc_params.SetString('child1','NAP') hamel@150: # hamel@150: #hcl_params = aimc.Parameters() hamel@150: ##hcl_params.SetString('name','NAP') hamel@150: ##hcl_params.SetString('child1','NAP') hamel@150: # hamel@150: #global_params = aimc.Parameters() hamel@150: # hamel@150: #pzfc = aimc.ModulePZFC(pzfc_params) hamel@150: #pzfc.Initialize(sig,global_params) hamel@150: #pzfc.Process(sig) hamel@150: #pzfc_output = pzfc.GetOutputBank() hamel@150: # hamel@150: #hcl = aimc.ModuleHCL(hcl_params) hamel@150: #hcl_output = process_module(hcl, pzfc_output, global_params) hamel@150: # hamel@150: #local_max = aimc.ModuleLocalMax( aimc.Parameters()) hamel@150: #local_max_output = process_module(local_max, hcl_output, global_params) hamel@150: # hamel@150: #sai = aimc.ModuleSAI( aimc.Parameters()) hamel@150: #sai_output = process_module(sai, local_max_output, global_params)