Евгений Столов
Обнаружение скрытых эмоций в голосе
Введение
Заманчивая цель. Создать прибор, с помощью которого можно узнать, говорит ли ваш собеседник правду. Эта задача была актуальной как много веков назад, так и в настоящее время. Самым простым методом добиться этого является насилие, а более цивилизованным способом добывания правдивых сведений следует считать применение различных препаратов. Оба этих метода основаны на подавлении воли человека. Однако с древних времён предпринимались действия, направленные на обнаружение каких-то признаков в поведении человека, указывающие на попытки скрыть информацию, и которые не зависели от волевого настроя. Таким примером служило использование кольца на шнурке вместе с разложенным алфавитом. Например, у человека нужно было выпытать фамилию руководителя заговора. Допрашиваемого просили назвать первую букву имени, вручали ему конец шнура и заставляли двигать кольцо над разложенным алфавитом. Предполагалось, что в момент совпадения положений кольца и нужной буквы рука испытуемого дрогнет, что будет зафиксировано наблюдателем. Последнему отводилась основная роль в проведении дознания.
Следующий шаг в решении проблемы был сделан в связи с появлением всем известного прибора под названием «детектор лжи». Оставляя за скобками моральные проблемы и достоверность получаемого результата, отметим одну особенность присущую всем этим методам — испытуемый знает, что он подвергается допросу, поскольку имеет место непосредственный контакт между ним и лицом ведущим допрос. В этой связи появилась задача найти бесконтактный способ проверки правдивости говорящего, когда формально никакого дознания не производится. Речь идёт о визуальном и голосовом анализе говорящего человека. Считается, что мимика, поза и выражение глаз выдают лгущего, а голос его меняется определенным образом.
В настоящее время принято считать, что на самом деле все упомянутые методы, за исключением прямого насилия, позволяют лишь определить наличие эмоционального возбуждения собеседника, причиной чего могут быть различные обстоятельства, не связанные с попыткой обмануть. В случае использования детектора лжи, действительно, можно сделать заключение о ложности высказывания, однако, весь фокус заключается в квалификации оператора, ведущего допрос. Сам прибор лишь фиксирует изменение физиологических параметров. Говорят, что существуют феноменальные люди, обладающие способностью определить лгущего, исходя из визуальной информации. Однако наука начинается с возможности повторения эксперимента. Если сунуть два пальца в розетку под напряжением, эффект не будет зависеть от экспериментатора. Результаты опыта могут иметь вероятностный характер, примером чего является наблюдение над подбрасыванием монеты. И здесь личность экспериментатора не оказывает влияния на конечный результат, а мы фиксируем повторяемость. Если попросить человека, обладающего секретом распознавания лжи, рассказать, как он это делает и передать эти сведения другому человеку, то здесь нет той независимости, о которой шла речь выше. Имеется большое количество публикаций в популярной литературе, как определить правдивость говорящего, но результаты применения таких признаков на практике оцениваются весьма скромно. Здесь, как и в случае стандартного детектора лжи, на первый план выходит личность «оператора», который создаёт нужный контекст и только после этого делает выводы.
Предметом рассмотрения в данной книге являются способы определения изменения эмоционального состояния говорящего, для чего приводятся различные методы извлечения характеристик речевого файла с помощью цифровой обработки сигналов. В настоящее время опубликовано большое количество работ посвященных определению эмоционального состояния человека. В основе методов лежит нейронная сеть, которую с помощью тренировки обучают распознавать вид эмоционального возбуждения. При этом основное внимание уделяется именно определению типа наблюдаемой эмоции. Проблема заключается в создании базы, применяемой для тренировки. Эти базы создаются с помощью актеров, которых просят представить диктора в том или ином эмоциональном состоянии, и уже на основе этой базы делают выводы при анализе файла испытуемого. Очевидны минусы такого подхода, поскольку даже специалисты спорят о типе эмоций исследуемого в пограничных случаях. В этой книге ставится задача определения моментов изменения эмоционального состояния без попытки указать на тип эмоции. В процессе анализа получаем усредненные параметры речи и фиксируем фрагменты, в которых эти параметры отклоняются от средних значений. В книге использованы известные методы для описания характеристик звукового файла, описанные в научной литературе, а также методы, разработанные самим автором.
Сразу же следует сказать, что все известные подходы к оценке эмоционального состояния человека не обеспечивают 100 % достоверности вывода, поэтому не надо относиться слишком серьёзно к результатам, полученным с помощью описанных ниже алгоритмов анализа. Скорее всего, материал книги нужно рассматривать как основу для хобби. Для всех рассмотренных алгоритмов приведены реализации на Питоне или их словесные описания, поэтому любой человек, обладающий элементарными навыками программирования, может их использовать в реальной жизни, например, на вечеринках для развлечения гостей. Если же они оказались полезными в более серьёзной ситуации, автор книги будет полагать, что достиг максимальной возможной цели.
Кому адресована данная книга
Сказанное выше означает, что приведённые алгоритмы образуют конструктор, из которого каждый может сделать консольную программу по своему вкусу. Алгоритмы не содержат графической интерфейсной части, которую предлагается создать самому читателю в случае необходимости, а приводимые модули являются консольными приложениями. Существующие в Интернете программы, решающие проблему анализа речи, содержат в интерфейсной части какие-то параметры, смысл которых не всегда ясен. В случае самоделки все находится в руках программиста. Как уже упоминалось выше, предполагается знание языка программирования Питон (только базовые знания) и доступ к основным библиотекам: numpy, scipy, matplotlib, scikit-learn и некоторым другим. Приводятся только тексты нестандартных, по мнению автора, модулей Для остальных модулей дается словесное описание алгоритм. Более существенным моментом является владением основами цифровой обработки сигналов, если есть желание понять, что именно измеряется. А когда такого желания нет, достаточно уметь пользоваться числами, полученными в результате вычислений. Книга не является учебником по упомянутым областям знаний, поскольку в настоящее время имеется бесплатный доступ к нужной литературе.
Что касается «железа», то необходимо обеспечить доступ к речевым файлам и способ ввода их в компьютер. Для этих целей может понадобиться микрофон либо обычный смартфон с приложением «Диктофон». Здесь следует сделать несколько замечаний. Для анализа важен способ записи речевого файла. Рекомендуется стандартный формат с частотой записи 44100 Hz. Именно эта частота предполагается, когда речь идет об отдельных параметрах алгоритмов. Программы записи в диктофонах, как правило, используют сжатие файла и перевод его в соответствующий формат. Все алгоритмы, реализованные в книге, предполагают формат wav речевого файла, поэтому будет необходимо перевести исходный файл в этот формат. Наиболее универсальным средством, решающим данную задачу, является бесплатная программа ffmpeg. Другой полезной программой для работы с аудио файлами является бесплатная программа Audacity. Она пригодится для ввода файлов с микрофона, перевода в формат wav и для редактирования файлов.
Автор реализовал представленную выше идею на сайте с адресом http://5.23.55.2. Доступ к сайту свободный, без регистрации. Заметим, что сайт не использует сертификат достоверности, поэтому браузер порождает предупреждение об этом, однако, для эксперимента достаточно только загрузить на сайт речевой файл в любом формате. Такая загрузка не может повредить пользователю. Целью создания сайта является проверка работы алгоритмов, поэтому автор будет благодарен всем пользователям, если они поделятся результатом своего эксперимента. Надо сравнить реакцию программы на отклонение в параметрах с ощущением человека при прослушивании речи. Адрес для связи: ystolov@list.ru.
Свойства речевого файла
Выводы об эмоциональном состоянии диктора основаны на измерении определенных параметров звукового файла. Если речь идет о скрытых эмоциях, то, скорее всего, эти эмоции проявляются при произнесении отдельных слов.
Выделение "фраз" и "слов " в речевом файле
Изменение эмоционального состояния может проявиться во время произнесения очередной фразы в потоке или даже при произнесении отдельного слова в фразе. Нашей ближайшей целью является научиться выделять отдельные слова в потоке и формировать из них фразы. Рассмотрим более детально произвольный отрезок обычного речевого файла.
Видно, что этот отрезок делится на небольшие фрагменты повышенной мощности и промежутки между ними. Отмеченные промежутки это либо заполненные шумом от дыхания интервалы (интервалы между словами или отдельными слогами), либо переходные процессы в речи. Переходный процесс это промежуток между концом гласного и началом согласного или наоборот. Назовем такие интервалы шумовыми интервалами (ШИ), а оставшиеся — информационными (ИнИ). Естественно считать словом промежуток в речевом файле между двумя последовательными ШИ. На самом деле ситуация более сложная, поскольку ШИ может появиться и между двумя слогами одного слова либо в позиции переходного процесса. В этом случае такой интервал должен быть проигнорирован. Следует отметить, что выделением информационных фрагментов в речевом файле занимались многие исследователи. Так или иначе, для этой цели используется мощность сигнала, однако, установка пределе для этой мощности и является предметом исследования. Мы берем за основу выделение ШИ и последующий анализ их распределения. Это означает, что для вычисления порога исследуется мощность сигнала в некотором маленьком интервале. После этого все интервалы в автоматическом режиме разбиваются на два класса. Последующая процедура выделения слов основана на этом разбиении. Сначала требуется выбрать размер интервала. Естественно выбирать этот параметр в зависимости от частоты стробирования 𝐹𝑟, например, 𝑆𝑖𝑧𝑒𝐹𝑟𝑎𝑔𝑚=𝐹𝑟/1000 — одна мс. Теперь функция createStdDistr вычисляет стандартные отклонения внутри каждого из выбранных интервалов из входного массива In.
import nunpy as np
def createStdDistr(In,SizeFragm):
In = np.float_(In)
In — = np.mean(In)
Ln = len(In)
Vary = []
I =0; End = SizeFragm
while End<= Ln:
Fragm = In[I: End]
Vary.append(Fragm)
I += SizeFragm
End += SizeFragm
VaryArray = np.float_(Vary)
Std = np.std(VaryArray)
return Std
Следующий шаг — классификация интервалов по мощности. Его реализует функция getFeat. В ее основе лежит стандартная процедура kmeans.
from scipy.cluster.vq import kmeans,vq
def getFeat(Std):
Cent,_ = kmeans(Std,2)
Cent = sorted(Cent)
Out = vq(Std,Cent)
Features = Out[0]
return Features
В этой процедуре функция kmeans порождает два центроида, центры скопления значений стандартных отклонений интервалов. Процедура сортировки ставит не первое место меньшее из значений центроидов. Функция vq присваивает метку 0 или 1 каждому интервалу, при этом метка 0 означает, что данный интервал близок к меньшему из центроидов. Это означает, что такой интервал мы считаем шумовым.
Окрасим интервалы в разные цвета в зависимости от метки. Вот так выглядит размеченная часть речевого файла, состоящая из 17 фрагментов.
from matplotlib import pyplot as plt
Std = createStdDistr(In,SizeFragm)
Features = getFeat(Std)
NumFragm = 17
Beg = 10 * SizeFragm
for I in range(10,10 + NumFragm):
End = Beg + SizeFragm
if Features[I] == 0:
Col = 'k'
else:
Col ='r'
Arg = np.arange(Beg,End)
plt.plot(Arg,In[Beg: End],Col)
Beg += SizeFragm
Следует заметить, что конечный результат зависит способа вычисления характеристики интервала. Например, заменив стандартное отклонение на дисперсию, мы получим другое разбиение интервалов на классы. Использование максимального значения в качестве характеристики приводит к чувствительности решения к случайным выбросам. Достоинством процедуры kmeans является то, что не делается предположений о распределении стандартных отклонений.
Отсу алгоритм
Как было отмечено выше, результат классификации интервалов зависит от выбора характеристики интервала, однако, и сама классификация с помощью kmeans не является единственной возможной. Рассмотрим еще одну процедуру классификации пригодную для бинарного случая и используемую для построения черно-белых изображений. Здесь также не делается предположений о распределении исходных данных. Это алгоритм Отсу, а в его основе лежит гистограмма найденных характеристик интервалов (стандартное отклонение в нашем случае).
def otsu(Bins,Interv):
def oneStep(T):
'''
One step of the Otsu algo
0<T<NumBins
'''
Bins1 = Bins[: T]
Bins2 = Bins[T:]
Prob1 = Bins1.sum()
Prob2 = Bins2.sum()
Aver1 = sum(Bins1 * Middles[: T])/Prob1
Aver2 = sum(Bins2 * Middles[T: ])/Prob2
return Prob1 * (Aver1 — Aver)**2 \
+ Prob2 *(Aver2 — Aver) **2
Bins = np.float_(Bins)
NumBins = len(Bins)
Middles = np.zeros(NumBins)
for I in range(len(Middles)):
Middles[I] = Interv[I] + Interv[I+1]
Middles *= 0.5
BinsSum = Bins.sum()
Bins /= BinsSum # Probabilities
Aver = sum(Bins * Middles)
Results = np.zeros(NumBins — 1)
for I in range(1,NumBins):
Results[I -1] = oneStep(I)
MxRes = np.amax(Results)
Pos = np.where(Results == MxRes)
return Middles[Pos[0][0] + 1]
Посмотрим на результат обработки того-же файла с помощью алгоритма Отсу
Bins,Interv = np.histogram(Std)
Level = otsu(Bins,Interv)
Result = np.where(Std<Level,0,1)
Мы разбили все интервалы на два класса, и теперь можем раскрасить тот же файл согласно новом разбиению. Полученный график имеет вид схожий с рисунком, полученным на основе kmeans.