Недавно я начал болтать об извлечении функций и диаризации докладчиков на небольшой встрече, которую мы провели здесь, на pyDelhi (встреча пользователей python, базирующаяся в Дели, Индия). Несмотря на то, что выступление было эпическим провалом (потому что все были многоуровневыми и никто не хотел знать, как производятся и анализируются звуки), я подумал о написании небольшой итоговой статьи, чтобы забить последний гвоздь в гроб.

В статье есть слайды моей презентации, 2 ядра Kaggle и видеосвязь с презентацией (качество записи ужасное, поэтому я не уверен, что это будет полезно), в любом случае наслаждайтесь.

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

TL;DR

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



Так что же такое диаризация говорящего?

Ну, это просто причудливый способ сказать - «Сегментирование аудиоклипа на помеченные сегменты в зависимости от того, кто и когда говорит». Это отличается от разделения источников, потому что в режиме разговора говорящего, если два человека говорят вместе одновременно, этот метод не гарантирует четко определенного вывода; в то время как при разделении источников два голоса могут быть извлечены. Само собой разумеется, что это две разные постановки проблемы.

Инструменты…

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

1. Извлечение и предварительная обработка данных

Здесь мы сразу имеем дело с аудиофайлом, и лучший инструмент, который я нашел для этого, - Librosa. Раньше я использовал pyAudio, но мне было не очень приятно.

Вам также потребуется установить Ffmpeg, который поможет Librosa лучше работать с аудиофайлами. Поскольку это пакет системного уровня, а не пакет pip, вам нужно будет установить его следующим образом:

!apt install -y ffmpeg #needed by librosa to function correctly

Выполнение этой команды в самом ядре выполнит свою работу.

2. Создание моделей и математика

Для обработки большей части математических операций и обработки данных в нашем распоряжении есть numpy и pandas.

Для создания сложных моделей машинного обучения нам поможет tensorflow.

Шаги, которым нужно следовать

Начнем с этого:

Шаги, которые мы предпримем для достижения нашей цели, следующие:

  • Разбейте целевой аудиоклип на куски равного размера (охватывающие равное количество времени). После этого у нас будет массив кусков аудиоданных одинакового размера.
  • Для каждого блока мы применяем обширный набор методов извлечения признаков и создаем вектор признаков для каждого блока. Теперь у нас есть матрица, в которой каждая строка является вектором признаков.
  • Теперь мы применяем алгоритм кластеризации, который объединяет каждый из этих фрагментов в четко определенные группы.
  • Фрагменты, принадлежащие к одной группе, теперь могут иметь цветовую кодировку, и, таким образом, мы получим сегментированный аудиоклип, основанный на том, кто говорит в этом конкретном фрагменте.

Следуя описанным выше шагам, мы (надеемся) получим следующее:

Понимание данных

Как бы легко это ни казалось, извлечение признаков не так просто, как многие думают. Это что угодно, только не вызов некоторых случайных библиотечных API-интерфейсов для данных и получение набора готовых к использованию векторов функций. Всегда помни:

«Сила алгоритма заключается в данных, с которыми он работает»

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

Чтобы понять, что на самом деле представляет собой волновой график, я предлагаю вам просмотреть эти слайды: https://docs.google.com/presentation/d/1BSJzd6W5niJKA99Rf8uHhsN4MCjB_ux1djPRPP9XTKY/edit?usp=sharing

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

1. Периодограмма (только для визуализации)

Волнистая диаграмма, которую вы обычно видите в приложении Spotify, представляет собой волновой график песни, которую вы слушаете. На волновом графике вы видите изменение амплитуды с течением времени. Теперь, если вы примените DFT (дискретное преобразование Фурье) к аудиоклипу, вы получите тот же аудиоклип, но в частотной области. Это означает, что вы потеряете всю информацию, относящуюся ко времени, но теперь вы увидите отдельные частоты простых составляющих синусоидальных волн, которые составляют всю сложную волну.

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

2. Спектрограмма (только для визуализации)

Эта визуализация создается путем взятия небольших окон стандартного размера на всей временной шкале звука и применения ДПФ к каждому из этих окон. Сложение их по горизонтали с небольшой постобработкой приведет к спектрограмме.

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

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

3. Спад спектра

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

В терминах приодограммы - это мера величины асимметрии вправо спектра мощности.



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

В основном это средневзвешенное значение элементов разрешения по частоте на кадр спектрограммы. Более доминирующая частота в кадре технически сместила бы центроид к себе.



5. Нулевая скорость перехода

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



6. Частотный кепстральный коэффициент Mel

бла



Это следующее видео - настоящая жемчужина ...



Для более текстового описания прочтите следующие две ссылки…





Предполагая, что вы видели видео, представленное выше, давайте поговорим о важном решении, которое вы хотели бы принять здесь. К настоящему времени вы должны знать, что MFCC - это набор из 40 и более коэффициентов, которые в основном обеспечивают удобный способ определения аудиоданных как чисел. Но для приложений преобразования речи в текст выбираются первые 20 коэффициентов, которые в основном формируют спектральную огибающую. Это важная информация, которая должна подсказать вам, почему вам не следует использовать спектральную огибающую для обнаружения говорящего. Причина, по которой спектральная огибающая используется для преобразования текста в речь, заключается в том, что независимо от того, кто говоря, фонемы, которые произносят два разных человека, образуют похожие спектральные оболочки. Таким образом, первые 20 коэффициентов фактически не зависят от динамика. Остальные 20 и выше называются спектральными деталями и содержат информацию о высоте тона и обертонах. Таким образом, чтобы на самом деле использовать MFCC для диаризации динамиков, мы выберем MFCC - от 11 до 40 (хотя использование всех 40 не причинит вам вреда, но использование 11–40 - хороший выбор функций, который вы можете сделать со своей стороны)

Уже…

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

Итак, мы все готовы с данными, теперь мы рассмотрим алгоритм, который мы будем применять к данным.

Алгоритм кластеризации

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



Таким образом, алгоритмы становятся действительно непредсказуемыми и иногда могут приводить к неприемлемым результатам. Чтобы улучшить нашу игру, давайте рассмотрим улучшенную версию K-Means - K-Means ++

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

Чтобы понять реализацию K-Means и K-Means ++ и более четко понять разницу между ними, я предлагаю вам пройти через это ядро ​​Kaggle.



Понимание вывода

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

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

Но подождите ... Это не идеально

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