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

Обработку речи можно разделить на 2 большие категории:
1. Распознавание речи: обнаруживается аудиосодержание речи
2. Распознавание динамика: определение говорящих в разговоре

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

1. Предпосылка

Для этого поста нам понадобятся Python, Librosa, Scipy.

2. Описание набора данных

Используемый здесь набор данных взят из
https://media.talkbank.org/ca/CallHome/eng
, и я взял https://media.talkbank.org/ca/CallHome/ eng / 4547.mp3 аудиофайл для диаризации динамика и выполнения понижающей дискретизации.

3. Импорт необходимой библиотеки, даунсэмплинг и конвертация mp3 в формат wav.

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

4. Блок-схема

Системы диаризации спикеров состоят из 3 основных блоков

Модуль обнаружения голосовой активности (VAD),
Модуль извлечения функций
Фрейминг кластеризации и сегментации

5. Предлагаемый метод

а) Сегментация (с использованием VAD): используя librosa.feature.rms, мы вычисляем краткосрочную энергию. Модуль VAD представляет собой гибридный детектор на основе энергии и декодер на основе модели. На первом этапе детектор на основе энергии находит все сегменты с низкой энергией, применяя минимальную длительность сегмента. Энергетический порог устанавливается автоматически для получения достаточного количества неречевых сегментов.

b) Извлечение векторов признаков и обучение GMM. Используя librosa.feature.mfcc, мы вычисляем кепстральные коэффициенты частоты Mel (MFCC) и их первую и вторую производные и объединяем их следующим образом:

Обучение GMM:

Модель гауссовой смеси (GMM) использует подход максимизации ожидания, который качественно делает следующее:

  1. Выберите исходные предположения для местоположения и формы
  2. Повторяйте до схождения:
    E-step: для каждой точки найдите веса, кодирующие вероятность членства в каждом кластере
    M-шаг: для каждого кластера обновите его местоположение, нормализуйте веса и кодировку формы на основе всех точек данных, используя веса.

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

Следующий шаг, чтобы узнать, сколько оптимального количества компонентов нам нужно для данного аудиофайла для GMM Training.

Оптимальное количество кластеров - это значение, которое минимизирует AIC или BIC, в зависимости от того, какое приближение мы хотим использовать. поэтому AIC и BIC говорят нам, что 20 или более компонентов будут лучшим выбором.
Обратите внимание, что этот выбор количества компонентов определяет, насколько хорошо GMM работает как средство оценки плотности а не то, насколько хорошо он работает в качестве алгоритма кластеризации.

Следующим шагом будет написание функции для GMM Training.

wavFile: Полный путь к аудиофайлу
frameRate: Количество кадров в секунду, я сделал 50 кадров в секунду
segLen: Длина сегмента в секундах, я взял 3 сегмента в секунду
vad : Озвученные решения о деятельности на уровне кадра.
numMix: количество смеси в модели смеси. Я установил numMix на 128, глядя на битрейт в секунду.

Функции GMM возвращают массив прогнозируемой вероятности на основе сегмента.

C) Фрейминг кластеризации и сегментации:

Теперь на следующем этапе мы выполним кластерный анализ результатов GMM.
В текущем сценарии наша основная цель - настроить n_cluster, и мы знаем, что у нас есть только 2 динамика, поэтому будем настраивать его с помощью агломеративной кластеризации. Агломеративная кластеризация использует подход «снизу вверх», при котором каждое наблюдение начинается в своем собственном кластере, а пары кластеров объединяются по мере продвижения вверх по иерархии.
Раньше При кластерном анализе мы выполняем масштабирование и нормализацию данных, чтобы все функции стали сопоставимыми, а данные приблизительно следовали распределению Гаусса.

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

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

Спасибо, что прочитали, если вам понравился пост! Хит хлоп!

Полный код дневника докладчика Репозиторий Git Hub

Ссылки
Особенности диаризации спикеров
Неконтролируемая адаптация моделей PLDA для трансляции диаризации
Агломеративная иерархическая кластеризация в системе диаризации спикеров
Special Спасибо Приянке и Нихилу!