bannerbannerbanner
полная версияОбнаружение скрытых эмоций в голосе

Евгений Столов
Обнаружение скрытых эмоций в голосе

Полная версия

Огибающая кривая сигнала

Огибающая кривая сигнала Dat строится с помощью функции, зависящей от параметра WinLen. В данном случае выбрано значение 20, но это эмпирическая величина. Визуально огибающая мало зависит от этого параметра, если он берется из интервала [20,50], однако, увеличение WinLen ведет росту времени на вычисление.

WinLen = 20

Beg = 0

End = WinLen

Env1 = []

while End <= len(Dat1):

Fragm = Dat1[Beg:End]

Beg += 1

End += 1

Env1.append(F(Fragm,WinLen))

Куммулятивная сумма

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

Эмоциональные фрагменты

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

Процедура на основе PCA

Идея алгоритма представлена в книге : Анкур Пател –«Прикладное машинное обучение без учителя» ", Диалектика – 2020.

Предположим, что выбраны K параметров для каждого из M «слов» во входном потоке. Для каждого слова получаем вектор длины K , содержащий все значения параметров, найденных для этого слова. В результате всех вычислений находим матрицу размера M x K. Выбираем количество N компонент с помощью функций класса PCA из модуля from scikit-learn .decomposition import PCA и находим приближение каждой строки матрицы с помощью найденных компонент. Затем вычисляем разницу между оригиналом и приближением. Те строки (слова), для которых эти отклонения оказались большими, объявляются зонами возбуждения. Все подробности указанной процедуры можно найти в книге, отмеченной выше.

Решение на основе процедуры GaussianMixture

В этом пункте изложим процедуру выделения отклонения от нормы, принятую на упомянутом выше сайте http://5.23.55.2. Снова имеем M «слов», для каждого из которых имеется K измеряемых параметров. Измеренные параметры помещаем в матрицу D размера K x M. Таким образом, в каждой строке находится одна и та же характеристика, например, длина слова, вычисленная для каждого из имеющихся слов. Теперь в каждой строке надо выделить отклонение от нормы. Процедура GaussianMixture предназначена для построения модели смеси гауссовских распределений. Пользователь указывает число смесей, а функция относит то или иное измерение к нужному классу.

from sklearn import mixture

def gaussDistr(In):

Clf = mixture.GaussianMixture(n_components=2,

covariance_type="full")

Clf.fit(In)

return Clf.predict(In)

На вход этой функции подаем строку матрицы D, а на выходе получаем последовательность из 0 и 1. Это означает, что каждый элемент строки отнесен к тому или иному классу (элементу смеси). Мы используем гипотезу, согласно которой элементы возбуждения встречаются реже, чем обычные фрагменты в речи. Для этого подсчитываем число 1 в выходной последовательности и сравниваем это число с длиной последовательности. Если оно превышает половину длины последовательности, то последовательность инвертируется. Обработав все строки матрицы D, получаем новую матрицу F, состоящую из 0 и 1. Окончательное решение о принадлежности слова моменту возбуждения решается с помощью процедуры голосования. Для этого суммируются элементы в каждом столбце матрицы F, и если эта сумма превышает K/2, то принимается решение о принадлежности слова, определяющего столбец матриц, моменту возбуждения.

Рейтинг@Mail.ru