Анализ эмоций клиентов с помощью IBM Bluemix, Watson и голосовых функций Twilio

Автор: | 04.08.2026

Не каждый клиент, обращающийся за поддержкой, доволен. Когда недовольный клиент заходит в офис, его эмоции можно распознать по множеству признаков и сигналов. Однако по телефону оценить эмоции клиента сложнее, ведь доступны только слова и тон голоса. Было бы здорово получить помощь в определении настроения клиента? В этой статье мы как раз и займемся этим, используя Java-приложение Cloud Foundry и два API Watson в IBM Bluemix вместе с Twilio Programmable Voice.

Наше приложение начнет работу с Twilio-номера. Когда клиент звонит на этот номер, Twilio отправляет HTTP-запрос в наше Java-приложение, ожидая инструкции TwiML в ответе. Наш TwiML предложит пользователю объяснить причину звонка, а затем запишет его ответ. После завершения записи Twilio отправит серверу запись через другой HTTP-запрос. Получив запись, мы используем API Watson Speech to Text для получения текстовой расшифровки сказанного. Затем этот текст будет передан в API Watson Tone Analyzer, который проведет эмоциональный анализ.

Для начала соберем все необходимые аккаунты и инструменты.

Если у вас еще нет аккаунта Twilio и телефонного номера, вы можете зарегистрироваться бесплатно.

Вам также понадобится аккаунт Bluemix, который можно создать бесплатно.

Я обычно использую VIM, но для работы с Java предпочитаю IDE. Я буду использовать IntelliJ IDEA, которую можно скачать бесплатно.

Наконец, ознакомьтесь с демо-приложением Tone Analyzer и API Explorer, чтобы понять, какие данные будут возвращены.

Анализ организован по тональностям. Эмоциональные тональности включают гнев, отвращение, страх, радость и грусть. Письменные тональности — аналитичность, уверенность и неуверенность. Социальные тональности — открытость, добросовестность, экстраверсия, доброжелательность и невротизм.

В нашем приложении мы будем использовать только **эмоциональные** тональности, хотя остальные тоже содержат массу полезной информации.

*Примечание: Tone Analyzer сейчас находится в бета-версии 3 и на данный момент поддерживает только английский язык.*

Создайте новое веб-приложение Cloud Foundry из панели управления Bluemix. Выберите Java для Liberty и дайте ему уникальное имя.

Следуйте инструкциям по настройке интерфейса командной строки CF и загрузке стартового кода. Пропустите последний шаг — `cf push YourApp` — пока, так как мы еще не готовы развернуть приложение.

Перейдите внизу к разделу «VIEW APP OVERVIEW». Здесь мы добавим два сервиса Watson. Нажмите кнопку «ADD A SERVICE OR API» и выберите «Speech To Text». Следуйте подсказкам, нажимая кнопку «CREATE», чтобы добавить сервис в приложение. Повторите это для «Tone Analyzer». Учетные данные этих сервисов будут подхвачены через переменные окружения после развертывания.

Распакуйте загруженный стартовый код и импортируйте его в IntelliJ как Maven-проект. Нам нужно изменить только два файла: `pom.xml` — это конфигурация Maven, и `src/main/java/wasdev/sample/servlet/SimpleServlet.java`, содержащий наш Java-код.

Это отличный момент, чтобы запустить пример проекта и убедиться, что все работает.

Выполните задачи Maven `clean` и `install`, выделенные на картинке выше, чтобы скомпилировать проект в файл `.war`. Файл `.war` — это готовый пакет со всеми зависимостями, необходимыми для запуска проекта.

Затем выполните задачу `liberty:run-server`, также выделенную на картинке выше, чтобы загрузить и запустить сервер разработки с нашим `.war`. Откройте в браузере http://localhost:9080/JavaHelloWorldApp/ и вы должны увидеть веб-страницу с приветствием «Hello World».

Нажмите красную кнопку остановки, чтобы завершить работу сервера.

Теперь, когда мы добавили новые зависимости Maven и запустили пример проекта, можно приступить к созданию части приложения, которая будет сообщать Twilio, какое взаимодействие предложить звонящему на наш Twilio-номер.

Откройте файл `src/main/java/wasdev/sample/servlet/SimpleServlet.java` и ознакомьтесь с кодом. Это очень простой пример сервлетов — удобный способ определения HTTP-маршрутов в Java. Этот класс и метод `doGet` будут вызваны при поступлении HTTP-запроса GET на `http://your-web-app.mybluemix.net/SimpleServlet`.

Вы можете посмотреть завершенный файл на GitHub и следовать инструкциям ниже, чтобы создать его.

Мы немного позже настроим Twilio, но этот метод `doGet` будет отвечать на входящий запрос от Twilio, когда кто-то позвонит на наш номер. Сначала мы предложим звонящему голосовое приглашение, а затем начнем запись разговора. Для этого мы будем использовать глаголы TwiML `` и ``. Измените содержимое метода следующим образом.

Метод `Record` настроен на POST-запрос для повторного использования того же маршрута `/SimpleServlet` и указывает Twilio остановить запись при нажатии клавиши `#` на телефоне. Затем `TwiMLResponse` преобразуется в XML-строку и отправляется обратно с правильным типом содержимого.

Когда запись завершится, Twilio отправит HTTP-запрос в наше приложение с параметром `RecordingUrl`, содержащим URL-адрес аудиозаписи. Нам нужно реализовать метод `doPost` для обработки запроса сразу после `doGet`.

Ищем параметр `RecordingUrl` в запросе и возвращаемся, если он отсутствует.

Класс Watson `SpeechToText` ожидает экземпляр класса File из Java, а Twilio отправляет нам URL, указывающий на запись в формате `.wav`. Нам нужно скачать файл и создать временный файл для передачи его Watson.

Создаем новый объект URL, открываем HTTP-соединение и получаем входной поток.

Теперь, когда у нас есть временный файл, мы можем создать новый экземпляр `SpeechToText`.

Качество звука из телефонной сети не самое лучшее, поэтому нужно указать Watson использовать другую модель анализа для получения наилучших результатов транскрипции. Создаем новый экземпляр `RecognizeOptions` и устанавливаем модель `en-US_NarrowbandModel`.

Делаем запрос с файлом и параметрами, затем получаем результаты.

Создаем новый экземпляр `ToneAnalyzer` с обязательной датой версии.

Передаем текст расшифровки в `ToneAnalyzer`, создаем новый `StringBuilder` для нашего ответа и перебираем категорию тональностей **Emotion**, которая находится под индексом 0.

В этой статье мы отправим результаты анализа `ToneAnalysis` на наш телефон в виде SMS. Для этого используем глагол TwiML ``. Создаем новый экземпляр `TwiMLResponse` и добавляем новый экземпляр `Sms` с преобразованной в строку `toneString`. Устанавливаем тип содержимого ответа и записываем `TwiMLResponse` в ответ в виде строки.

Пока приложение развертывается, настроим наш Twilio-номер для перенаправления входящих звонков в наше приложение. Выберите номер, который хотите использовать, или купите новый на странице управления номерами.

Скопируйте сгенерированный URL вашего приложения Bluemix из панели управления. Скорее всего, он будет выглядеть так: http://Your-App-Name.mybluemix.net/SimpleServlet.

Вставьте скопированный URL в поле *Voice Request URL* с добавлением `/SimpleServlet`. Установите тип запроса `HTTP GET`, чтобы он соответствовал нашему обработчику маршрута `doGet`.

После развертывания приложения позвоните на свой номер и оставьте голосовое сообщение. Убедитесь, что нажали `#` вместо того, чтобы просто повесить трубку. Звонок завершится автоматически, и вы получите SMS с данными анализа тональности.

Откройте окно и крикните миру: «УРАААА!».

В этой статье мы создали приложение, которое помогает оценивать эмоции клиентов по телефонным звонкам с использованием IBM Watson и Twilio Programmable Voice, несмотря на то, что мы не видим их мимику и жесты.

Мы взяли аудиозапись и расшифровали ее с помощью TwiML и Watson Speech to Text. Затем передали эту расшифровку в Watson Tone Analysis. Все это было быстро развернуто с помощью Cloud Foundry на Bluemix.

Возможностей для дальнейшего развития очень много, и я рекомендую ознакомиться с Twilio TaskRouter для интеллектуальной маршрутизации или эскалации обращений клиентов для оптимального обслуживания. Изучите документацию для отличного старта.

Обязательно поделитесь в комментариях или в Twitter @eddiezane тем, что вы сделаете дальше!