Основная цель статьи — демистифицировать процесс подготовки аудиоданных к анализу и сложные понятия, связанные с аудиоданными.

Мне показалось утомительным иметь дело со звуковыми данными во время работы над личным проектом по распознаванию звуков птиц. То, что делает его таким сложным, заключается в том, что существует множество концепций, связанных со звуком, которые нужно понимать, чтобы иметь возможность свободно манипулировать им в соответствии со своими требованиями. Кроме того, анализ аудиоданных с использованием машинного обучения или распознавания звука выполняется меньше, чем с помощью компьютерного зрения и обработки естественного языка.

Оглавление

  1. Что такое аудиоданные?
  2. Загрузка данных
  3. Обработка данных и увеличение
  4. Извлечение признаков и визуализация

Что такое аудиоданные?

Прежде всего, аудиоданные — это тип неструктурированных данных, для обработки и подготовки к анализу которых требуется много усилий. Но как только он приведен к удобному формату, он предлагает множество полезной информации.

Расшифровка общих терминов:

Аудио: вибрация, распространяющаяся в виде волны.

Сэмплирование: преобразование непрерывного сигнала в цифровой сигнал.

Образец: значение, обычно обозначающее значение амплитуды в определенный момент времени.

Частота выборки: количество выборок звука, записываемых в секунду (в герцах).

Амплитуда: значение высоты звуковой волны.

Частота/высота: общее количество волн, создаваемых в секунду.

Обычно мы представляем цифровой звук путем преобразования звуковой волны в последовательность числовых отсчетов.

Временная область. В этой области звуковой сигнал представляет собой волну, амплитуда которой (ось Y) изменяется во времени (ось X).

Частотный домен. В этом домене аудиосигнал представлен как последовательность частот (ось X) с соответствующей мощностью (ось Y).

Общедоступные звуковые форматы:

Существует три наиболее распространенных цифровых аудиоформата:

  • Формат wav (аудиофайл Waveform)
  • Формат mp3(MPEG-1 Audio Layer 3)
  • Формат WMA(Windows Media Audio)

Чтобы избежать потери информации из-за сжатия, которое происходит с mp3-аудио, мы предпочитаем аудиоформат wav для анализа данных.

Загрузка данных

Давайте сначала послушаем аудиофайл в Python.

import IPython.display as ipd
ipd.Audio('D:/wavAudio/1.wav')

Библиотека Librosa предлагает полезные утилиты для загрузки и обработки аудиоданных.

import librosa
signal, sample_rate = librosa.load('D:/wavAudio/1.wav',sr = None) 
# sr = None makes sure the native sample rate of audio is used.

Librosa создает массив образцов нормализованного аудио временного ряда.

Обработка данных и увеличение

  • Тихие части в аудио добавляют ненужный шум к данным (о, ирония!). Удалим их.
def removeSilence(signal):
    return signal[librosa.effects.split(signal)[0][0] : librosa.effects.split(signal)[0][-1]]
  • Для каждого аудиоклипа продолжительностью более 10 секунд давайте разделим его на фрагменты по 5 секунд каждый, чтобы получить больше обучающих примеров.
from pydub import AudioSegment
def create_chunks(audio,filename):
    if len(audio) < 10000:
        return "Audio too small"
    chunk_no = 0
    t1 = 0
    for step in range(0,len(audio),5000):
        t2 = step
        if step == 0:
            t1 = step
            continue
        curr_chunk = audio[t1:t2]
        chunk_no += 1
        curr_chunk.export(filename + '-' + str(chunk_no) + '.wav', format="wav")
        t1 ,t2 = t2, t1
for wav in os.listdir('D:/wavAudio/'):
    audio = AudioSegment.from_wav('D:/wavAudio/' + wav)
    create_chunks(audio,wav[:-4])

Во время работы над своим проектом я столкнулся с неприятной, но распространенной дилеммой нехватки данных. Преимущество (возможно, единственное) обработки неструктурированных данных заключается в возможности дополнения данных без внесения большого смещения, в отличие от табличных данных.

  • Я изложил некоторые из наиболее распространенных дополнений, сделанных с помощью аудиоданных. Мои предпочтительные варианты: Громкость, Шум и Сдвиг.
import nlpaug.augmenter.audio as naa
signal, sample_rate = librosa.load('D:/C Drive Documents/Bird_Sound_Recognition/Data for each bird/data/xeno-canto-dataset/AshyPrinia/' + 'DNPrinia570426.wav',sr = None)
plt.figure(figsize = (10,10))
plt.subplot(6,1,1)
plt.title("Crop")
librosa_display.waveplot(naa.CropAug(sampling_rate=sample_rate).augment(signal), sr=sample_rate, alpha=0.75)
plt.subplot(6,1,2)
plt.title("Masking")
librosa_display.waveplot(naa.MaskAug(sampling_rate=sample_rate, mask_with_noise=False).augment(signal), sr=sample_rate, alpha=0.75)
plt.subplot(6,1,3)
plt.title("Increasing speed")
librosa_display.waveplot(naa.SpeedAug().augment(signal), sr=sample_rate, alpha=0.75)
plt.subplot(6,1,4)
plt.title("Increasing volume")
librosa_display.waveplot(naa.LoudnessAug().augment(signal), sr=sample_rate, alpha=0.75)
plt.subplot(6,1,5)
plt.title("Adding white noise")
librosa_display.waveplot(naa.NoiseAug().augment(signal), sr=sample_rate, alpha=0.75)
plt.subplot(6,1,6)
plt.title("Shifting the signal by some time")
librosa_display.waveplot(naa.ShiftAug(sampling_rate=sample_rate).augment(signal), sr=sample_rate, alpha=0.75)
plt.tight_layout()
plt.show()

Извлечение признаков и визуализация

Общая волновая диаграмма

  • Давайте сначала визуализируем наиболее распространенный график зависимости амплитуды от времени.
plt.figure(figsize = (10,15))
librosa.display.waveplot(signal,sr=sample_rate, max_points=50000.0, x_axis='time', offset=0.0, max_sr=1000)
plt.show()

Этот сюжет не дает нам много информации. Давайте немного обработаем звук.

Преобразование Фурье

  • Давайте теперь применим преобразование Фурье к нашему аудиосигналу, чтобы получить информацию о частотах в сигнале.

Проще говоря, преобразование Фурье — это преобразование аудиосигнала из временной области в частотную.

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

signal, sample_rate = librosa.load('D:/wavAudio/1.wav',sr = None)
print(librosa.stft(signal))

Спектрограмма

Спектрограмма отображает силу сигнала или громкость (в децибелах) за период времени при различных значениях частот волны.

# Plot spectogram
plt.figure(figsize=(10, 4))
D = librosa.amplitude_to_db(np.abs(librosa.stft(signal)), ref=np.max)
# amplitude_to_db converts an amplitude spectrogram to dB-scaled spectrogram
librosa.display.specshow(D, y_axis='linear')
plt.colorbar(format='%+2.0f dB')
plt.title('Linear-frequency power spectrogram')
plt.show()

Мел-спектрограмма

Мел-спектрограмма представляет собой спектрограмму, преобразованную в мел-шкалу.

mel_scale_frequency = 2595 * log(1 + frequency/700)

Разработанная мной функция принимает аудиосигнал и частоту дискретизации в качестве входных данных, генерирует изображениеmel-spectrogramи сохраняет его в целевом пути.

def mel_spectogram_generator(audio_name,signal,sample_rate,augmentation,target_path):
    S = librosa.feature.melspectrogram(y=signal,sr=sample_rate,
                                    n_fft=N_FFT,
                                    hop_length=HOP_SIZE, 
                                    n_mels=N_MELS, 
                                    htk=True, 
                                    fmin=FMIN, 
                                    fmax=sample_rate/2)
plt.figure(figsize=(10, 4))
    librosa.display.specshow(librosa.power_to_db(S**2,ref=np.max), fmin=FMIN,y_axis='linear')
    plt.axis('off')
    plt.savefig(target_path + augmentation + audio_name[:-4] + '.png',bbox_inches='tight',transparent=True, pad_inches=0)
    plt.clf()
    plt.close("all")
    gc.collect()

Создание частотных спектрограмм мела для аудиосигналов, а также для дополненных аудиосигналов.

# Parameters initialization
N_FFT = 1024         
HOP_SIZE = 1024       
N_MELS = 128            
WIN_SIZE = 1024      
WINDOW_TYPE = 'hann' 
FEATURE = 'mel'      
FMIN = 1400
folder_path = 'D:/C Drive Documents/Bird_Sound_Recognition/Data for each bird/data/xeno-canto-dataset/White-throatedKingfisher/'
for wav in os.listdir(folder_path):
    signal, sample_rate = librosa.load(folder_path + str(wav) ,sr = None)
mel_spectogram_generator(wav,signal,sample_rate,'',folder_path)
    print(wav)
    mel_spectogram_generator(wav,naa.LoudnessAug().augment(signal),sample_rate,'Loud',folder_path)
    print('Loud' + wav)
    mel_spectogram_generator(wav,naa.NoiseAug().augment(signal),sample_rate,'Noise',folder_path)
    print('Noise' + wav)
    mel_spectogram_generator(wav,naa.ShiftAug(sampling_rate=sample_rate).augment(signal),sample_rate,'Shift',folder_path)
    print('Shift' + wav)

Давайте посмотрим, как визуализировать мел-спектрограмму для одного аудиосигнала

# Plot mel-spectrogram
N_FFT = 1024         
HOP_SIZE = 1024       
N_MELS = 128            
WIN_SIZE = 1024      
WINDOW_TYPE = 'hann' 
FEATURE = 'mel'      
FMIN = 0
S = librosa.feature.melspectrogram(y=signal,sr=sample_rate,
                                    n_fft=N_FFT,
                                    hop_length=HOP_SIZE, 
                                    n_mels=N_MELS, 
                                    htk=True, 
                                    fmin=FMIN, 
                                    fmax=sample_rate/2)
plt.figure(figsize=(10, 4))
librosa.display.specshow(librosa.power_to_db(S**2,ref=np.max), fmin=FMIN,y_axis='linear')
plt.colorbar(format='%+2.0f dB')
plt.title('Mel-scaled spectrogram')
plt.show()

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

Кепстральные коэффициенты Mel-частоты (MFCC)

MFCC действует как метод поиска музыкальной информации. Мел-частотные кепстральные коэффициенты (MFCC) сигнала представляют собой небольшой набор признаков (обычно около 10–20), которые кратко описывают общую форму спектральной огибающей. В МИР часто используется для описания тембра. —https://musicinformationretrieval.com/mfcc.html

def mfcc_features(signal,sample_rate):
    return np.mean(librosa.feature.mfcc(y=signal, sr=sample_rate, n_mfcc=20).T,axis=0).tolist()
mfcc_features(signal,sample_rate)

Мы получаем набор из 20 функций, которые инкапсулируют всю информацию внутри аудиосигнала. Это здорово. Передайте эти входные функции (вместе с метками) любой модели машинного обучения, ориентированной на классификацию, включая вашу собственную искусственную нейронную сеть (если у вас достаточно аудиоклипов, чтобы использовать это!).

Отказ от ответственности: у меня нет опыта в обработке аудиосигналов.

Сказав это, я попытался объяснить все основные концепции и методы того, как я подошел к разработке моего собственного проекта распознавания звука (https://github.com/msvrk/Bird_Sound_Recognition). Мое единственное намерение — помочь всем, кто плохо знаком с аудиоданными, предоставив им простое руководство для подражания.

И, наконец, всегда помните