def echocancel(outputdata, inputdata): pos = audioop.findmax(outputdata, 800) # one tenth second out_test = outputdata[pos * 2:] in_test = inputdata[pos * 2:] ipos, factor = audioop.findfit(in_test, out_test) prefill = '\0' * (pos + ipos) * 2 postfill = '\0' * (len(inputdata) - len(prefill) - len(outputdata)) outputdata = prefill + audioop.mul(outputdata, 2 - factor) + postfill return audioop.add(inputdata, outputdata, 2)
def echocancel(outputdata, inputdata): pos = audioop.findmax(outputdata, 800) # one tenth second out_test = outputdata[pos*2:] in_test = inputdata[pos*2:] ipos, factor = audioop.findfit(in_test,out_test) prefill = '\0'*(pos+ipos)*2 postfill = '\0'*(len(inputdata)-len(prefill)-len(outputdata)) outputdata = prefill + audioop.mul(outputdata,2-factor) + postfill return audioop.add(inputdata, outputdata,2)
def echocancel(outputdata, inputdata): """Try to identify an echo and remove it. Should contain 2-byte samples""" pos = audioop.findmax(outputdata, 800) out_test = outputdata[pos*2:] in_test = inputdata[pos*2:] ipos, factor = audioop.findfit(in_test, out_test) factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)], out_test) prefill = '\0'*(pos+ipos)*2 postfill = '\0'*(len(inputdata) - len(prefill) - len(outputdata)) outputdata = prefill + audioop.mul(outputdata, 2, -factor) + postfill return audioop.add(inputdata, outputdata, 2)
def findfit(scratch_frag, final_frag, sound_file): '''Calculates the offset (in seconds) between scratch_frag & final_frag. Both fragments are assumed to contain the same, loud "clapper" event. The SoundFile object is used for common stream parameters.''' import audioop nchannels = sound_file.stream.getnchannels() framerate = sound_file.stream.getframerate() width = sound_file.stream.getsampwidth() assert(width==2) # Simplify the sound streams to make it quicker to find a match. # Left channel only. if nchannels > 1: scratch_frag_ = audioop.tomono(scratch_frag, width, 1, 0) final_frag_ = audioop.tomono(final_frag, width, 1, 0) else: scratch_frag_ = scratch_frag final_frag_ = final_frag nchannels_ = 1 # Downsample to 8000/sec framerate_ = 8000 scratch_frag_,state =\ audioop.ratecv(scratch_frag_, width, nchannels_, framerate, framerate_, None) final_frag_,state =\ audioop.ratecv(final_frag_, width, nchannels_, framerate, framerate_, None) bytes_per_second_ = nchannels_ * framerate_ * width # Find the clapper in final length_samples = int(0.001 * framerate * nchannels_) # 0.1 sec final_off_samples = audioop.findmax(final_frag_, length_samples) # Search for a 2 second 'needle' centred on where we found the 'clapper' needle_bytes = 2 * bytes_per_second_ b0 = max(0, final_off_samples * width - int(needle_bytes/2)) print '"clapper" at final:', 1.0*b0/bytes_per_second_, 'sec' b1 = b0 + needle_bytes final_clapper_frag = final_frag_[b0:b1] scratch_off_samples,factor = audioop.findfit(scratch_frag_, final_clapper_frag) scratch_off_bytes = scratch_off_samples * width print 'match at scratch:', 1.0*scratch_off_bytes/bytes_per_second_, 'sec', " factor =",factor # Calculate the offset (shift) between the two fragments. shift_sec = (scratch_off_bytes - b0) * 1.0 / bytes_per_second_ print 'shift =', shift_sec, 'seconds' return shift_sec
def _find_maxes(data, duration, start, stop, num): global COUNT return_list = [] if stop - start < duration: return return_list try: m = audioop.findmax(data[start:stop], duration) except audioop.error: print('got an error with data: {} {}'.format(start, stop)) return return_list COUNT += 1 return_list.append(m) if COUNT < num: return_list.extend(_find_maxes(data, duration, start, m * 2, num)) return_list.extend( _find_maxes(data, duration, (m + duration) * 2, stop, num)) return return_list
def test_findmax(self): self.assertEqual(audioop.findmax(datas[2], 1), 5) self.assertEqual(audioop.findmax(bytearray(datas[2]), 1), 5) self.assertEqual(audioop.findmax(memoryview(datas[2]), 1), 5)
def test_findmax(self): self.assertEqual(audioop.findmax(data[1], 1), 2)
def testfindmax(data): if audioop.findmax(data[1], 1) <> 2: return 0 return 1
def testfindmax(data): if verbose: print 'findmax' if audioop.findmax(data[1], 1) <> 2: return 0 return 1
def testfindmax(data): if verbose: print 'findmax' if audioop.findmax(data[1], 1) != 2: return 0 return 1