Страница 1 из 1

Динамическое голосовое меню

Добавлено: 16 май 2018, 13:03
Razor2k
Добрый день.
Есть задача, посредством asterisk перечислить абоненту его текущие заказы (от 2 до 9) с выбором одного заказа из перечисленного списка (от 1 до Х, где Х - текущее кол-во заказов). Дополнительное условие, если клиент нажал клавишу, которая выходит из диапазона перечисляемого списка, то воспроизведение не должно останавливаться.

Мой решение задачи основывается на выборе опции m и установки четвертого параметра функции Background, в котором подключается нужный контекст, в зависимости от кол-ва заказов абонента:

Код: Выделить всё

[test-ivr]
exten => s,1,AGI(gen-msg,${CHANNEL},${EXTEN}) ; формируем голосовой файл с перечисляемыми заказами и пишем его в /tmp/asterisk/${CHANNEL}
 same => n,Set(ORDERS_COUNT=ODBC_GET_ORDERS_COUNT(${EXTEN})) ; получаем кол-во заказов из БД
 same => n,Answer
 same => n,Set(RETURN_CONTEXT=${CONTEXT}) ; Запоминаем контекст в который необходимо вернуться
 same => n,Background(/tmp/asterisk/${CHANNEL}&silence/5,m,,order-count-${ORDERS_COUNT}) ; Запускаем чтение подготовленного файла, с поиском выбора в нужном контексте 
 same => n(order-select),Verbose(0,"Abonent chose ${EE}")
 same => n,Hangup

[order-count-2]
exten => _[1-2],1,Set(EE=${EXTEN})
 same => n,Goto(${RETURN_CONTEXT},s,order-select)
[order-count-3]
exten => _[1-3],1,Set(EE=${EXTEN})
 same => n,Goto(${RETURN_CONTEXT},s,order-select)
[order-count-4]
exten => _[1-4],1,Set(EE=${EXTEN})
 same => n,Goto(${RETURN_CONTEXT},s,order-select)
[order-count-5]
exten => _[1-5],1,Set(EE=${EXTEN})
 same => n,Goto(${RETURN_CONTEXT},s,order-select)
[order-count-6]
exten => _[1-6],1,Set(EE=${EXTEN})
 same => n,Goto(${RETURN_CONTEXT},s,order-select)
[order-count-7]
exten => _[1-7],1,Set(EE=${EXTEN})
 same => n,Goto(${RETURN_CONTEXT},s,order-select)
[order-count-8]
exten => _[1-8],1,Set(EE=${EXTEN})
 same => n,Goto(${RETURN_CONTEXT},s,order-select)
[order-count-9]
exten => _[1-9],1,Set(EE=${EXTEN})
 same => n,Goto(${RETURN_CONTEXT},s,order-select)
Есть ли более оптимальное решение данной задачи?

Re: Динамическое голосовое меню

Добавлено: 16 май 2018, 13:10
zzuz
Вы просите провести аудит вашего диалплана , который используется в коммерческих целях?

Re: Динамическое голосовое меню

Добавлено: 16 май 2018, 13:18
Razor2k
А кто-то использует asterisk не в коммерческих целях, покупают номер у АТС, заводят SIP-транк себе домой и настраивают IVR на маму, папу, брата, сестру и кошку?

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

Re: Динамическое голосовое меню

Добавлено: 16 май 2018, 14:03
BorisTheBlade
Мне кажется разумнее информировать клиента о том что что-то пошло не так, типа - "вы нажали 3, но у вас только 2 позиции"
А так у вас вполне себе решение получилось учитывая специфические условия.

Re: Динамическое голосовое меню

Добавлено: 16 май 2018, 14:31
Razor2k
BorisTheBlade писал(а):Мне кажется разумнее информировать клиента о том что что-то пошло не так, типа - "вы нажали 3, но у вас только 2 позиции"
Вопрос, в какой момент времени информировать? Если, например, список в 5 позиций и абонент нажал 7 в то время, когда читалась информация о 4 позиции.
Если говорить после оглашения всего списка, то непонятно, как это организовать без прерывания оглашения списка.
Если говорить сразу после того, как нажал, то потом необходимо будет повторять сначала весь список, что долго.
Поэтому был выбран такой план, что на необрабатываемые кнопки не будет никакой реакции.

Re: Динамическое голосовое меню

Добавлено: 16 май 2018, 15:44
ded
Надо подтверждать каждую позицию списка Да?/Нет?, и тогда переходить к следующей позиции списка.

Re: Динамическое голосовое меню

Добавлено: 16 май 2018, 23:41
Repz

Re: Динамическое голосовое меню

Добавлено: 17 май 2018, 07:02
virus_net
Razor2k писал(а):Вопрос, в какой момент времени информировать
Так можно же читать списком и запоминать последнюю озвученную позицию и начинать с нее или после нее при не верном ответе.
А вообще пора переходить на распознавание речи и уходить от топорного "нажмите Х для того чтобы..."
Уж "да" или "нет" распознается 100% всегда. Подтверждаю это многочисленными тестами.