Привет, Хабр! Сегодня мы хотели бы поделиться кейсом создания собственного 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/
Добавить комментарий