Есть ли у aubio способ обнаружить фрагменты аудио, в которых отсутствуют тональные элементы - только ритм? Я тестировал музыкальное произведение с ритмическим ритмом в начале 16 секунд, но все алгоритмы aubiopitch и aubionotes, казалось, обнаруживали тональность во время ритмического раздела. Можно ли как-то настроить, чтобы отличить тональные от нетональных проявлений? Или есть связанная библиотека, которая может сделать это?

1
gregory michael travis 3 Ноя 2019 в 00:21

2 ответа

Последние пару дней были заняты - но начали разбираться в этом сегодня ...

Я думаю, что это займет некоторое время, но я подумал, что дам вам несколько мыслей и некоторый код, над которым я начал работать, чтобы атаковать это!

Во-первых, псевдокод - это хороший способ разработать начальный метод.

1 / используйте import matplotlib.pyplot as plt для спектрального анализа звука и построения различных сигналов БПФ и аудио.

2 / import numpy as np для базовой обработки массивов.

(Я знаю, что это больше, чем псевдокод, но эй :-)

3 / plt.specgram создает спектральные карты вашего аудио. Помимо изображения, которое он создает (который можно использовать, чтобы начать деконструкцию вашего аудиофайла вручную), он возвращает 4 структуры.

Например

ffts,freqs,times,img = plt.specgram(signal,Fs=44100)

ffts - это двумерный массив, где столбцы - это ffts (быстрые преобразования Фурье) временных отрезков (строк).

Простая ваниль specgram анализирует временные отрезки длиной 256 выборок, каждый раз шагая вперед по 128 выборкам.

Это дает очень низкое разрешение частотного массива с довольно высокой скоростью.

Поскольку музыкальные ноты сливаются в один звук при воспроизведении с частотой более или менее 10 Гц, я решил использовать параметры specgram, чтобы разделить звук на 4096 сэмплов (около 10 Гц), шагая вперед каждые 2048 сэмплов (т.е. 20 раз). Второй).

Это дает приличное разрешение по частоте, и временные отрезки с интервалом в 20 секунд быстрее, чем люди могут воспринимать отдельные заметки.

Это означает вызов specgram следующим образом:

plt.specgram(signal,Fs=44100,NFFT=4096,noverlap=2048,mode='magnitude')

(Обратите внимание на режим - мне кажется, что амплитуды меняются в диапазоне от 0 до 0,1: у меня проблема с fft, который не дает мне амплитуды той же шкалы, что и аудиосигнал (возможно, вы видели вопрос, который я разместил). Но вот мы ...

4 / Далее я решил избавиться от шума в ffts возвращении. Это означает, что мы можем сосредоточиться на freqs приличной амплитуды и обнулить шум, который всегда присутствует в ffts (по моему опыту).

Вот моя функция (и):

def gate(signal,minAmplitude):
    return np.array([int((((a-minAmplitude)+abs(a-minAmplitude))/2) > 0) * a for a in signal])

Выглядит немного сумасшедшим - и я уверен, что настоящий математик мог бы придумать что-то более эффективное - но это лучшее, что я мог придумать. Обнуляет любые частоты амплитуды меньше, чем minAmplitude.

Это соответствующий код для вызова его из ffts, возвращаемого plt.specgram следующим образом: моя функция более вовлечена, поскольку она является частью класса и имеет другие функции, на которые она ссылается - но этого должно быть достаточно :

def fft_noise_gate(minAmplitude=0.001,check=True):
    '''
    zero the amplitudes of frequencies 
    with amplitudes below minAmplitude 
    across self.ffts
    check - plot middle fft just because!
    '''       
    nffts = ffts.shape[1]
    gated_ffts = []
    for f in range(nffts):
        fft = ffts[...,f]
        # Anyone got a more efficient noise gate formula? Best I could think up!
        fft_gated = gate(fft,minAmplitude)
        gated_ffts.append(fft_gated)
    ffts = np.array(gated_ffts)
    if check:
        # plot middle fft just to see!
        plt.plot(ffts[int(nffts/2)])
        plt.show(block=False)
    return ffts

Это должно дать вам начало, я все еще работаю над этим и свяжусь с вами, когда у меня будет дальнейшее развитие - но если у вас есть какие-либо идеи, пожалуйста, поделитесь ими.

В любом случае моя стратегия заключается в следующем:

1 / найти пики (т. Е. Начало любых звуков), затем 2 / найти диапазоны частот, которые поднимаются и опускаются в унисон (т. Е. Составляют звук).

А также

3 / Разделите их на отдельные инструменты (точнее, на источники звука) и наметьте время и их амплитуды для проведения анализа (оценки).

Надеюсь, вам весело с этим - я знаю, что я.

Как я уже говорил любые мысли ...

Отношении

Тони

1
Anthony Aldridge 16 Ноя 2019 в 05:45
Выглядит великолепно - я был бы счастлив протестировать его, как только он будет готов!
 – 
gregory michael travis
18 Ноя 2019 в 22:29

Используйте анализатор спектра для обнаружения участков с высокой амплитудой. Если вы программируете - вы можете взять каждую секцию и сделать среднее значение присутствующих частот (и амплитуд), чтобы дать вам представление об инструменте (ах), задействованном в создании этого пика амплитуды.

Надеюсь, это поможет - если вы используете Python, я мог бы дать вам несколько советов, как программировать это !?

Отношении

Тони

0
Anthony Aldridge 11 Ноя 2019 в 20:57
Конечно, было бы здорово. Я использую Python и Haskell.
 – 
gregory michael travis
12 Ноя 2019 в 00:08