import wave, struct, array import library debug = True diplo1 = wave.open('Diplo - Revolution (feat. Faustix & Imanos and Kai)-114311164.wav', 'rb') diplo2 = wave.open('1-OhioTurnpike.wav','rb') diplo_output = wave.open('output.wav','wb') nchannels = diplo1.getnchannels() sampwidth = diplo1.getsampwidth() framerate = diplo1.getframerate() nframes = diplo1.getnframes() if debug: print "nchannels: %s" % nchannels print "sampwidth: %s" % sampwidth print "framerate: %s" % framerate print "nframes: %s" % nframes def get_samples(pos): diplo.setpos(pos) frame = diplo.readframes(1) left = frame[0:2] right = frame[2:4] left_sample = struct.unpack("<h", left)[0] right_sample = struct.unpack("<h", right)[0] return (left_sample, right_sample) #for pos in range(nframes): #samples = [get_samples(pos) for pos in range(nframes)] #if debug: #print samples #left_samples = [sample[0] for sample in samples] #if debug: #print left_samples #right_samples = [sample[1] for sample in samples] #if debug: #print right_samples #print "Unique samples on the left: %s" % len(set(left_samples)) #print "Unique samples on the right: %s" % len(set(right_samples)) #diplo.rewind() def extract_stuff(diplo,n=-1): if n < 0: n = diplo.getnframes() frames = diplo.readframes(n) assert (len(frames)/4) == n samples = array.array('h', frames) left_samples = [] right_samples = [] for index, elem in enumerate(samples): if index % 2 == 0: left_samples.append(elem) else: right_samples.append(elem) return left_samples seconds = 44100 * 10 left_samples1 = extract_stuff(diplo1,seconds) left_samples2 = extract_stuff(diplo2,seconds) left_samples_replacement = [] g1 = library.grouper(8,left_samples1) g2 = list( library.window(8,left_samples2) ) for index, frame in enumerate(g1): candidate = frame lower = 5 upper = 7 similar = [] for similar_index, similar_frame in enumerate(g2): s = library.similarity(frame,similar_frame) if lower <= s <= upper: print "{:4}{:4} {}\t{:4}\t{}".\ format(s, index,frame,similar_index,similar_frame) candidate = similar_frame break left_samples_replacement.extend(candidate) left_samples_replacement_frame = bytearray(b+128 for b in left_samples_replacement) diplo_output.setsampwidth(2) diplo_output.setframerate(44100) diplo_output.setnchannels(1) diplo_output.writeframes(left_samples_replacement_frame) diplo_output.close()