[Из песочницы] Исследовательский практикум. Голосовые виртуальные ассистенты – что с ними не так?
Введение
Аналитики, исследующие сервисы чат-ботов и виртуальных ассистентов, обещают рост рынка как минимум 30% в год. В абсолютных цифрах, по состоянию на 2019 год, рынок оценивался более чем в 2 миллиарда долларов в год. Виртуальных голосовых помощников выпустили практически все ведущие мировые IT-компании, а основную работу по их популяризации уже провели Apple, Google и Amazon.
На российском рынке тоже наметились свои лидеры в этой области. Первым крупным игроком, запустивших собственного голосового ассистента в России, стал «Яндекс». По данным компании, публикуемым официально, Алисой пользуется 45 миллионов пользователей в месяц, а число ежемесячных запросов к ассистенту — составляет более 1 млрд. По мнению специалистов, 2020 год может стать для рынка голосовых ассистентов переломным — конкуренция платформ и брендов приведет к росту узнаваемости ассистентов.
В общем, то, что рынок голосовых ассистентов — интересная ниша, сомневаться не приходится. И первая идея, которая приходит в голову — взять любой из доступных сервисов ASR (Automatic Speech Recognition) и TTS (Text To Speech), связать их с конструктором ботов, имеющим поддержку NLU (Natural Language Understanding), и все! Тем более что все это довольно легко и быстро можно реализовать в облачных платформах, таких как Twilio и VoxImplant.
Проблема только в том, что полученный результат будет весьма посредственным. В чем же причина этого? Прежде всего попробуем понять почему совокупность довольно-таки неплохих технологий, собранных вместе дают такой посредственный результат, потому что в реальной жизни клиент всегда будет отдавать предпочтение тому сервису, чей голосовой сервис удобнее, интереснее, умнее и быстрее прочих.
Как работает типичный голосовой ассистент
Прежде всего отметим, что наша речь представляет из себя последовательность звуков. Звук в свою очередь — это наложение звуковых колебаний (волн) различных частот. Волна же, как нам известно из физики, характеризуются двумя атрибутами — амплитудой и частотой.
Рис. 1. Речевой сигнал
Алгоритм работы ассистента:
- Первым делом поток, содержащий речь, разбивается на небольшие фрагменты — фреймы. Причём фреймы должны идти не строго друг за другом, а «внахлёст», т.е. конец одного фрейма должен пересекаться с началом другого.
После этого начинается процесс распознавания, и первой задачей, которую приходится решать, является разбиение всего аудио-фрагмента на отдельные слова. Речь содержит в себе некоторые паузы (промежутки тишины), которые можно считать «разделителями» слов. В итоге получается, что нам необходимо найти некоторое значение, порог — значения выше которого являются словом, ниже — тишиной. Вариантов тут может быть несколько, но это уже детали реализации, которые нам сейчас не особо интересны. Важно только понимать, что это не константа, а динамически вычисляемая величина, например, на основе анализа энтропии.
Далее происходит выделение фонем, работа с фонетическом алфавитом и в общем много чего еще, включая работу с вариантами произношения, морфологией и семантикой, причем исходя из контекста и статистики. Итогом становится то, что сервис ASR переводит набор фонем в слово.
Выделение набора слов в предложения и целые смысловые фразы, происходит аналогично делению речи на слова — по интервалам между словами. Только в этом случае величина интервала принимается большей, чем в случае деления на слова.
На выходе данного шага мы имеем фрагмент речи, преобразованный в текст и готовый для дальнейшей обработки.
- Результат работы голосового ассистента, полученный на первом этапе передается боту, с поддержкой NLU для выявления интентов (intents), сущностей (entities), заполнения слотов (slots) и формирования текста ответа.
В итоге, на выходе у нас получается тестовое представление ответной фразы, являющейся реакцией нашего голосового ассистента на полученный запрос.
- Ответ голосового ассистента передается в сервис синтеза речи, который в дальнейшем озвучивается человеку.
Возникающие проблемы
Несмотря на кажущуюся очевидную правильность реализуемого подхода, в случае голосового ассистента он несет массу проблем. Вот основные из них:
- Задержки
- Задержки
- Задержки
Я не просто так на первые три места поставил одну и туже проблему. Считается, что для комфортного общения ответ должен быть озвучен, примерно через 500 миллисекунд после того, как собеседник закончил формулировать свое сообщение.
Исходя из реальной практики по реализации голосовых ассистентов, в случае задержки более чем в 1 сек. голосовой ассистент довольно часто будет слышать от собеседника-человека характерные для «проверки связи» фразы: «Алло!» или «Меня слышно?». Это особенно свойственно для случаев, когда разработчики пытаются скрыть тот факт, что с человеком общается робот, особенно при исходящих телефонных обзвонах, используя вместо синтеза речи набор заранее предзаписанных аудио-файлов, сделанных реальным человеком.
Основная сложность здесь состоит в том, что в указанный интервал времени должно уместиться выполнение следующих действий:
- Выделение смысловой фразы. Величина задержек здесь — как «палка о двух концах»: увеличение задержек позволяет более точно выделять законченные предложения и целые смысловые фразы, а значит повысится точность ответов ассистента, уменьшение же данной задержки увеличивает количество ошибок в его работе.
- Перевод набора фонем в текст.
- Обработка текста с формированием ответного сообщения.
- Синтез речи по тексту ответа.
И все это должно быть сделано за минимальный интервал времени! - Перебивание голосового ассистента пользователем и попытки уточнить в процессе прослушивания ответа. В текстовых чатах эта ситуация невозможна, т.к. доставка контента осуществляется практически мгновенно. При работе же голосовых ассистентов это вполне обычная ситуация. Более того, к моменту окончания озвучивания ответа, собственно сам ответ может быть уже совсем не актуален, т.к. собеседник успел проговорить дополнительную уточняющую информацию.
- Единая длинная смысловая фраза может быть разорвана на несколько фрагментов. В текстовых чатах такая ситуация встречается довольно редко и характера только для стиля письма, когда каждое словосочетание или даже каждое отдельное слово отправляется отдельным сообщением. В работе голосовых ассистентов, особенно при попытке решить проблему с минимизацией задержек, данная ситуация — довольно обычное дело.
- Обратная ситуация — одна фраза может содержать несколько интентов и сущностей. Причем сущности могут относиться к разным намерениям. В текстовых чатах это встречается, но реже.
Пример:
— В каком отделении Банка вам будет удобно забрать готовую кредитную карту?
— На Ленинском проспекте. А кстати, когда оно работает? Там далеко от остановки?В приведенном примере пользователь указал значение сущности — «Отделение банка» в качестве значения слота и сразу же выдал два интента: «Время работы отделения» и «Детали расположения отделения». Причем сущность «Отделение банка» относится как к исходному слоту, так и к интентам «Время работы отделения» и «Детали расположения отделения».
- В устной речи присутствует большое количество слов-паразитов. В текстовых чатах они практически отсутствуют.
Пример:
— А-а-а-а… ну-у-у-у…
— Ну, как бы вам сказать, типа того как… э-э-э…
— Сейчас, одну минутку, да-а-а… Надо подумать, сразу так и не скажешь…По этой причине одним запросом обрабатывать открытые вопросы становится довольно непростой задачей, т.к. человек, вместо четкого и конкретного ответа, в этом случае обычно начинает довольно долго и пространно рассуждать. Т.е. вести себя именно так, как он обычно делает в естественной речи.
- Различные тембра, интонаций и скорости подачи при комбинировании предзаписанных фраз и синтеза речи через TTS-сервисы.
Что же делать?
Во-первых, при реализация голосового ассистента следует обязательно обеспечить «слушание» собеседника в т.ч. в те моменты, когда виртуальный ассистент сам озвучивает исходящее сообщение. Вариант: либо слушаем, либо отвечаем, является крайне плохой реализацией, которую следует избегать в реальной работе.
Во-вторых, следует провести оптимизацию по скорости работы всех компонентов системы. Однако, в какой-то момент времени мы обязательно упремся в пределы возможного сокращения задержек и усложнения сценариев обработки естественного языка. Поэтому, к нам приходит понимание, что требуется принципиально изменить подход к реализации голосового сервиса.
Основная идея, которая лежит в основе нового подхода, — брать пример с процесса реализуемого человеческим мозгом. Вы замечали, что человек, в процессе разговора, начинает анализировать сообщение, которое проговаривает собеседник, не в тот момент, как оно было полностью закончено, а практически сразу, в момент самого начала его звучания, уточняя с каждым новым словом? По этой причине мы, часто, готовы выдать ответ еще до того, как собеседник закончил свое сообщение.
Если вернуться к алгоритму, который должен реализовывать голосовой виртуальный ассистент, то он может выглядеть следующим образом (для иллюстрации рассмотрим входящий вопрос: «Где находится ближайший банкомат?»):
- Сервис ASR анализирует речь в потоковом режиме, отдавая на следующий шаг результат по отдельным словам. На выходе данного шага мы всегда имеем одно единственное слово.
Результат:
a) «где»
b) «находится»
c) «ближайший»
d) «банкомат» - Происходит накопление слов, поступивших на вход, во входном буфере
Результат:
a) «где»
b) «где находится»
c) «где находится ближайший»
d) «где находится ближайший банкомат» - Накопленный результат передается на обработку текстовому ассистенту, с поддержкой NLU, для выявления интентов и сущностей.
Результат:
a) Запрос: «где». Результат: намерение не определено
b) Запрос: «где находится». Результат: интент «Расположение отделения» с вероятностью 50%, «Расположение банкомата» с вероятностью 50%
c) Запрос: «где находится ближайший». Результат: интент «Расположение отделения» с вероятностью 50%, «Расположение банкомата» с вероятностью 50%, сущность «Точка привязки» = «Текущее местоположение»
d) Запрос: «где находится ближайший банкомат». Результат: интент «Расположение банкомата» с вероятностью 100%, сущность «Точка привязки» = «Текущее местоположение»
Рис. 2. Алгоритм работы голосового ассистента - Если добавление нового слова, полученного на 1 шаге, не просто изменяет веса вероятности определенных ранее интентов, а меняет их состав либо за счет увеличения количества выявленных интентов, либо за счет полной замены их набора, то выполняются следующие действия:
- из набора интентов предыдущей итерации выбирается вариант с наибольшей вероятностью и соответствующий ответ добавляется в выходной буфер;
- входной буфер сбрасывается и туда заново вносится только это новое слово;
- делается новый анализ, т.е. снова переходим на шаг 3.
Всегда, по мере добавления слов в накопленное для анализа сообщение, должно изменяться значение вероятностей в уже выявленных интентах (фактически исключение интента из списка — равноценно заданию ему вероятности = 0%).Это значит, что постоянно должно происходить уточнение запроса. Если же наблюдается обратная ситуация, то это значит, что во входном сообщении есть несколько интентов, которые необходимо обрабатывать по отдельности, и мы сейчас перешли к слову, которое относится к новому интенту.
- Как только будет выявлено, что пользователь закончил свое сообщение (определяется по задержке во входном потоке), сбрасываем в выходной буфер ответ, соответствующий наиболее вероятному выявленному интенту.
- Озвучиваем пользователю содержимое выходного буфера.
Способы повысить качество работы ассистента
Давайте рассмотрим какие есть методы, что бы еще больше повысить качество работы нашего голосового виртуального ассистента:
- Пересортировка ответов в выходном буфере
Можно ввести параметр очередности интентов и соответственно вариантов ответа по приоритетам. Это значит, что сообщения из выходного буфера озвучиваются в порядке приоритета. Например, запрашиваемое местоположение банкомата следует озвучить до информации о доступном в нем операциях (снятие/внесение наличных, открытие депозита и т.д.) или наоборот.
- Настройки «перебивания»
Под этим усовершенствованием понимается возможность определять для некоторых интентов включение «перебивание» собеседника, когда содержимое выходного буфера начинает озвучиваться до того, как пользователь закончил свой рассказ. Данная настройка хорошо работает с предыдущей опцией, когда «перебивающий» ответ получает максимальный приоритет для озвучания из выходного буфера.
Важно отметить, что режим «перебивания» следует включать не для всех интентов, а лишь для некоторого, достаточно ограниченного набора.
- Настройки категоричности
Возможно, что имеет смысл выделить некоторые интенты, которые имеют признак максимальной категоричности. Т.е. в случае обнаружения категоричного интента, ответы для остальных интентов удаляются из выходного буфера, оставляя в нем только этот, категоричный ответ. Возможно, что при этом дополнительно еще включается режим перебивания, когда ассистент начинает озвучивать ответ, не дослушав до конца сообщение пользователя. Примером могут выступать высказывания, которые система классифицирует как нарушающие моральные нормы и т.п.
- Выявление противоречивых ответов
Очень желательно выявлять в выходном буфере ответы, которые противоречат друг-другу. В этом случае следует ответ с меньшим приоритетом просто удалять из выходного буфера.
Дополнительно имеет смысл при выявлении подобной ситуации, в сообщение, которое было оставлено в выходном буфере добавить предсообщение «Если я Вас правильно понял». Причина желательности такого добавления — наличие противоречивых данных в выходном потоке, как правило всегда является следствием противоречивости данных во входном потоке. Поэтому имеет смысл дать человеку понять, что присутствует некоторый элемент неуверенности, который может подтолкнуть его к необходимости дать дополнительные уточнения.
- Определение пола собеседника
Если наделить ассистента возможностью определения гендерной принадлежности по голосу, то это позволит реализовать более близкий к естественному сценарий обработки. Таким образом появляется возможность реализовать различные ветки обслуживания, в т.ч. используя различную лексику при формировании одних и тех же ответов.
- Анализ эмоционального состояния
В обычном разговоре двух и более людей, собеседники, как правило довольно точно могут определить эмоциональное состояние друг друга. Причем делается это не только по содержанию используемой лексики, например, факту наличия или отсутствия в речи ругательств, но и по тембру и скорости речи. Будет просто отлично, если ассистент сможет особым образом обслужить рассерженного пользователя.
Современные системы речевой аналитики достаточно хорошо справляются с задачей определения гендерной принадлежности и эмоционального состояния человека. Осталось только приспособить их к анализу разговора в режиме online.
Особенность реализации бизнес-кейсов
До сих пор мы рассматривали лишь технические особенности реализации виртуальных голосовых ассистентов. Но надо понимать, что не всегда успех зависит только от совершенства технической реализации. Давайте проанализируем уже рассмотренный пример: «Где находится ближайший банкомат?» и поймем, в чем есть особенность для его реализации в голосовом интерфейсе.
Знаете, есть такое правило, справедливое для менеджеров по продажам — «То, что нельзя продать по телефону, не следует продавать по телефону». По этой самой причине ответ вида «Ближайший банкомат находится по адресу …» является не информативным для человека. Если бы он хорошо знал район где сейчас находится, т.е. знал бы названия всех близлежащих улиц и номера домов, то скорее всего он и так бы знал где здесь находится ближайший банкомат. Так что такой ответ скорее всего сразу вызовет формирование другого вопроса: «А где тогда находится названный только что адрес?». Гораздо более информативным ответом будет вариант: «Ближайший банкомат находится примерно в ста метрах от вас по направлению на юго-восток», а еще лучше так же дополнительно отправить человеку сообщение типа location на Yandex или Google карты.
Универсальное правило здесь такое — если для дальнейшего использования информации требуется ее перевод в другой канал восприятия, то этот вариант является неудачным выбором для прямой реализацию в рамках голосового интерфейса. Требуется переформулировать ответ в форму, удобную для восприятия «на слух».
Для ряда сервисов, их реализация в рамках именно голосового ассистента — вообще самое удачное решение. Например, если человек находится в стрессовой ситуации, то ему как правило бывает сложно сконцентрироваться и быстро описать проблему текстом в чате, и он всегда предпочтет все высказать голосом. Это может стать важным критерием при выборе бизнес-кейсов для реализации в рамках виртуального голосового ассистента.
Второй очевидный выбор кейсов на реализацию «голосом» — необходимость их использования в ситуациях, когда есть либо законодательные ограничения на этот счет (например, находясь за рулем автомобиля запрещено вести текстовую переписку), либо просто неудобно использовать другие каналы коммуникации (например, в процессе работы или занятий спортом, когда руки человека попросту заняты).
Совершенству нет предела
Голос удобнее, чем любой другой интерфейс тогда, когда пользователю нужна очень конкретная функция для решения вполне конкретной задачи. Почему так? Очень просто — в такой ситуации необходимость ожидания загрузки сайта, скроллинг по странице, поиск по меню приложения, нажатие кнопок и т.д. всегда неудобнее, чем быстро произнесенная голосовая команда. Сайты и приложения многофункциональны. И в этом их достоинство и недостаток одновременно. Голосовой же навык должен быть заточен под функцию «здесь и сейчас».
Важно помнить, что следует избегать ситуаций, когда голосовые команды требуется сопровождать еще какими-либо дополнительными действиями в других интерфейсах. В противном случае это делает голосовой канал нерабочим т.к. нарушается принцип eyes-free, так как надо читать, и hands-free, если надо еще что-то зажимать.
Еще одна важная рекомендация — не стоит пытаться учить человека говорить. Он это и без нас умеет отлично, т.к. язык — это и так привычный и понятный интерфейс. Наглядный пример плохого стиля: «Чтобы прослушать данное сообщение еще раз, скажите: Прослушать заново». Мы ведь с вами в обычной жизни так не говорим. Разве нет? Лучше просто спросить: «Послушать сообщение ещё раз или перейти к следующему?»
Хорошим стилем реализации голосового виртуального ассистента будет вообще избегать открытых вопросов. Желательно направлять собеседника к конкретным действиям. Особенная ценность появляется там, где ассистент выступает в качестве навигатора или рекомендательной системы. Голосовой ассистент не должен требовать от человека слишком подробной информации. Уточняйте ее по ходу течения разговора.
И на конец, хотелось бы отметить, что персонализация — это, пожалуй, главное, чего не хватает существующим голосовым диалоговым интерфейсам. Без этого невозможно вести более-менее продолжительный диалог. Ассистент должен собирать данные о собеседнике, структурировать и проверять полученную информацию. Важно не терять нить диалога, сохранять и учитывать контекст разговора. Это важно. Иначе ассистент способен будет реализовать только короткие и довольно простые запросы, и, как итог, — это не позволит выйти на по настоящему живой диалог при общении голосового ассистента с пользователем.