Простое обнаружение ударов в Python - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть проект, который я делаю, который включает в себя светодиоды и обработку звука.Я пытаюсь получить ту же функциональность библиотеки Minim обработки в Python, но у меня нет успеха.Класс BeatDetect в Minim имеет методы isHat, isSnare и т. Д., Которые позволяют легко обрабатывать их, поэтому я могу включить соответствующий светодиод.

from aubio import source, pitch

def is_hat(frequency):
    lower = 3000
    upper = 5000
    return lower <= frequency <= upper


def is_kick(frequency):
    lower = 20
    upper = 100
    return lower <= frequency <= upper


def is_snare(frequency):
    lower = 300
    upper = 600
    return lower <= frequency <= upper


def read_audio(filename: str):
    downsample = 1
    samplerate = 44100 // downsample

    win_s = 4096 // downsample  # fft size
    hop_s = 512 // downsample  # hop size

    s = source(filename, samplerate, hop_s)
    samplerate = s.samplerate

    tolerance = 0.8

    pitch_o = pitch("yin", win_s, hop_s, samplerate)
    pitch_o.set_unit("midi")
    pitch_o.set_tolerance(tolerance)

    pitches = []
    confidences = []

    # total number of frames read
    total_frames = 0
    while True:
        samples, read = s()
        pitch_s = pitch_o(samples)[0]
        # pitch = int(round(pitch))
        confidence = pitch_o.get_confidence()
        # if confidence < 0.8: pitch = 0.
        print('hat' if is_hat(pitch_s) else '')
        print('kick' if is_kick(pitch_s) else '')
        print('snare' if is_snare(pitch_s) else '')


        #print("%f %f %f" % (total_frames / float(samplerate), pitch_s, confidence))
        print(pitch_s)
        pitches += [pitch_s]
        confidences += [confidence]
        total_frames += read
        if read < hop_s:
            break

    if 0:
        sys.exit(0)


def main():
    read_audio("song.mp3")


if __name__ == '__main__':
    main()

Из документов Minim ([http://code.compartmental.net/minim/beatdetect_method_ishat.html][1]) для BeatDetect говорит:

"В режиме частотной энергии возвращается значение true, если был обнаружен удар, соответствующий частотному диапазону хай-хэта. Он настроен на работу с танцевальной / техно музыкой и может не работать хорошос другими стилями музыки. В режиме звуковой энергии это всегда возвращает false. "

Я пытался исследовать различные частотные диапазоны ловушек, ударов и хай-хэтов, но is_kick () былтолько один вернул значение true. С aubio я пытаюсь сравнить текущую частоту с частотой вышеупомянутых диапазонов, пытаясь заставить его работать так же, как BeatDetect. Я мало что знаю об аудио, поэтому помощь будет очень признательна. Спасибо.

1 Ответ

0 голосов
/ 22 февраля 2019

Вы можете попробовать показатель High Frequency Content, это метод, который используется для ударных звуков без тонов.

Исследовательская работа по транскрипции ударных.

Автоматическая транскрипция ударных иВокализованная перкуссия

вы должны спросить в обмене стеками обработки сигналов.

...