Автосекретарь ASR работает как голосовой помощник-коммутатор, который вызывает абонента после произнесения его имени и фамилии. Пользователь произносит ФИО конкретного сотрудника, сервис ищет номер телефона в адресной книге и соединяет пользователя с данным контактом. В случае, если контакт найти не удалось, система попросит уточнить запрос.
Пользователь снимает трубку и набирает номер, на котором работает IVR-скрипт автосекретаря. После приветственного сообщения, аудиопоток с микрофона отправляется на специальный порт MSR, который детектирует тишину и нарезает по ней блок данных (chank). Каждый блок отправляется отдельным HTTP POST-запросом в сторону ecss-clerk (через restfs) с заголовком Content-type: Transfer-Encoding. Идентификатором такого запроса является путь HTTP-запроса вида /speech-recognition/domain/eltex/2021-01-25_18-30-18-866402_asr_5501-4893.wav. По имени этого wav-файла (который по своей сути является чистым pcm) ecss-clerk идентифицирует блок. Каждый блок отправляется на распознавание, по результату которого происходит поиск номера абонента по адресной книге. Если найти его не удалось, то clerk просит следующий блок и так до тех пор, пока не получится найти номер или не сработает таймаут в ivr-скрипте.
Настройка приветственного и других сообщений описана в разделе «Настройка IVR-скрипта». Настройка номера, на котором работает IVR-скрипт автосекретаря, описана в разделе «Настройка номера телефона для автосекретаря». |
В случае успеха, json-файл отправляется на MSR через сервис restfs, далее MSR пересылает его на ядро. Промежуточные ответы также доходят до ядра и имеют HTTP-код 206. Они не содержат в прилагаемом в теле json поля с номером, но имеют поле с распознанной строкой. Также промежуточный ответ может содержать поле с текстом для уточнения, если по полученной речи нашлось несколько совпадений в телефонной книге. Имея эту строку по таймауту, IVR может синтезировать ответ для пользователя, уведомив его о том, что найти распознанную строку не удалось или попросив произнести уточняющую фразу. Если до таймаута ecss-clerk не пришлёт ответ ядру, то синтезированное уведомление не будет содержать распознанной строки.
Синтез речи происходит через сервис restfs, который в свою очередь проксирует запрос на настроенный tts-сервис. Он озвучивает текст, который передаётся по цепочке Clerk → RestFs → ecss-tts.
После получения PCM ecss-clerk выполняет следующие действия:
Отправляет pcm на распознавание: clerk (http) → asr-server(ws) → vosk-server;
Ответ, как уже сказано выше, имеет формат json.
Пример:
{
"done": true,
"negative_url": "negative/2021-01-25_18-30-18-866402_asr_5501-4893",
"number": "4815",
"positive_url": "positive/2021-01-25_18-30-18-866402_asr_5501-4893",
"recognized": "антон черненко"
} |
Поле done информирует о том, что распознавание закончено и номер был найден;
negative_url и positive_url — обратные вызовы, которые отправляет IVR-скрипт (через блок RPC) после получения json. Помечают запрос на clerk как успешный или не успешный;
recognized — ответ от asr-server;
answer — текст с уточнением, который используется для синтеза речи;
number — найденный номер телефона.
Пример промежуточного ответа (часть запроса распознано):
{
"done": false,
"negative_url": "negative/2021-01-25_18-30-18-866402_asr_5501-4893",
"recognized": "василий",
"answer": "уточните фамилию иванов или петров"
}
|
После звонка абонента на номер IVR система произносит приветственное сообщение. Далее голосовой запрос абонента поступает на сервер приложения. Если до таймаута от приложения приходит ответ с номером, то происходит звонок. В противном случае происходит одно из двух:
Настройка приветственного и других сообщений системы описана в разделе «Настройка IVR-скрипта». Настройка номера, на котором работает IVR-скрипт автосекретаря, описана в разделе «Настройка номера телефона для автосекретаря». |
Clerk экспортирует метрики о:
Эти данные публикуются в виде метрик Prometheus на HTTP‑эндпоинте Clerk и размечаются Docker‑label’ами (ru.eltex-co.metrics.*), чтобы мониторинг мог автоматически находить нужный сервис.
Peeper выступает фронтендом к этим метрикам: