def METHOD_NAME(self, audio, finish=False):
    """
    audio (numpy.ndarray), this buffer is guaranteed to contain data for 1 or more blocks
        (audio.shape[0]>=self._block_len+self._context_len)
    """
    # Cut the buffer to the end of the last frame
    audio_len = audio.shape[0]
    processable_len = audio_len - (audio_len - self._context_len) % self._block_len
    buffer_skip_len = processable_len - self._context_len
    audio = audio[:processable_len]
    # Convert audio data type to float32 if needed
    if np.issubdtype(audio.dtype, np.uint8):
        audio = audio/np.float32(128) - 1  # normalize to -1 to 1, uint8 to float32
    elif np.issubdtype(audio.dtype, np.integer):
        audio = audio/np.float32(32768)  # normalize to -1 to 1, int16 to float32
    melspectrum = samples_to_melspectrum(
        audio,                               # samples
        self.p['model_sampling_rate'],       # sampling_rate
        self._context_len + self._block_len, # window_size
        self._block_len,                     # stride
        n_mels = self.p['mel_num'],
        fmin = self.p['mel_fmin'],
        fmax = self.p['mel_fmax'],
    )
    if self.p['num_mfcc_dct_coefs'] is not None:
        mfcc_features = melspectrum_to_mfcc(melspectrum, self.p['num_mfcc_dct_coefs'])
        return [mfcc_features], buffer_skip_len
    else:
        return [melspectrum], buffer_skip_len