Приветствую всех присутствующих!!
Я работаю над автоматизированным приемом заказов от клиентов по телефону на Asterisk 1.8. Клиенту задается несколько вопросов с помощью голосового движка Гугл, для этого использовал этот скрипт на Perl: http://zaf.github.io/asterisk-googletts/. Ответы клиента распознаются с помощью этого скрипта Perl: http://zaf.github.io/asterisk-speech-recog/. Система уже рабочая, заказов пока не так много, но надеемся на увеличение их числа. Диалогом с клиентом управляет PHP-скрипт через AGI-интерфейс (для удобства использовал PAGI: https://github.com/marcelog/PAGI).
Есть вопросы, после которых обработанный ответ клиента воспроизводится ему обратно, и он должен подвердить или не подтвердить, правильно ли понял его робот. Например, дата и время, когда услуга будет предоставлена, а также контактный телефон (спрашивается только тогда, когда у абонента номер скрыт), дабы избежать случайных ляп. Для этого используются команды STREAM FILE (запись речи робота подготавливается с помощью того же googletts.agi, слегка модифицированного), и сразу после нее - WAIT DIGIT на 7 секунд. Нажатие клиентом в это время цифры 1 воспринимается как подтверждение, нажатие 2 - как несогласие. Работает вполне адекватно.
Однако, не тлеет мечта подключить возможность и голосового подтверждения (да/нет), которое можно было бы сделать и во время речи робота, как и цифрового подтверждения (которое во время STREAM FILE тоже работает). Сложности, которые встали на моем пути:
1) RECORD FILE и STREAM FILE не могут работать параллельно. Я пытался обратиться в сторону команды BACKGROUND вместо STREAM FILE, но здесь тоже параллельности быть не может.
2) Даже если голосовое подтверждение сделать возможным только после того, как фраза робота закончится, и вместо WAIT DIGIT использовать RECORD FILE, то есть проблема с восприятием тишины, которую я уже успешно использовал как признак конца ответа - в разных задачах у меня этот таймаут 2-3 секунды. Если человек ничего не собирается говорить, а, допустим, секунд 5 выискивает цифру 1 или 2, то тишина сработает раньше. Если тишину не воспринимать, а ограничить длину записи 7 секундами, то от голосового ответа не будет никакого преимущества - сказав "да" или "нет", человек будет ждать дольше.
Мне пришла идея запустить RECORD FILE в цикле, записывая в разные файлы кусочки, например, по секунде. Записался первый - отправляем на Гугл, пытаемся разобрать фразу. Записался второй - склеиваем с первым и снова отправляем на Гугл, записался второй - отправляем уже файл, склеенный из трех, и т.д., пока не разберем фразу "да" или "нет", или пока клиент не нажмет цифру. Разумеется, есть сложность с многопоточной обработкой в PHP (RECORD FILE и запросы к Гуглу должны делаться параллельно), но если что, я могу написать для распознавания отдельный скрипт, подключаемый с помощью popen. И всё-таки, если я это сделаю, вопрос 1 останется для меня не решенным.
Кто-нибудь сталкивался с подобным? Существуют ли пути решения? Может быть, я что-то упустил?