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

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

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

Описание больших фрагментов файла

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

При втором подходе на входе в систему используют «сырые» данные, исходный речевой файл, а для анализа применяют сложную нейронную сеть, требующую значительных вычислительных ресурсов (на этапе тренировки). Второй подход становится превалирующим в настоящее время, поскольку его применение сводится к выбору подходящей архитектуры сети, не вникая в сущность проблемы. Автор книги придерживается первого подхода, поскольку он предполагает наличие скромных вычислительных ресурсов, и данный раздел посвящён сбору необходимых параметров, связанных с сущностью проблемы. Выше было показано, каким образом исходный файл разбивается на фрагменты, условно названные словами. Теперь определим параметры, связанные с каждым из таких фрагментов.

Энергия сигнала

Если сигнал представлен numpy массивом, то средняя энергия вычисляется с помощью функции

def myEnergy(In):

Ln =len(In)

return sum(In*In)/ln

Частота основного тона

Самые первые «детекторы лжи» на основе анализа голоса использовали именно этот параметр для выделения участков речевого файла, относимых к ложным высказываниям. В их основе лежала здравая идея, согласно которой во время ложного высказывания изменяется напряжение голосовых связок, что и отражается на частоте основного тона. Первые «детекторы» появились вместе с дешёвыми процессорами, встраиваемыми в телефон. Наличие процессора позволяло определить частоту основного тона, таким образом, слушатель на другом конце провода, якобы, мог сразу узнать о ложности какого-либо высказывания. Эффективность таких устройств оказалась исключительно низкой, и от идеи быстро отказались, но сама мысль использовать эти параметры для анализа осталась. Ниже мы объясним тонкости, связанные с измерением этого параметра. В качестве примера рассмотрим цифровой образ слога „ka“.


При произнесении звука „k“ голосовые связки закрыты и напряжены, а поток воздуха из лёгких связки раскрывает. В результате возникает поток повышенного давления воздуха (вспышка), за которой следует поток малого давления, представленный на рисунке в виде шума. При произнесении слога „ka“ голосовой аппарат перестраивается на произнесение звука „A“, для чего требуется время установления. Если посмотреть на участок, относящийся к „A“, то можно заметить, что он имеет почти периодический характер. Частота этого сигнал и есть частота основного тона, или форманта F0.

Форма сигнала для других гласных звуков будет другой, и частота будет зависеть от гласного. Сигнал зависит от напряжения голосовых связок. При прохождении воздушного потока через вибрирующие связки образуются вихри, которые и определяют основную форму сигнала. Дополнительный вклад вносят фильтры, образованные ротовой полостью. Форманта F0 легко находится с помощью стандартной функции fft , если удалось выделить участок файла, относящийся к гласному звуку. Пусть K – номер коэффициента Фурье с максимальной мощностью, Fr частота стробирования сигнала, Len длина интервала, для которого найдены коэффициенты. Тогда F0= K*Fr/Len. Принцип измерения F0 остается прежним для всех гласных.

from scipy.fftpack import fft

from scipy import signal as sgn

[Fr,Dat] = read('Sounds/A.wav')

N =len(Fragm)

Wnd = sgn.windows.hann(N)

Fragm1 -= np.mean(Fragm)

Afft = abs(fft(Fragm1*Wnd))

Ind =np.argmax(Afft)

print('F0=',Ind*Fr/N)

Когда имеют дело с реальной речью, отмеченные голосовые (вокализованные) участки можно обнаружить, но они будут гораздо короче по сравнению с модельными. Возникает очевидная трудность – обнаружение фрагментов в файле, относящихся к чистым гласным. При анализе реальной речи это можно сделать, но задача становится трудоемкой. Вместо этого вычисляют усредненный коэффициент так, как указано выше. Альтернативой преобразованию Фурье для вычисления F0 является автокорреляция. На участках большой длины оба метода приводят к похожим результатам.

Рейтинг@Mail.ru