Основная цель статьи — демистифицировать процесс подготовки аудиоданных к анализу и сложные понятия, связанные с аудиоданными.
Мне показалось утомительным иметь дело со звуковыми данными во время работы над личным проектом по распознаванию звуков птиц. То, что делает его таким сложным, заключается в том, что существует множество концепций, связанных со звуком, которые нужно понимать, чтобы иметь возможность свободно манипулировать им в соответствии со своими требованиями. Кроме того, анализ аудиоданных с использованием машинного обучения или распознавания звука выполняется меньше, чем с помощью компьютерного зрения и обработки естественного языка.
Оглавление
- Что такое аудиоданные?
- Загрузка данных
- Обработка данных и увеличение
- Извлечение признаков и визуализация
Что такое аудиоданные?
Прежде всего, аудиоданные — это тип неструктурированных данных, для обработки и подготовки к анализу которых требуется много усилий. Но как только он приведен к удобному формату, он предлагает множество полезной информации.
Расшифровка общих терминов:
Аудио: вибрация, распространяющаяся в виде волны.
Сэмплирование: преобразование непрерывного сигнала в цифровой сигнал.
Образец: значение, обычно обозначающее значение амплитуды в определенный момент времени.
Частота выборки: количество выборок звука, записываемых в секунду (в герцах).
Амплитуда: значение высоты звуковой волны.
Частота/высота: общее количество волн, создаваемых в секунду.
Обычно мы представляем цифровой звук путем преобразования звуковой волны в последовательность числовых отсчетов.
Временная область. В этой области звуковой сигнал представляет собой волну, амплитуда которой (ось 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). Мое единственное намерение — помочь всем, кто плохо знаком с аудиоданными, предоставив им простое руководство для подражания.
И, наконец, всегда помните…