Первая часть: Механические волны, особенности во временной области, а также как и зачем их извлекать.

Если вы когда-нибудь решали сразиться с искусственным интеллектом звуковой проект, вы, вероятно, вскоре осознали, что люди, которые занимаются этими проектами, делятся на два лагеря. Те, кто смирен. И тех, кто вот-вот будет. Причина, по которой вы, возможно, это поняли, заключается в том, что на самом деле вы возьметесь за два проекта. Обработка аудиосигнала, необходимая для преобразования исходного сигнала в спектрограммы. (Спектрограммы - это изображения характеристик частотно-временной области, которые были извлечены из волновых сигналов) И когда они у вас есть, вы можете двигаться дальше с прямым проектом глубокого обучения классификации изображений с использованием этих спектрограмм. Да, вы никогда не будете запускать модель для самого звука, а вместо этого обработаете звук в изображения и создадите модель обучения без учителя для классификации этих изображений. Но не беспокойтесь, если это ваш первый проект подобного рода. Я беспокоюсь за нас обоих, и цель этой статьи - провести вас через этот процесс.

Итак, что такое механические волны?

Звук создается вибрацией объектов, и эти колебания заставляют молекулы колебаться и сталкиваться друг с другом, тем самым изменяя давление воздуха в окрестностях, что в конечном итоге создает волны. Механическая волна - это волна, которая колеблется и передает энергию из одной точки в другую через среду воздуха. Молекулы, которые сталкиваются во времени, имеют пики сжатия и впадины разрежения. Это можно представить в виде синусоидальных волн. Чтобы не упрощать, звук - это просто энергия, которая перемещается в пространстве с использованием воздуха в качестве среды.

Ниже мы можем представить сложную форму волны, которая отображает отклонение от нулевого уровня возмущения воздуха в зависимости от времени. Вот как выглядит звук.

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

Частота, амплитуда и фаза

На изображении выше есть два черных пика и провала. Расстояние от одного пика до другого или от одного падения до другого называется периодом. Частота - это просто величина, обратная периоду, когда F = 1 / T. Частота измеряется в герцах или Гц.

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

Если в определенное время больше периодов, чем меньше в это же время, это приведет к более высокой частоте и, наоборот, приведет к более низкой частоте. Чем выше частота, тем выше звук. Подумайте о способности Мэрайи Кэри брать эту высокую до как высокую частоту, а басовые ноты Барри Уайта - как низкую.

Если амплитуда велика, вы будете воспринимать этот звук как громкий. Если он низкий, вы услышите его как тихий. Разве это не увлекательно?

Но что делать, если звук слишком мягкий или частота слишком высокая?

Если дерево падает посреди леса и никто его не слышит, издает ли оно звук?

Много месяцев назад существовала субкультура, которая называла себя «головорезами». Они слушали действительно очень громкую музыку. Откровенно говоря, они послушали ее слишком громко, чтобы мои уши не смогли оценить ее по достоинству. Но он никогда не выходил из зоны досягаемости, где я не мог слышать, как они глушили звук в квартале от меня. Однако я был свидетелем того, как человек использовал свисток, которого я никогда не слышал, но похоже, что окружающие собаки могут. Если они могут слышать звуки, недоступные людям, значит, у нас должны быть ограничения на нашу способность слышать определенные звуки. Возможно из-за частоты. Был ли собачий свисток слишком высокочастотным, чтобы я мог его услышать? да. Люди могут слышать частоты в диапазоне 20–20 000 Гц. Перейдите по этой ссылке для получения дополнительной информации.



Эта концепция действительно крутая, потому что как мы узнаем, что вокруг нас нет множества звуков, которые находятся за пределами нашего диапазона? Разве они не существуют только потому, что мы их не слышим? Я в этом сомневаюсь.

Как мы воспринимаем звук и музыку.

Впервые я начал серьезно играть на гитаре и фортепиано в конце 90-х, и мне посчастливилось иметь учителем ученика Андреса Сеговиа. Он настоял на том, чтобы я настраивал гитару с помощью камертона вместо цифрового тюнера. Вот как я узнал об A-440 Гц, потому что камертон создает эту частоту, когда вы ударяете ее о другой объект. Он посоветовал мне подойти к пианино и найти ту же «ноту» на пианино. Это был вопрос с подвохом, потому что несколько «нот» звучат одинаково, только выше или ниже, чем у A-440. Он имел в виду найти место на пианино. Высота звука - это идея, которую мы используем для восприятия частоты. Мы слышим высоту звука не линейно, а логарифмически. Чтобы еще больше подтвердить это, я позже обнаружил, что A выше 440 Гц составляет 880 Гц, а тот, что выше него, составляет 1760 Гц. Вы видите узор? Тот, что выше или ниже объекта A, находится всего в 2 раза. Это убедило меня в том, что мы не воспринимаем звук линейно. Если бы мы это сделали, разница между одной октавой и другой осталась бы постоянной, независимо от того, насколько высока или низка высота звука. Эта концепция пригодится позже.

Почему инструменты различимы

Другой способ настроить гитару - это ударить по фортепьяно с частотой A-440 Гц и настроить свою струну A на фортепьяно, предполагая, что она настроена. Оба инструмента имеют одинаковую частоту и интенсивность звука, поэтому их можно настроить. Но что именно заставляет их звучать иначе? Мы можем закрыть глаза и услышать высоту звука пианино и точно такую ​​же высоту звука саксофона, но при этом провести различие между ними. Причина тому - тембр. Тембр - это цвет тона или его качество. Даже внутри одного и того же инструмента музыкант может сделать одинаковую высоту звука разной, хотя и одной и той же высотой. Да… но как компьютер сможет различать, о чем вы спрашиваете? Давайте продолжим и рассмотрим простой код на Python, чтобы увидеть, видим ли мы разницу, когда строим формы сигналов двух разных инструментов, играющих одинаковую высоту звука в течение одной и той же продолжительности.

Нам нужно будет импортировать следующие библиотеки, показанные ниже.

import IPython.display as ipd
import os
import librosa
import librosa.display
import matplotlib.pyplot as plt
%matplotlib inline

У меня есть созданные мной волновые файлы джазового органа и рояля Steinway. Оба имеют одинаковую продолжительность, высоту и интенсивность. Вот как вы создаете путь для загрузки вашего wav файла.

path = os.getcwd()
file_name = '/Users/your_path/to_folder_where_your_wavefile_'
new_path = os.path.join(path, file_name)
os.chdir(new_path)

Если вы хотите воспроизвести конкретный файл wav для проверки работоспособности, используйте IPython.display как ipd.

ipd.Audio(A_440_Hz[0])

Теперь, когда вы точно знаете, что имеете дело с сигналом, мы переходим на Либрозу.

steinway , sr = librosa.load(A_440_Hz[0])
jazz_organ , sr = librosa.load(A_440_Hz[1])

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

duration = sample_duration * len(jazz_organ)
print(f'duration of jazz organ signal is: {duration: 2f} seconds')
output: duration of jazz organ signal is: 8.000000 seconds
duration = sample_duration * len(steinway)
print(f’duration of steinway signal is: {duration: 2f} seconds’)
output: duration of steinway signal is: 8.000000 seconds

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

plt.figure(figsize=(24,6))
librosa.display.waveplot(jazz_organ, alpha = .5)
plt.title('JAZZ ORGAN A-440-Hz')
plt.ylim(-1, 1)
plt.show()

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

plt.figure(figsize=(24,6))
librosa.display.waveplot(steinway, alpha = .5)
plt.title('Steinway A-440-Hz')
plt.ylim(-1, 1)
plt.show()

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

Ранее я сказал, что оба звука имеют одинаковую высоту, интенсивность и частоту, но мы не видим никаких доказательств того, что это одна и та же высота звука. Это то, что объясняет разницу в формах сигналов? Они разные передачи? Скорее всего, не. Лучшее объяснение этого явления состоит в том, что это функции временной области, а не функции частотной области, которые мы рассмотрим в следующей статье, но сначала давайте рассмотрим еще несколько функций временной области, помимо звуковой оболочки.

Аналоговый сигнал в цифровой

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

Выборка - это значение или набор значений в определенный момент времени. По сути, мы выбираем период, и в каждый период мы берем образец. Частота дискретизации - это количество отсчетов в секунду, обратное периоду. S r = 1 / T. Если вас интересует дополнительная информация о выборке, вот ссылка.



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

Частота Найквиста - это верхняя граничная частота, которую мы можем иметь в цифровом сигнале без воспроизведения артефакта, и ее формула: Fn = Sr / 2. Частота дискретизации для большинства современных музыкальных плееров составляет 44100, и если разделить на 2, получится 22050 Гц, что является верхней границей частоты, которую люди могут слышать. Помните ранее.

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



Функции временной области

Аудио функции - это дескрипторы звука. Когда мы имеем дело с формами волны, мы имеем дело со временем, а события происходят во времени. Мы можем взглянуть на все события во времени, выделив особенности вдоль оси x формы волны. Огибающая амплитуды, среднеквадратичная энергия и частота пересечения нуля - вот некоторые из характеристик, которые мы можем извлечь.

Чтобы извлечь эти функции, нам нужно взять преобразованный цифровой сигнал и применить к нему кадрирование. Фрейминг - это группировка большого количества отсчетов сигнала в конкретный кадр. Мы делим все выборки на кадры, а затем проверяем, что длительность кадра достаточно велика, чтобы люди могли воспринимать сигнал. Все, что меньше 10 мс, ниже временного разрешения человеческого уха. Для этого продолжительность кадра = 1 / частота дискретизации * k (размер кадра) и назначьте частоту дискретизации 44100 Гц и размер кадра не менее 500.

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

Мы собираемся снова использовать Librosa, но на этот раз в качестве образцов мы будем использовать кошек.

cat_20, sr = librosa.load(cats[20])
len(cats), sr
Output: (26, 22050)
cat_99 , sr = librosa.load(cats[99])
len(cat_99)
Output: (246960)

Если мы посмотрим на длину массива обеих кошек, вы заметите, что cat_20 меньше. Теперь давайте посмотрим, какие первые 25 значений находятся в этих массивах.

cat_20[:25]
Output: array([-0.02869544, -0.03226709, -0.02647833, -0.02724418, -0.02664405,
 -0.02373683, -0.02506031, -0.02607695, -0.02617143, -0.02862327,
 -0.03005172, -0.03034695, -0.03152664, -0.03144585, -0.03056201,
 -0.03005065, -0.02873663, -0.02774573, -0.02756811, -0.02704341,
 -0.0272577 , -0.02817268, -0.02817227, -0.0277576 , -0.02757546],
 dtype=float32)
cat_99[:25]
Output: array([-0.02869544, -0.03226709, -0.02647833, -0.02724418, -0.02664405,
 -0.02373683, -0.02506031, -0.02607695, -0.02617143, -0.02862327,
 -0.03005172, -0.03034695, -0.03152664, -0.03144585, -0.03056201,
 -0.03005065, -0.02873663, -0.02774573, -0.02756811, -0.02704341,
 -0.0272577 , -0.02817268, -0.02817227, -0.0277576 , -0.02757546],
 dtype=float32)

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

FRAME_SIZE = 1024
STEP_LENGTH = 512
def amplitude_envelope(signal, frame_size, step_length):
    return np.array([max(signal[sample: sample + frame_size]) for     sample in range(0, signal.size, step_length)])

Теперь, когда у нас есть функция, мы просто скармливаем ей наши входные параметры.

ae_cat_99 = amplitude_envelope(cat_99, FRAME_SIZE, STEP_LENGTH)
len(ae_cat_99)
Output: 517
ae_cat_20 = amplitude_envelope(cat_20, FRAME_SIZE, STEP_LENGTH)
len(ae_cat_20)
Output: 55

Как вы могли заметить, теперь длины намного меньше, так как мы взяли только максимальные значения для каждого кадра.

Вот как выглядят оба сигнала до того, как мы поместим их в эту функцию.

И после.

Верхнее изображение не обтекает значения так плотно, как нижнее, но, если вы заметили, верхнее изображение довольно короткое.

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

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

cat_99, _ = librosa.load(cats[99])
FRAME_LENGTH = 1024
STEP_LENGTH = 512
rms_cat_99 = librosa.feature.rms(cat_99, frame_length = FRAME_SIZE, step_length = STEP_LENGTH)[0]

Мы добавим код для построения графика и посмотрим, как это выглядит с огибающей амплитуды.

frames = range(0, rms_cat_99.size)
t = librosa.frames_to_time(frames, step_length = STEP_LENGTH)
plt.figure(figsize=(24,6))
librosa.display.waveplot(cat_99, alpha = .5)
plt.plot(t, ae_cat_99, color = 'r' )
plt.plot(t, rms_cat_99, color = 'black' )
plt.title('cat # 99')
plt.ylim(-1, 1)
plt.show()

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

Заключение

Мы рассмотрели довольно много концепций и идей, включая некоторый код. Но не перегружайте себя всеми различными частями, но, пожалуйста, возьмите домой большую идею о том, что обработка аудиосигнала необходима для преобразования сигналов в спектрограммы. Спектрограмма - это визуальный способ представления силы или «громкости» сигнала с течением времени на различных частотах, присутствующих в конкретной форме волны. Можно не только увидеть, есть ли больше или меньше энергии, например, при 440 Гц против 880 Гц, но также можно увидеть, как уровни энергии меняются во времени. Обладая этой информацией, мы можем применять алгоритмы машинного обучения к этим представлениям, чтобы делать прогнозы, принадлежит ли оно определенному классу или нет.

Мы не рассмотрели какие-либо особенности частотной области, потому что мы не применили «очень особенное» преобразование к нашему сигналу, и это оставило нам для анализа только функции временной области. Эти функции являются важными дескрипторами звука и жизненно важны для проектов ИИ, таких как классификация звука, точно так же, как квадратные метры были бы важным атрибутом для прогнозирования цен на жилье.

В следующей статье мы рассмотрим «очень специальное» преобразование, называемое быстрым преобразованием Фурье. Анализ Фурье преобразует сигнал из его исходной области в представление в частотной области. Затем мы сможем создавать наши спектрограммы для использования в качестве входных изображений для части классификации изображений, упомянутой во введении.

Спасибо за чтение!

Я узнал об обработке аудиосигнала во время своего проекта в Метис, где я обучил нейронную сеть классифицировать, исходил ли определенный аудиоклип от собаки или кошки. Чтобы просмотреть некоторые из моих проектов, посетите мою страницу Github. И, пожалуйста, свяжитесь со мной в Linkedin, если у вас есть какие-либо вопросы или вы хотите подключиться.