Распознавание эмоций с использованием нейронной сети
Распознавание эмоций является довольно сложной задачей в области анализа звуковых сигналов. Голос часто отражает скрытые эмоции через высоту и тон, например, именно по интонациям голоса собаки могут понять настроение хозяина.
Данная технология используется в колл-центрах для классификации звонков (в соответствии с эмоциями можно различить недовольство, удовлетворенность или гнев клиента), что помогает эффективно построить дальнейший диалог.
Для обучения будем использовать часть датасета CREMA, которая представляет собой набор аудиофайлов, на которых актеры с различными эмоциями произносят 12 фраз. Подробное описание данных можно найти здесь.
Исходный набор данных:
Прежде всего, необходимо определить какая эмоция характеризует аудиофайл (явное указание на эмоцию есть в имени файла). Запишем результаты в датафрейм:
Всего в наборе представлено 6 различных эмоций, при этом данные сбалансированы.
Для анализа и извлечения данных из аудиофайлов будем использовать библиотеку librosa. Для примера посмотрим на волны «счастья» и «злости».
При гневе вся фраза как будто бы произносится на одном дыхании, с большим напором в начале, это отчетливо видно на графике. Если посмотреть на график «счастья», то можно заметить, что фраза произносится протяжнее, равномернее. Видно, что на записях присутствуют небольшие шумы. Именно изменение интонации и тембра голоса поможет нам классифицировать эмоции, представленные на аудиозаписях.
Данные, полученные из аудио, не могут быть использованы для обучения модели напрямую, поэтому преобразуем их в подходящий формат. Одними из лучших инструментов для извлечения информации из звуковых сигналов являются MFCC (Мел-кепстральные коэффициенты). Коэффициенты описывают форму спектральной огибающей сигнала. Пройдемся по записям. Считаем их, отбросив 0,15 секунды в начале, а длину записей ограничим 3 секундами. В качестве признаков будем использовать средние значения mfcc.
Результаты извлечения признаков:
Итак, задача свелась к многоклассовой классификации. Преобразуем целевую переменную для дальнейшего использования, а также разделим данные на train и test соответственно.
Построим классическую одномерную сверточную нейронную сеть. Добавим Dropout слои, чтобы избежать переобучения, а также слои пуллинга (MaxPooling1D) для уменьшения размерности.
Построим график изменения точность в процессе обучения.
Результаты на тестовой выборке:
Получился довольно неплохой результат. В данном наборе представлены записи и мужских, и женских голосов, а они различаются по тембру и высоте голоса, можно классифицировать их по отдельности. Также можно извлекать другие характеристики сигнала (скорость пересечения нуля, спектральный центроид). Внося некоторые изменения в исходные данные (добавить шумы, сдвиги, увеличить скорость произношения), можно генерировать новые данные, которые помогут сделать модель более устойчивой к возмущениям и повысить её обобщающую способность.
О, ещё одна интересная библиотека, спасибо за обзор.
Надо будет протестировать, может чего интересного получится сделать, например в связке с open cv...
Вот еще один кейс мы рассматривали с применением библиотеки librosa https://vc.ru/ml/136589-vyyavlyaem-priznaki-audiomontazha-metodami-ai (про выявление признаков аудиомонтажа)
А как у вас так работает нейрона с таким размером входных данных ? может где можно посмотреть весь код ?
Добрый день! В тексте публикации продемонстрированы просто сэмплы, а не весь набор входных данных (он составляет 7 442 аудиофайла). Код, к сожалению, не сохранился...