NTA

Способы представления аудио в ML

Мейнстримом последних лет в сфере DS/ML является NLP, в особенности, перспективы использования нейронных сетей, построенных на архитектуре трансформеров. Они используются в том числе в системах голосовых помощников, а голосовые помощники прочно входят в нашу жизнь. Тем не менее, важной составляющей успеха голосовых помощников является то, что они «голосовые», то есть, обращение к ним осуществляется посредством голоса, что значит — аудио. Часто работа с аудиосигналом производится посредством анализа как звука, так и изображения спектрограммы, но в данной статье будут рассмотрены способы представления именно аудио как совокупности различных признаков. Для работы используются библиотеки Python librosa и matplotlib. В качестве основного исходного аудиофайла будет использоваться мелодия открытия обычного сундука из игры The Legend of Zelda: Breath of the Wild в формате wav длительностью ~1 секунда. Информация, представленная в статье, может быть применена в областях speech-to-text, классификации звуков и других направлениях анализа аудио.

Импорт библиотек и загрузка файла:

import librosa import librosa.display import matplotlib.pyplot as plt y, sr = librosa.load(file)

В данном случае, «y» будет массивом чисел, содержащим в себе сам аудиофайл в числовом виде, а «sr» — sample rate, то есть, частотой дискретизации аудио.

Имея эти данные уже можно представить аудио как временной ряд, где по оси Y будет амплитуда сигнала. Следует отметить, что, по умолчанию, librosa.load() считывает файл в моно-режиме. Далее представлен код для отрисовки необходимых представлений:

fig, ax = plt.subplots(nrows=1, sharex=True, sharey=True) librosa.display.waveplot(y, sr=sr, ax=ax) ax.set(title='Monophonic') ax.label_outer() plt.show()
Рисунок 1 – аудиосигнал как амплитуда ко времени

На рисунке 1 можно заметить «бугорки». Если прослушать исходный файл, то станет очевидно, что количество «бугорков» соответствует количеству нот в мелодии (семь), хотя вторая нота «смазанная», что заметно на графике. При этом, акцентированные ноты, а именно: первая, третья и седьмая, звучат резче, громче и это отражено на графике большей амплитудой сигнала.

Теперь же можно посмотреть на более интересное представление аудио. Далее приведён его код:

S = np.abs(librosa.stft(y)) fig, ax = plt.subplots() img = librosa.display.specshow(librosa.amplitude_to_db(S, ref=np.max), y_axis='log', x_axis='time', ax=ax) ax.set_title('Power spectrogram') fig.colorbar(img, ax=ax, format="%+2.0f dB") plt.show()
Рисунок 2 – спектрограмма исходного аудиофайла

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

Преобразование Фурье разлагает функцию времени (сигнал) на составляющие частоты. Точно так же, как музыкальный аккорд может быть выражен громкостью и частотами составляющих его нот, преобразование Фурье, применённое к функции, отображает амплитуду каждой частоты, присутствующей в базовой функции (сигнале). Именно это мы и видим на рисунке 2. На нём три шкалы – время к частоте, что интуитивно понятно, и дополнительная шкала децибел, показывающая плотность, мощность сигнала на определённой частоте в определённый промежуток времени. Существует альтернативное трёхмерное представление, которое может помочь понять спектрограммы. Оно представлено на рисунке 3:

Рисунок 3 – трёхмерное представление части некоторого музыкального произведения

Так, если сложить все «срезы» трёхмерного представления и «насыщенность» областей отразить цветом, то получится цветное двухмерное представление как на рисунке 2.

Подытожим вышенаписанное: спектрограмма, полученная применением преобразования Фурье к аудиосигналу позволяет «увидеть» как насыщены определённые частоты в аудиосигнале.

Наиболее наглядным, по мнению автора, является сравнение спектрограмм записи классической музыки с лёгким звучанием и какого-нибудь «тяжёлого» жанра с большой плотностью и насыщенностью звука. Пусть, в данном случае, это будут «Чайковский – Танец феи драже» (рисунок 4) и «Megadeth – Symphony of Destruction» (рисунок 5).

На изображениях аудиодорожек в данном случае видно, что классика и метал сильно отличаются, как минимум, в части громкости: классика может быть тихой и громкой — отчётливо видны места затишья и громких моментов, метал же почти всю композицию звучит только громко.

Спектрограммы же показывают, что в «Танце феи драже» много высоких нот, низких довольно мало – их частоты слабее заполнены, и композиция выстроена сложнее стандартных «куплет-припев». «Symphony of Destruction» же, напротив, практически равномерно заполняет все частоты, ударные и бас-гитара «раскаляют» низкие частоты спектрограммы, композиция содержит много повторяющихся частей.

Теперь, вооружившись знаниями выше, перейдём к разбору, вероятно, наиболее популярного представления аудио в machine learning – мел-кепстральным коэффициентам.

Здесь графики внесут мало понимания, поэтому, сразу приступим к теории:

Если несколько грубо обобщить, то можно прийти к определению, что нота – это колебание определённой частоты, так, Ля первой октавы – это колебания 440 Гц. Однако, человек воспринимает звук неидеально, восприятие высоты звука зависит не только от частоты колебаний, но и от уровня громкости звука и его тембра. Именно для анализа аудио, учитывающего особенности человеческого слуха, была введена психофизическая единица высоты звука – мел. Факт из Википедии: «Звуковые колебания частотой 1000 Гц при эффективном звуковом давлении 2⋅10−3 Па (то есть при уровне громкости 40 фон), воздействующие спереди на наблюдателя с нормальным слухом, вызывают у него восприятие высоты звука, оцениваемое по определению в 1000 мел. Звук частоты 20 Гц при уровне громкости 40 фон обладает по определению нулевой высотой (0 мел). Зависимость нелинейна, особенно при низких частотах (для «низких» звуков).» На рисунке 6 изображена шкала мел к частоте:

Рисунок 6 — График зависимости высоты звука в мелах от частоты колебаний (для чистого тона)

Таким образом, для того чтобы получить спектрограмму, которая будет отражать то, как именно человек воспринимает звучание, необходимо произвести некоторые преобразования, чтобы получить мел-кепстральные коэффициенты. Также, следует отметить, что «некоторые преобразования» устроены таким образом, что большая детализация признаков обеспечивается в области низких частот – наиболее используемых человеком. Ведь, человеческое ухо, в среднем, слышит в диапазоне 20-20000 Гц, при этом (приведём ещё один факт из Википедии): «Голос типичного взрослого мужчины имеет фундаментальную частоту (нижнюю) от 85 до 155 Гц, типичной взрослой женщины от 165 до 255 Гц.». Остальные же составляющие голоса – обертоны. Примерно так же обстоит дело и с музыкальными инструментами.

Подытожим вышенаписанное: мел-кепстральные коэффициенты позволяют нам представить аудио в виде, наиболее близком к восприятию звука человеком.

С помощью библиотеки librosa можно получить данные в нужном виде простым вызовом функции mfcc(). Код вызова функции вместе с отрисовкой результата приведён ниже, а результат выполнения кода представлен на рисунке 7.

mfccs = librosa.feature.mfcc(y=y, sr=sr) fig, ax = plt.subplots() img = librosa.display.specshow(mfccs, x_axis='time', ax=ax) fig.colorbar(img, ax=ax) ax.set(title='MFCC') plt.show()
Рисунок 7 – MFCC для исходного файла

К сожалению, приведённая на рисунке 7 визуализация, по мнению автора, не так наглядна и информативна, как спектрограммы, но ниже также представлены визуализации для «Танца феи драже» (рисунок 8) и «Symphony of Destruction» (рисунок 9):

Рисунок 8 — MFCC для «Танца феи драже»
Рисунок 9 — MFCC для «Symphony of Destruction»

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

0
1 комментарий
Зуфар Хасанов

Спасибо за статью. Начинаю только погружаться в тему. Кстати, в первом примере вместо librosa.display.waveplot использовал librosa.display.waveshow, иначе питон ругался на отсутствие атрибута.

Ответить
Развернуть ветку
Читать все 1 комментарий
null