Найти в Дзене
Nuances of programming

Анализ аудиоданных с помощью глубокого обучения и Python (часть 1)

Оглавление

Источник: Nuances of Programming

Введение

Аудиоанализ — область, включающая автоматическое распознавание речи (ASR), цифровую обработку сигналов, а также классификацию, тегирование и генерацию музыки — представляет собой развивающийся поддомен приложений глубокого обучения. Некоторые из самых популярных и распространенных систем машинного обучения, такие как виртуальные помощники Alexa, Siri и Google Home, — это продукты, созданные на основе моделей, извлекающих информацию из аудиосигналов.

Обзор аудиофайлов

Аудио фрагменты представлены в формате .wav. Звуковые волны оцифровываются путем выборки из дискретных интервалов, известных как частота дискретизации (как правило, 44,1 кГц для аудио с CD-качеством, то есть 44 100 семплов в секунду).

Каждый семпл представляет собой амплитуду волны в определенном временном интервале, где глубина в битах (или динамический диапазон сигнала) определяет, насколько детализированным будет семпл (обычно 16 бит, т.е. семпл может варьироваться от 65 536 значений амплитуды).

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

Звуковая волна в цифровом формате обозначена красным цветом, а синим — результат семплинга и 4-битного квантования. Справа находится результирующий массив.
Звуковая волна в цифровом формате обозначена красным цветом, а синим — результат семплинга и 4-битного квантования. Справа находится результирующий массив.

Приложения по обработке звука

К ним можно отнести:

  • Индексирование музыкальных коллекций согласно их аудиопризнакам.
  • Рекомендация музыки для радиоканалов.
  • Поиск сходства для аудиофайлов (Shazam).
  • Обработка и синтез речи — генерирование искусственного голоса для диалоговых агентов.

Обработка аудиоданных с помощью Python

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

Время/частота.
Время/частота.

Некоторые устройства могут улавливать эти звуки и представлять их в машиночитаемом формате. Примеры этих форматов:

  • wav (Waveform Audio File)
  • mp3 (MPEG-1 Audio Layer 3)
  • WMA (Windows Media Audio)

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

Аудио библиотеки Python

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

1. Librosa

Это модуль Python для анализа звуковых сигналов, предназначенный для работы с музыкой. Он включает все необходимое для создания системы MIR (поиск музыкальной информации) и подробно задокументирован вместе со множеством примеров и руководств.

Установка:

pip install librosa
или
conda install -c conda-forge librosa

Для повышения мощности декодирования звука можно установить ffmpeg, содержащий множество аудио декодеров.

2. IPython.display.Audio

С помощью IPython.display.Audio можно проигрывать аудио прямо в jupyter notebook.

Сюда загружен случайный аудиофайл. Попробуем передать его в консоль jupyter.

Загрузка аудиофайла:

-4

Этот фрагмент возвращает звуковой временной ряд в качестве массива numpy с частотой дискретизации по умолчанию 22 кГц моно. Это поведение можно изменить с помощью повторного семплинга на частоте 44,1 кГц.

librosa.load(audio_data, sr=44100)

Повторный семплинг также можно отключить:

librosa.load(audio_path, sr=None)

Частота дискретизации — это количество аудио семплов, передаваемых в секунду, которое измеряется в Гц или кГц.

Проигрывание аудио:

С помощью IPython.display.Audio можно проигрывать аудио в jupyter notebook.

import IPython.display as ipd
ipd.Audio(audio_data)

Этот фрагмент возвращает аудиовиджет:

-5

Визуализация аудио:

С помощью librosa.display.waveplot можно построить график массива аудио:

-6

-7

Ниже представлен график управления амплитудой формы волны:

-8

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

Спектрограмма — это визуальный способ представления уровня или «громкости» сигнала во времени на различных частотах, присутствующих в форме волны. Обычно изображается в виде тепловой карты.

Отобразить спектрограмму можно с помощью librosa.display.specshow.

-9

.stft() преобразует данные в кратковременное преобразование Фурье. С помощью STFT можно определить амплитуду различных частот, воспроизводимых в данный момент времени аудиосигнала. Для отображения спектрограммы используется .specshow.

-10

На вертикальной оси показаны частоты (от 0 до 10 кГц), а на горизонтальной — время. Поскольку все действие происходит в нижней части спектра, мы можем преобразовать ось частот в логарифмическую.

librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='log')
plt.colorbar()

-11

Создание аудиосигнала:

-12

Извлечение признаков из аудио сигнала

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

Спектральные (частотные) признаки получаются путем преобразования временного сигнала в частотную область с помощью преобразования Фурье. К ним относятся частота основного тона, частотные компоненты, спектральный центроид, спектральный поток, спектральная плотность, спектральный спад и т.д.

  • Спектральный центроид

Указывает, на какой частоте сосредоточена энергия спектра или, другими словами, указывает, где расположен «центр масс» для звука. Схож со средневзвешенным значением:

-13

где S(k) — спектральная величина элемента разрешения k, а f(k) — частота элемента k.

librosa.feature.spectral_centroid вычисляет спектральный центроид для каждого фрейма в сигнале:

-14

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

-15

В начале спектрального центроида можно заметить подъем.

2. Спектральный спад

Это мера формы сигнала, представляющая собой частоту, в которой высокие частоты снижаются до 0. Чтобы получить ее, нужно рассчитать долю элементов в спектре мощности, где 85% ее мощности находится на более низких частотах.

librosa.feature.spectral_rolloff вычисляет частоту спада для каждого фрейма в сигнале:

spectral_rolloff = librosa.feature.spectral_rolloff(x+0.01, sr=sr)[0]
plt.figure(figsize=(12, 4))

librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_rolloff), color='r')

-16

3. Спектральная ширина

Спектральная ширина определяется как ширина полосы света на половине максимальной точки (или полная ширина на половине максимума [FWHM]) и представлена двумя вертикальными красными линиями и λSB на оси длин волн.

Фигура 1: Гауссово распределение интенсивности длин волн, выходящих из монохроматора. Спектральная полоса пропускания определяется красными границами и λSB. Ширина спектральной щели обозначена синими границами и λSSW.
Фигура 1: Гауссово распределение интенсивности длин волн, выходящих из монохроматора. Спектральная полоса пропускания определяется красными границами и λSB. Ширина спектральной щели обозначена синими границами и λSSW.

librosa.feature.spectral_bandwidth вычисляет спектральную ширину порядка p:

-18

-19

4. Скорость пересечения нуля

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

Формула для расчета скорости пересечения нуля, где St — сигнал длины t, II{X} — функция-индикатор (=1 if X true, else =0).
Формула для расчета скорости пересечения нуля, где St — сигнал длины t, II{X} — функция-индикатор (=1 if X true, else =0).

Более высокие значения наблюдаются в таких высоко ударных звуках, как в металле и роке. Теперь визуализируем этот процесс и рассмотрим вычисление скорости пересечения нуля.

-21

-22

Увеличение масштаба:

-23

-24

Здесь примерно 16 пересечений нуля. Проверим это с помощью Librosa.

zero_crossings = librosa.zero_crossings(x[n0:n1], pad=False)
print(sum(zero_crossings)) # 16

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

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

-25

-26

6. Цветность

Признак или вектор цветности обычно представлен вектором признаков из 12 элементов, в котором указано количество энергии каждого высотного класса {C, C# D, D # E, …, B} в сигнале. Используется для описания меры сходства между музыкальными произведениями.

librosa.feature.chroma_stft используется для вычисления признаков цветности.

-27

-28

Мы разобрались, как работать с аудиоданными и извлекать важные функции с помощью python. Теперь переходим к использованию этих функций и построению модели ANN для классификации жанров музыки.

Классификация жанров музыки с помощью ANN

-29

Набор данных состоит из 1000 звуковых треков, длина каждого составляет 30 секунд. Он содержит 10 жанров, каждый из которых представлен 100 треками. Все дорожки — это монофонические 16-битные аудиофайлы 22050 Гц в формате .wav.

Жанры, представленные в наборе:

  • Блюз
  • Классика
  • Кантри
  • Диско
  • Хип-хоп
  • Джаз
  • Метал
  • Поп
  • Регги
  • Рок

Для работы с нейронными сетями мы будем использовать Google Colab — бесплатный сервис, предоставляющий GPU и TPU в качестве сред выполнения.

План:

В первую очередь нужно преобразовать аудиофайлы в изображения формата PNG (спектрограммы). Затем из них нужно извлечь значимые характеристики: MFCC, спектральный центроид, скорость пересечения нуля, частоты цветности, спад спектра.

После извлечения признаки можно добавить в файл CSV, чтобы ANN можно было использовать для классификации.

Приступим!

  • Извлекаем и загружаем данные в Google Drive, а затем подключаем диск в Colab.
Структура директорий Google Colab после загрузки данных.
Структура директорий Google Colab после загрузки данных.

2. Импортируем все необходимые библиотеки.

-31

3. Теперь конвертируем файлы аудиоданных в PNG или извлекаем спектрограмму для каждого аудио.

-32

Спектрограмма семпла песни в жанре блюз:

-33

Преобразование аудиофайлов в соответствующие спектрограммы упрощает извлечение функций.

Создание заголовка для файла CSV.

-34

5. Извлекаем признаки из спектрограммы: MFCC, спектральный центроид, частоту пересечения нуля, частоты цветности и спад спектра.

-35

6. Выполняем предварительную обработку данных, которая включает загрузку данных CSV, создание меток, масштабирование признаков и разбивку данных на наборы для обучения и тестирования.

-36

7. Создаем модель ANN.

-37

Заключение

На этом первая часть подходит к концу. Мы провели анализ аудиоданных, извлекли важные признаки, а также реализовали ANN для классификации музыкальных жанров.

Во второй части попробуем выполнить то же самое с помощью сверточных нейронных сетей на спектрограмме.

Читайте также:

Читайте нас в телеграмме и vk

Перевод статьи Nagesh Singh Chauhan: Audio Data Analysis Using Deep Learning with Python (Part 1)