def getSignalFromMelGram( self, melGram, hop=64 ): hopScale = 4 randomSignal = 2*np.random.rand( melGram.shape[0]*hop + hop*hopScale ) - 1 randomSpectrogram = utility.getSpectrogram( randomSignal, hop=hop, frameSize=hop*hopScale ) #randomSpectrogram = np.random.randn( melGram.shape[0], hop*hopScale/2 + 1 ) + np.random.randn( melGram.shape[0], hop*hopScale/2 + 1 )*1j #randomSpectrogram[:, 0] = randomSpectrogram[:, 0].real + 0j #randomSpectrogram[:, -1] = randomSpectrogram[:, -1].real + 0j spectrogramScaler = np.zeros( randomSpectrogram.shape ) filters = self.MFCCer.getFilters( hop*hopScale, self.fs, 0, None, 0 ) for n in xrange( randomSpectrogram.shape[0] ): spectrogramScaler[n] = np.sum( filters*melGram[n], axis=1 ) #spectrogramScaler[n] = np.sum( filters, axis=1 ) return utility.getSignalFromSpectrogram( randomSpectrogram*spectrogramScaler, hop, np.hanning( hop*hopScale ) )
import sys import os import utility if len(sys.argv) < 2: print "Usage: %s filename.mp3|filename.wav" % sys.argv[0] sys.exit(-1) # Wav or mp3? basename, extension = os.path.splitext( sys.argv[1] ) if extension == '.mp3': print "Getting mp3 data ..." audioData, fs = utility.getMp3Data( sys.argv[1] ) elif extension == '.wav': print "Getting wav data ..." audioData, fs = utility.getWavData( sys.argv[1] ) else: print "Not .wav or .mp3." sys.exit(-1) hop = 1024 frameSize = 4096 spectrogram = utility.getSpectrogram( audioData, hop=hop, frameSize=frameSize ) print "Separating harmonic and percussive components ..." start = time() seperator = HarmonicPercussiveSeparator( spectrogram ) end = time() print "Took ", end - start utility.plotSpectrogram( spectrogram ) utility.plotSpectrogram( seperator.harmonicSpectrogram ) utility.plotSpectrogram( seperator.percussiveSpectrogram ) #utility.writeWav( utility.getSignalFromSpectrogram( seperator.harmonicSpectrogram, hop, np.hanning( frameSize ) ), fs, sys.argv[1] + "harm.wav", 1 ) #utility.writeWav( utility.getSignalFromSpectrogram( seperator.percussiveSpectrogram, hop, np.hanning( frameSize ) ), fs, sys.argv[1] + "perc.wav", 1 )
audioData[file], fs = utility.getWavData(os.path.join(directory, file)) for downsamplingFactor in downsamplingFactors: for file in filenames: audioDataDownsampled[file] = scipy.signal.decimate(audioData[file], downsamplingFactor) for frameSize, window, hopSizeScale in itertools.product(frameSizes, windows, hopSizeScales): if hopSizeScale < previousHopSizeScale and np.mod(previousHopSizeScale, hopSizeScale) == 0: # Instead of calculating a new spectrogram, just grab the frames newHopRatio = previousHopSizeScale / hopSizeScale for file in filenames: spectrograms[file] = spectrograms[file][::newHopRatio] else: # Calculate spectrograms - should not re-calculate if just the hop size changes. for file in filenames: spectrograms[file] = utility.getSpectrogram( audioDataDownsampled[file], hop=frameSize / hopSizeScale, frameSize=frameSize, window=window(frameSize), ) previousHopSizeScale = hopSizeScale for ODF in ODFs: # Get the onset detection function for file in filenames: ODFOutput[file] = onsetDetection.ODF( spectrograms[file], ODF, fs=fs / downsamplingFactor ).onsetDetectionFunction for offset in offsets: # Compute the synchronization score for the syncrhonized and unsynchronized files synchronizedScore = synchronizationScore.getScore( ODFOutput[filenames[0]], ODFOutput[filenames[1]], offset=offset ) unsynchronizedScore = synchronizationScore.getScore(
def getMelGram( self, signal, hop=64 ): spectrogram = utility.getSpectrogram( signal, frameSize=self.frameSize, hop=hop ) return np.array( map( self.MFCCer.getMelSpectrum, spectrogram ) )