Detect beat and play (wav) file in a synchronised manner

前端 未结 3 1937
南旧
南旧 2021-01-03 09:11

I am trying my hands at Audio Processing in python with this Beat Detection algorithm. I have implemented the first (non-optimized version) from the aforementioned article.

3条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2021-01-03 10:11

    Working beat detection code (NumPy / PyAudio)

    If you are using NumPy this code might help. It assumes the signal (read with PyAudio) is 16-bit wide Int. If that is not the case change or remove the signal.astype() and adjust the normalization-divider (max int16 here).

    class SimpleBeatDetection:
        """
        Simple beat detection algorithm from
        http://archive.gamedev.net/archive/reference/programming/features/beatdetection/index.html
        """
        def __init__(self, history = 43):
            self.local_energy = numpy.zeros(history) # a simple ring buffer
            self.local_energy_index = 0 # the index of the oldest element
    
        def detect_beat(self, signal):
    
            samples = signal.astype(numpy.int) # make room for squares
            # optimized sum of squares, i.e faster version of (samples**2).sum()
            instant_energy = numpy.dot(samples, samples) / float(0xffffffff) # normalize
    
            local_energy_average = self.local_energy.mean()
            local_energy_variance = self.local_energy.var()
    
            beat_sensibility = (-0.0025714 * local_energy_variance) + 1.15142857
            beat = instant_energy > beat_sensibility * local_energy_average
    
            self.local_energy[self.local_energy_index] = instant_energy
            self.local_energy_index -= 1
            if self.local_energy_index < 0:
                self.local_energy_index = len(self.local_energy) - 1
    
            return beat
    

    The PyAudio examples for wav read or mic record will give you the needed signal data. Create a NumPy array efficiently with frombuffer()

    data = stream.read(CHUNK)
    signal = numpy.frombuffer(data, numpy.int16)
    

提交回复
热议问题