Зачем нам потребовалось написать свою реализацию MRCP-сервера. Часть 1

от автора

Привет, Хабр! Сегодня мы хотели бы поделиться кейсом создания собственного MRCP-сервера. Это протокол передачи данных, используемый серверами для предоставления различных услуг (таких как распознавание речи и синтез речи) для своих клиентов. MRCP опирается на другие протоколы, в частности, потоковый протокол реального времени (протокол RTSP) или протокол установления сеанса связи (протокол SIP) для установления и управления сеансом аудиопотоков между клиентом и сервером. О том, что нас привело к созданию собственной реализации этого сервера — под катом. Во второй части расскажем об особенностях своего проекта, с подробным разбором возможностей. 

UniMRCP — хорошо, но может быть и лучше

Первая версия сервера была построена на UniMRCP. Почему? Да просто потому, что это стандарт, и практически его все и используют. Альтернативы практически нет.

UniMRCP — кроссплатформенное ПО с открытым исходным кодом, которое включает все необходимое для реализации  функций MRCP-клиента и MRCP-сервера. Распространяется под лицензией  Apache License 2.0. Все бы ничего, но при работе с UniMRCP у нас возникло несколько проблем.

Проблема 1. Дорого!

Если использовать просто сервер — то все отлично, но для наших целей был необходим плагин к серверу. Плагин называется UMS Transcribe Plugin, а нужен он для распознавания речи. Все бы ничего, но стоит он $50 за канал. А когда нужно несколько тысяч каналов, как в нашем случае, то такой вариант не очень подходит.

Все дело в том, что работа с собеседниками осуществляется по многим тысячам каналов одновременно. Голосовые агенты могут, например, общаться с десятками тысяч клиентов крупной компании, но в этом случае сумма, которую необходимо заплатить производителю плагина, становится просто непомерной.

Проблема 2. Паузы

Для того, чтобы голосовой агент работал нормально и воспринимался собеседником без проблем, он должен моментально реагировать во время разговора. А в случае использования UniMRCP с этим возникали проблемы, которые мешали нормальному общению с собеседниками-людьми. Сложности появились даже в случае пауз в разговоре.

В документации говорится о назначении speech-complete-timeout — это время, после которого должен вернуться результат распознавания, если абонент молчит. В UniMRCP, как мы не пытались, мы не могли этим управлять. Наш собственный VAD к этому параметру восприимчив.

Пример запроса

MRCP/2.0 304 RECOGNIZE 1
Channel-Identifier: 230f4b33-fcdc-1239-d5a6-d00ddfa58be9@speechrecog
Content-Type: text/uri-list
Cancel-If-Queue: false
Recognition-Timeout: 30000
Start-Input-Timers: true
No-Input-Timeout: 5000
Speech-Complete-Timeout: 750
Content-Length: 25builtin:speech/transcribe

Параметром speech-complete-timeout управлять никак не удавалось — такое впечатление, что это просто не предусмотрено разработчиками. Единственный таймаут, который нормально работал в UniMRCP — это recognition-timeout.

Пример разговора (HR-сценарий)

Бот: Здравствуйте! Меня зовут Елена, звоню по поводу вашего резюме. Подскажите, предложение по вакансии актуально для вас?

Абонент: Да, здравствуйте

Бот: Смотрите, сейчас у нас открыта вакансия специалиста офиса продаж. В обязанности входит консультация абонентов, продажа оборудования и работа с кассой. Оформление идет полностью официальное, белая зарплата, средний уровень дохода N рублей, максимальный уровень практически не ограничен, есть возможность карьерного роста. График 5 рабочих дней с двумя плавающими выходными. Также предоставляем все социальные гарантии, дмс, бонусы и скидки от компании. Рассмотрите такие условия для себя?

Абонент: А еще раз, откуда вы звоните?

Бот: Это розничная сеть NNN

Абонент: А какой у вас график?

Бот: График работы формируется программой автоматически с учетом потока клиентов и нагрузки на офис с двумя плавающими выходными, то есть смены рабочие 6 8 10 12 часов в день могут быть и не более 40 часов в неделю. При этом график составляется заранее на 2 недели, то есть вы заранее знаете ваш график, ваши выходные, и можете уже планировать.

Абонент: Ну хорошо

Это лишь начало разговора. И если абонент делал большие паузы, то у бота возникали проблемы, возникали большие задержки в работе бота, а это не просто критично, а очень критично. Разговор мог прерваться, не начавшись.

Проблема 3. Сложности с реакцией на отказ

Речь идет о возможности управлять логикой отправки (START-OF-INPUT) — сообщение, которое сигнализирует о том, что начался ввод и надо бы прервать воспроизведение.

Так, система проигрывает определенный скрипт пользователю.

Бот: Здравствуйте! Меня зовут Валентин и я хочу вам предложить супер-пупер предложение …

Абонент: не-не-не, ниче не надо 

Мы должны остановиться и среагировать на это “не-не-не…”. И здесь как раз возникала проблема с возможностью управления логикой отправки.

Проблема 4. Необходимость кастомизации

UMS Transcribe Plugin — проприетарный плагин, в нем ничего нельзя менять и настраивать. Да, можно связаться с разработчиками, что-то там предложить, но такое взаимодействие требует немало сил и, главное, времени. А его никогда ни у кого нет.

Нам же нужно было реализовать не одну кастомную фичу, а сразу несколько, включая:

  • распознавание пола.

  • разделение кредов по проектам.

  • кэширование синтеза.

Хватит это терпеть!

Помучавшись с UniMRCP, мы решили, что не хотим больше проблем, поэтому решили найти выход из положения. И лучшим выходом стало написание собственного сервера/плагина.

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

Недостатки UniMRCP мы превратили в достоинства собственного продукта, который получил:

  • Собственный NLU-алгоритм, способный обучаться на небольшом объеме данных.

  • Короткие паузы в диалогах.

  • Умную систему реагирования на прерывания разговора со стороны собеседника.

  • Возможность создания любого количества каналов.

  • Возможность кастомизации — систему можно подстраивать под нужды любого проекта.

Решение стать самостоятельными стало более чем правильным. Кроме того, что мы сами его используем во всех проектах, так им еще и заинтересовались многие компании. Сейчас наша разработка, MRCP-сервер, успешно продается на рынке, ее используют крупные банки и телеком-операторы. 

ссылка на оригинал статьи https://habr.com/ru/company/neuronet/blog/555148/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *