- Тест на эмпатию: как голосовые боты определяют пол и настроение людей
- Как голосовой софт распознает настроение человека
- В каких сферах ботам нужно уметь различать эмоции?
- Должен ли робот распознавать пол собеседника
- OpenVINO хакатон: распознаем голос и эмоции на Raspberry Pi
- Выбор задачи
- Добавляем кнопку-индикатор
- Работаем с голосом
- Веб-приложение
- Заключение
Тест на эмпатию: как голосовые боты определяют пол и настроение людей
Голосовые ассистенты и умные колонки, которые некогда относились к разряду know-how, постепенно переходят в категорию обыденной реальности. По данным Statista, к концу этого года количество используемых продуктов на основе технологии достигнет 4,2 млрд в глобальных масштабах, а через четыре года этот показатель удвоится. Учитывая стремительную популяризацию голосовых интерфейсов, они станут более совершенными не только в распознавании речи, но и в других важных аспектов. Игорь Калинин, основатель компании TWIN, поделился последними достижениями рынка voice-роботов в сфере определения настроения и пола собеседника.
Читайте «Хайтек» в
Голосовые боты уже стали ценными сотрудниками, которые могут предоставить более качественный сервис за меньшую стоимость. Разумеется, в сравнении с человеком. Можно выделить несколько преимуществ ботов: они всегда на связи, мгновенно отвечают на звонок и сохраняют невозмутимость, даже если на том проводе не очень корректно и вежливо разговаривают. Но есть и очевидный минус: холодный рассудок бота не всегда нравится чересчур эмоциональному клиенту. Часто «машина» просто повторяет стандартный набор фраз, что только усиливает раздражение. Это приводит к необходимости создания эмоционального интеллекта.
Один из вариантов решения этой проблемы — предзаписанный скрипт для различных ситуаций, включая разговор с разъяренным собеседником. Он позволяет голосовому боту адаптироваться к ситуации и оказывать релевантную помощь. Это можно назвать запрограммированной эмпатией, главное условие которой — умение правильно распознавать эмоции человека и реагировать на них. И текущий уровень развития технологии существенно повышает EQ (с англ. Emotional Quotient, «эмоциональный интеллект» —«Хайтек») голосовых ботов. Например, боты TWIN в 96% случаев правильно определяют базовые эмоции: позитивные, негативные или нейтральные.
Но создание эмпатичных ботов, которые могут имитировать EQ благодаря предзаписанным сценариям, требует больших вычислительных мощностей, а значит, их стоимость автоматически возрастает. Для бизнеса это не всегда рентабельно. Именно поэтому зачастую робот переводит разговор на живого сотрудника, как только диалог требует эмпатического общения.
Как голосовой софт распознает настроение человека
Определение эмоций по голосу — это микросервис, постепенно обучающийся на примерах. Для этого собирают множество диалогов между ботом и клиентом и анализируют их качество, оценивая, насколько правильно робот распознал эмоцию. Ошибки корректируются и заменяются правильным вариантом в системе.
Однако без человека тут не обойтись. Анализом и маркировкой эмоций занимаются разметчики-лингвисты, четко определяющие оттенки речи и реакции: позитивной, негативной или базовой. Они прослушивают множество диалогов, из которых выделяют эпизоды с ярко выраженной эмоциональной окраской, категоризируют их и заносят в соответствующую базу. Так создается набор датасетов или моделей, составляющий основу эмоционального интеллекта бота. Очень важно, чтобы маркировкой занимался профессионал, так как даже небольшая погрешность может полностью «убить» весь датасет.
После того, как модель с размеченной выборкой данных готова, наступает фаза обучения нейронной сети. На этом этапе, помимо качества датасетов, нужны лучшие ML-инженеры (специалисты по машинному обучению — «Хайтек»). Кроме того, стоит тщательно подобрать стек технологий. Только так система будет идеально работать, распознавая эмоциональную окраску практически любой речи, за исключением шепота.
Главные сложности в распознавании эмоций:
- Многообразие эмоциональных оттенков — даже человеку бывает сложно отличить обеспокоенность и раздраженность. Именно поэтому пока разграничивают три базовые эмоции: это позволяет снизить погрешность.
- Форма выражения эмоций — часто в определении настроения робот опирается на словесные формулировки. Однако такой подход не всегда эффективен. Например, нецензурная лексика сама по себе не обязательно говорит о негативе. Поэтому в TWIN разделили два микросервиса определения эмоций: один обучен на голосе и используется в звонках, другой — на текстах, применяется в чатах.
В каких сферах ботам нужно уметь различать эмоции?
В сервисном сопровождении часто возникают ситуации, когда клиента нужно быстро перевести с робота на оператора, особенно если человек настроен негативно. Компании из транспортной отрасли часто сталкиваются с типичным обращением: в контакт-центр звонит разъяренный пользователь, не получивший вовремя заказ. Приняв звонок, робот слышит много критики в адрес компании, но не может адекватно отреагировать. Из подобных ситуаций мы вынесли урок: теперь звонок автоматически переводится на оператора, сразу как только система идентифицирует негативные эмоции.
Эмоциональный интеллект становится частью сервиса в электронной торговле. Так, например, Amazon научил своего голосового ассистента Alexa распознавать эмоции по интонации. Функция, вероятно, поможет улучшить качество коммуникации умного помощника и пользователей. А Emotibot предлагает голосового помощника для пост-продажного обслуживания в e-commerce. Бот подстраивает ответы под настроение собеседника, чтобы предотвратить эскалацию жалоб.
Call-центры тоже начинают экспериментировать с технологией распознавания эмоций для того, чтобы оценивать качество сервиса. Например, система может проанализировать речь оператора на предмет возникновения негативных оттенков речи: это контролирует коммуникацию сотрудников с клиентами и предупреждает регулярные нарушения этики общения.
Голосовые технологии с распознаванием эмоций помогают также анализировать динамику настроения клиентов: например, определять, стали ли покупатели в целом больше испытывать раздражение или, наоборот, обнаружили большую лояльность к бренду. Это дает понимание, проходит ли автоматизация call-центра успешно или какие-то процессы нуждаются в доработке. Так, например, подобную технологию протестировал Росбанк. В результате аналитики диалога бота и клиента менеджер получает статистический отчет по каждому звонку, где отражаются такие данные, как динамика индекса удовлетворенности потребителя и сравнительный индикатор эффективности сервиса.
Эмоциональное состояние напрямую влияет на готовность покупателя сделать покупку. Человеку проще что-то продать, когда он в хорошем настроении. Это подтверждают исследования: например, белорусский эксперимент продемонстрировал прямую связь между позитивными эмоциями и готовностью общаться с менеджером по продажам, а также общей лояльностью к бренду.
Распознавание эмоций может увеличить доход от ботов, которые занимаются обработкой лидов. Так, например, опираясь на этот маркер, робот-продавец способен сразу же переводить звонок на «живого» сотрудника, чтобы не упустить «горячий» лид. Вероятно, в будущем этот инструмент будут использовать большинство компании, где боты занимаются обзвоном холодной или теплой базы.
Индустрия разработки уже предложила онлайн-ритейлерам гайд-бота, который может выступить в роли цифрового консультанта и строить диалог с пользователем, исходя из его характера (бот определяет его по эмоциям). Однако подобные решения только вступили в стадию изучения и тестирования рынком, поэтому массового распространения пока не получили.
Должен ли робот распознавать пол собеседника
Клиенты хотят видеть индивидуальный подход к обслуживанию в любой индустрии. В ходе опроса SmarterHQ две трети потребителей признались: они вовлекаются в общение, только когда получают персонализированные сообщения. Это диктует необходимость и дальше работать над тем, чтобы голосовые боты становились умнее, сегментируя собеседников по различным критериям, из которых самое очевидное — это пол.
Распознавание пола позволяет строить речь с учетом этого критерия, а также снизить процент ошибок при наборе абонента. Например, если в базе значится Наталья, а трубку взял собеседник мужского пола, бот сможет моментально среагировать и произнести: «Могу я поговорить с Натальей?» вместо «Здравствуйте, Наталья».
Со звонками то же самое. Давайте смоделируем ситуацию: робот набирает клиента, чье имя в базе — Наталья. Соответственно, он переключается на режим общения с женщиной. Но вдруг трубку поднимает муж или брат Натальи и говорит: «Извините, я не Наталья». Если робот не определит по голосу пол собеседника, может получиться забавная ситуация: клиент будет доказывать, что он не Наталья, а робот будет продолжать общаться с Натальей, и разговор, скорее всего, очень быстро закончится.
Конечно, можно и вовсе отказаться от имен и обращаться ко всем унифицировано, ведь примерно в 3% случаев трубку берет человек, который не записан при регистрации. Но для ритейлеров, например, это будет стоит нескольких очков лояльности. Только представьте: вы заказали товар из интернет-магазина, перед его отправкой звонит бот и спрашивает, удобно ли будет получить заказ в ближайшее время. Безымянное обращение сделает разговор холодным, тогда как простое «Здравствуйте, Сергей!» сильно его смягчит. Очень кстати можно вспомнить крылатую фразу Дейла Карнеги: «Имя человека — самый сладостный и самый важный для него звук на любом языке». Это подтверждают и ученые Деннис П. Кармоди и Майкл Льюис, которые доказали, что наш мозг приходит в экстаз, когда мы слышим свое имя, что моментально концентрирует внимание на звуке.
Таким образом, чтобы избежать неловких ситуаций, при этом не жертвуя потребительской лояльностью, нужно отличать мужчин и женщин по голосу. Наши боты, например, правильно определяют пол человека в 98% случаев. На Западе аналогичной функцией оснащен My Voice AI, умеющий также определять примерный возраст и эмоциональное состояние.
Роботы только начинают изучать глубины человеческой речи и отличать настроение клиента или его пол. Вероятно, что в будущем технологии будут стремительно развиваться. По прогнозу Gartner, через два года «эмоциональной диагностикой» будут оснащены 10% всех устройств. Это неизбежно стимулирует развитие рынка систем для аналитики и распознавания эмоций: согласно данным MarketsAndMarkets, он вырастет с $21,6 млрд в 2019 году до $56 млрд к 2024 году при среднегодовом темпе прироста в 21%.
Источник
OpenVINO хакатон: распознаем голос и эмоции на Raspberry Pi
30 ноября — 1 декабря в Нижнем Новгороде прошел OpenVINO хакатон. Участникам предлагалось создать прототип продуктового решения с использованием Intel OpenVINO toolkit. Организаторами был предложен список примерных тем, на которые можно было ориентироваться при выборе задачи, но финальное решение оставалось за командами. Кроме этого, поощрялось использование моделей, которые не входят в продукт.
В статье расскажем про то, как мы создавали свой прототип продукта, с которым в итоге заняли первое место.
В хакатоне участвовало более 10 команд. Приятно, что некоторые из них приехали из других регионов. Местом проведения хакатона был выбран комплекс “Кремлевский на Почаине”, где внутри были развешаны старинные фотографии Нижнего Новгорода, антуражно! (напоминаю, что на данный момент центральный офис компании Intel расположен именно в Нижнем Новгороде). На написание кода участникам отводилось 26 часов, в конце было необходимо презентовать своё решение. Отдельным плюсом было наличие демо-сессии, чтобы убедиться, что всё задуманное правда реализовано, а не осталось идеями в презентации. Мерч, снеки, еда, всё тоже было!
Кроме этого, компания Intel по желанию предоставляла камеры, Raspberry PI, Neural Compute Stick 2.
Выбор задачи
Одной из самых сложных частей подготовки к хакатону со свободной тематикой является выбор задачи. Сразу решили придумывать что-то, чего в продукте ещё нет, так как в анонсе было сказано, что это всячески приветствуется.
Проанализировав модели, которые входят в продукт в текущем релизе, приходим к выводу, что большинство из них решают различные задачи компьютерного зрения. Причем очень сложно придумать задачу из области компьютерного зрения, которую нельзя решить с использованием OpenVINO, а если такую и можно придумать, то в открытом доступе сложно найти предобученные модели. Решаем копать ещё и в другом направлении — в сторону обработки и аналитики речи. Рассматриваем интересную задачу по распознаванию эмоций по речи. Нужно сказать, что в OpenVINO уже есть модель, определяющая эмоции человека по лицу, но:
- В теории, можно сделать совмещенный алгоритм, который будет работать как по звуку, так и по изображению, что должно дать прирост в точности.
- Камеры обычно имеют узкий угол обзора, чтобы покрыть большую зону, требуется не одна камера, звук не имеет такого ограничения.
Развиваем идею: возьмем за основу идею для retail сегмента. Можно определять удовлетворенность покупателя на кассах магазинов. Если кто-то из покупателей недоволен обслуживанием и начинает повышать тон — можно сразу звать администратора на помощь.
В этом случае нужно добавить распознавание человека по голосу, это позволит нам различать сотрудников магазина от покупателей, выдавать аналитику по каждому индивидууму. Ну и кроме того, можно будет анализировать поведение самих сотрудников магазина, оценивать атмосферу в коллективе, звучит неплохо!
Формируем требования к нашему решению:
- Маленький размер целевого девайса
- Работа в реальном времени
- Низкая цена
- Легкая масштабируемость
В итоге в качестве целевого девайса выбираем Raspberry Pi 3 c Intel NCS 2.
Тут важно отметить одну важную особенность NCS — лучше всего он работает с стандартными CNN архитектурами, если же потребуется запустить на нём модель с кастомными слоями, то ожидайте ̶т̶а̶н̶ц̶е̶в̶ ̶с̶ ̶б̶у̶б̶н̶о̶м̶ низкоуровневой оптимизации.
Дело за малым: нужно раздобыть микрофон. Подойдет и обычный USB-микрофон, правда он не будут смотреться хорошо вместе с RPI. Но и тут решение буквально “лежит под боком”. Для записи голоса решаем использовать плату Voice Bonnet из набора Google AIY Voice Kit, на которой есть распаянный стерео микрофон.
Скачиваем Raspbian из репозитория AIY projects и заливаем на флешку, тестируем, что микрофон работает с помощью следующей команды (она запишет аудио длиной в 5 секунд и сохранит в файлик):
Сразу отмечу, что микрофон очень чувствительный и хорошо ловит шумы. Чтобы исправить это, зайдем в alsamixer, выберем Capture devices и снизим уровень входного сигнала до 50-60%.
Дорабатываем корпус напильником и всё влезает, можно даже закрыть крышкой
Добавляем кнопку-индикатор
Во время разбора AIY Voice Kit на части вспоминаем, что там есть RGB-кнопка, подсветкой которой можно управлять программно. Ищем “Google AIY Led” и находим документацию: https://aiyprojects.readthedocs.io/en/latest/aiy.leds.html
Почему бы не использовать эту кнопку для отображения распознанной эмоции, у нас всего 7 классов, а в кнопке 8 цветов, как раз хватает!
Подключаем кнопку по GPIO к Voice Bonnet, подгружаем нужные библиотеки (они уже установлены в диструбутиве от AIY projects)
Cоздадим dict, в котором каждой эмоции будет соответствовать цвет в виде RGB Tuple и объект класса aiy.leds.Leds, через который будем обновлять цвет:
И, наконец, после каждого нового предсказания эмоции будем обновлять цвет кнопки в соответствии с ней (по ключу).
Кнопочка, гори!
Работаем с голосом
Будем использовать pyaudio для захвата потока с микрофона и webrtcvad для фильтрации шума и детектирования голоса. Кроме этого, создадим очередь, в которую будем асинхронно добавлять и забирать отрывки с голосом.
Так как у webrtcvad есть ограничение на размер подаваемого фрагмента — он должен быть равен 10/20/30мс, а обучение модели для распознавания эмоций (как мы далее узнаем) проводилось на датасете 48кГц, будем захватывать чанки размера 48000×20мс/1000×1(моно)=960 байт. Webrtcvad будет возвращать True/False для каждого из таких чанков, что соответствует наличию или отсутствию голоса в чанке.
Реализуем следующую логику:
- Будем добавлять в list те чанки, где есть голос, если голоса нет, то инкрементируем счетчик пустых чанков.
- Если счетчик пустых чанков >=30 (600 мс), то смотрим на размер листа накопившихся чанков, если он >250, то добавляем в очередь, если же нет, считаем, что длины записи недостаточно, чтобы подать её на модель для идентификации говорящего.
- Если же счетчик пустых чанков всё ещё —data_type позволяет выбрать формат данных, с которым будет работать модель. Поддерживаются FP32, FP16, INT8. Выбор оптимального типа данных может дать хороший прирост к производительности.
—input_shape указывает на размерность входных данных. Возможность динамически её менять вроде бы присутствует в C++ API, но мы так далеко копать не стали и для одной из моделей просто зафиксировали её.
Далее попробуем загрузить уже сконвертированную модель в IR формате через DNN модуль в OpenCV и сделать forward на неё.
Последняя строчка в данном случае позволяет перенаправить вычисления на Neural Compute Stick, базово вычисления выполняются на процессоре, но в случае с Raspberry Pi это не прокатит, понадобится стик.
Далее логика следующая: разделим наше аудио на окна определенного размера (у нас это 0.4с), каждое из этих окон преобразуем в MFCC, которые затем подадим на сетку:
После возьмем наиболее часто встречающийся класс для всех окон. Простое решение, но для хакатона и не нужно выдумывать что-то слишком заумное, только если есть время. У нас работы ещё много, поэтому идем дальше — разбираемся с распознаванием по голосу. Нужно сделать некую базу, в которой бы хранились спектрограммы заранее записанных голосов. Так как времени осталось немного, решаем этот вопрос как можем.
А именно, создаем скрипт для записи отрывка голоса (работает он так же, как описано выше, только при прерывании с клавиатуры он будет сохранять голос в файлик).
Записываем голоса нескольких человек (в нашем случае троих членов команды)
Далее для каждого записанного голоса выполняем fast fourier transform, получаем спектрограмму и сохраняем в виде numpy array (.npy):
Подробнее в файле create_base.py
В итоге при запуске основного скрипта мы в самом начале получим эмбеддинги из этих спектрограмм:
После получения эмбеддинга из прозвучавшего отрезка сможем определить, кому он принадлежит, взяв cosine distance от отрывка до всех голосов в базе (чем меньше, тем вероятнее) — для демо мы выставили порог 0.3):
В конце отмечу то, что скорость инференса была быстрой и позволяла добавить ещё 1-2 модели (на сэмпл длиной 7 секунд на инференс уходило 2.5). Добавить новые модели мы уже не успевали и сфокусировались на написании прототипа веб-приложения.
Веб-приложение
Важный пункт: берем с собой роутер из дома и настраиваем свою локалку, помогает соединить девайс и ноуты по сетке.
Бэкенд представляет из себя сквозной канал сообщений между фронтом и Raspberry Pi, основанный на технологии websocket (http over tcp protocol).
Первым этапом является получение обработанной информации с распберри, то есть упакованные в json предикты, которые на середине своего пути сохраняются в базу данных, дабы можно было формировать статистику об эмоциональном фоне пользователя за период. Далее этот пакет отправляется на фронтенд, который использует подписку и получение пакетов с эндпоинта вебсокета. Весь механизм бэкенд построен на языке golang, выбор на него пал тем, что он хорошо подходит для асинхронных задач, с которыми горутины хорошо справляются.
При доступе к эндпоинту пользователь регистрируется и заносится в структуру, затем происходит получение его сообщения. И пользователь, и сообщение заносятся в общий hub, из которого сообщения уже отправляются дальше (на подписанный фронт), а если пользователь закрывает соединение (распберри или фронт), то его подписка аннулируется, и он удаляется из hub.
Ожидаем коннект с бэка
Front-end представляет собой web-приложение, написанное на JavaScript с использованием библиотеки React для ускорения и упрощения процесса разработки. Целью данного приложения является визуализация данных, полученных при помощи алгоритмов, запущенных на back-end стороне и непосредственно Raspberry Pi. На странице имеется роутинг по разделам, реализованный при помощи react-router, но основной интерес представляет главная страница, где в режиме реального времени поступает непрерывный поток данных с сервера по технологии WebSocket. Raspberry Pi детектирует голос, определяет принадлежность к определённому человеку из зарегистрированной базы и высылает список probability клиенту. Клиент отображает последние актуальные данные, выводит аватарку человека, который с наибольшей вероятностью говорил в микрофон, а также эмоцию, с которой он произносит слова.
Главная страница с обновляемыми предиктами
Заключение
Не получилось доделать всё до задуманного, банально не успели, поэтому главная надежда была на демо, на то, что всё заработает. В презентации рассказали про то, как всё устроено, какие модели взяли, с какими проблемами столкнулись. Далее была часть демо — эксперты ходили по залу в произвольном порядке и подходили к каждой команде, чтобы посмотреть на работающий прототип. Задавали вопросы и нам, каждый отвечал по своей части, на ноуте оставили веб, и всё действительно работало, как и ожидалось.
Отмечу, что общая стоимость нашего решения составила 150$:
35$
Google AIY Voice Bonnet (можно взять плату respeaker)
15$
Intel NCS 2
- Использовать регистрацию с клиента — просить прочитать текст, который генерим случайно
- Добавить ещё несколько моделей: по голосу можно определять пол и возраст
- Разделять одновременно звучащие голоса (диаризация)
Уставшие, но счастливые мы
В заключение хочется сказать спасибо организаторам и участникам. Из проектов других команд лично нам понравилось решение для мониторинга свободных парковочных мест. Для нас это был дико крутой опыт погружения в продукт и разработки. Надеюсь, что в регионах будет проводиться всё больше интересных мероприятий, в том числе и по AI тематике.
Источник