Как сделать автоинформатор на Asterisk

автоинформатор на Asterisk

Как сделать автоинформатор на Asterisk?
Задача: Научить Asterisk проговаривать цифры и реализовать автоинформатор на Asterisk.
Автоинформатор будет решать следующие задачи:
А) Принимать вызов на диапазон номеров и проговаривать, что номер из диапазона свободен для и свободный номер можно приобрести
Б) Принимать вызов на диапазон номеров и проговаривать, что номер из диапазона был перенесен на другой номер, номер другого диапазона, соответствие вызываемого номера и номера обслуживаемого в данный момент по последним цифрам номеров, проговаривать нужный номер
Для того, чтобы Asterisk произнес  цифры нужно подготовить звуковые файлы в моем случае это файлы десяток и сотен

Контекст для обработки услуги автоинформатор на Asterisk:

;Контекст автоинформатор

[answerphone]
;True если Ваш номер изменен
;False если Ваш номер свободен
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;В этом блоке прописываем номера и номерные емкости
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;Свободен для одного номера
;exten => _2222222,1,Goto(number-2222222,s,1)

;Свободен для емкости 22210XX
exten => _22210XX,1,Set(number222=${EXTEN:0:3})
exten => _22210XX,n,Set(number10=${EXTEN:3:2})
exten => _22210XX,n,Set(numberper=${EXTEN:-2:2})
exten => _22210XX,n,Goto(number-22210,s,1)

;Свободен для емкости 22211XX
exten => _22211XX,1,Set(number222=${EXTEN:0:3})
exten => _22211XX,n,Set(number11=${EXTEN:3:2})
exten => _22211XX,n,Set(numberper=${EXTEN:-2:2})
exten => _22211XX,n,Goto(number-22211,s,1)

;Изменен с 35790XX -> 22228XX
exten => _35790XX,1,Set(number357=${EXTEN:0:3})
exten => _35790XX,n,Set(number90=${EXTEN:3:2})
exten => _35790XX,n,Set(numberper=${EXTEN:-2:2})
exten => _35790XX,n,Set(number222=222)
exten => _35790XX,n,Set(number28=28)
exten => _35790XX,n,Goto(number-35790,s,1)

;Изменен с 35791XX -> 22229XX
exten => _35791XX,1,Set(number357=${EXTEN:0:3})
exten => _35791XX,n,Set(number91=${EXTEN:3:2})
exten => _35791XX,n,Set(numberper=${EXTEN:-2:2})
exten => _35791XX,n,Set(number222=222)
exten => _35791XX,n,Set(number29=29)
exten => _35791XX,n,Goto(number-35791,s,1)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;В этом блоке прописываем передачу переменных и переход
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Если номер "Свободен" - false
;
;Номер 2222222

[number-2222222]
exten => s,1,Macro(answerphone,222,22,22,false)

;Емкость 22210
[number-22210]
exten => s,1,Macro(answerphone,${number222},${number10},${numberper},false)

;Емкость 22211
[number-22211]
exten => s,1,Macro(answerphone,${number222},${number11},${numberper},false)

;Если номер "Изменен" - true
;
;Изменен с 35790XX -> 22228XX
[number-35790]
exten => s,1,Macro(answerphone,true,${number357},${number90},${numberper},${number222},${number28})

;Изменен с 35791XX -> 22229XX
[number-35791]
exten => s,1,Macro(answerphone,true,${number357},${number91},${numberper},${number222},${number29})

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Этот блок отвечает за выполнение и обработку услуги
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Макрос для обработки услуги автоинформатор
;
[macro-answerphone]
exten => s,1,Set(per1="/var/lib/asterisk/sounds/ru/avtoinformator")
exten => s,n,Set(CHANNEL(language)=ru)
;exten => s,n,Wait(2)

;Если нужно убрать один номер или несколько из емкости
exten => s,n,GotoIf($["${ARG2}" = "355" && "${ARG3}" = "90" && "${ARG4}" = "00"]?tval)
exten => s,n,GotoIf($["${ARG2}" = "355" && "${ARG3}" = "90" && "${ARG4}" = "01"]?tval)
exten => s,n,GotoIf($["${ARG2}" = "355" && "${ARG3}" = "90" && "${ARG4}" = "99"]?tval)

;Если Абоненту изменен номер, то true, если не занят то false
exten => s,n,GotoIf($["${ARG1}" = "true"]?changed)
exten => s,n,GotoIf($["${ARG4}" = "false"]?free)
exten => s,n,Hangup()

;Если true
;Проговариваем "Номер"
exten => s,n(tval),Wait(1)
exten => s,n,Hangup()

exten => s,n(changed),Wait(1)
exten => s,n,While($[${i} < 720])
exten => s,n,Playback(${per1}/nomerizm1)

;Проговариваем вызываемый номер, пока не используем
;exten => s,n,SayNumber(${ARG2})
;exten => s,n,SayNumber(${ARG3})
;exten => s,n,SayNumber(${ARG4})
;Проигрываем "Который был изменен на"
;exten => s,n,Playback(${per1}/number_changet)
;Проговариваем новый "Номер"
exten => s,n,SayNumber(${ARG5})
exten => s,n,SayNumber(${ARG6})
exten => s,n,Set(noll=${ARG4:0:1})
exten => s,n,Set(chislo=${ARG4:0:2})
exten => s,n,GotoIf($["${noll}" = "0"]?tol:tul)

exten => s,n(tol),SayNumber(${noll})
exten => s,n,SayNumber(${chislo})
exten => s,n,Wait(1)
exten => s,n,Set(i=$[${i} + 1])
exten => s,n,Goto(s,1)
exten => s,n,EndWhile
exten => s,n,Hangup()

exten => s,n(tul),SayNumber(${ARG4})
exten => s,n,Wait(1)
exten => s,n,Set(i=$[${i} + 1])
exten => s,n,Goto(s,1)
exten => s,n,EndWhile
exten => s,n,Hangup()

;Если false
;Проигрываем "Вы позвонили на номер"
;Проговариваем номер Абонента
;Проигрываем "Номер не занят"

exten => s,n(free),Wait(1)
exten => s,n,While($[${i} < 120])
exten => s,n,Playback(${per1}/beaut01)
exten => s,n,SayNumber(${ARG1})
exten => s,n,SayNumber(${ARG2})
exten => s,n,Set(null=${ARG3:0:1})
exten => s,n,Set(cifra=${ARG3:0:2})
exten => s,n,GotoIf($["${null}" = "0"]?too:tuu)

exten => s,n(tol),SayNumber(${noll})
exten => s,n,SayNumber(${chislo})
exten => s,n,Wait(1)
exten => s,n,Set(i=$[${i} + 1])
exten => s,n,Goto(s,1)
exten => s,n,EndWhile
exten => s,n,Hangup()

exten => s,n(tul),SayNumber(${ARG4})
exten => s,n,Wait(1)
exten => s,n,Set(i=$[${i} + 1])
exten => s,n,Goto(s,1)
exten => s,n,EndWhile
exten => s,n,Hangup()

;Если false
;Проигрываем "Вы позвонили на номер"
;Проговариваем номер Абонента
;Проигрываем "Номер не занят"

exten => s,n(free),Wait(1)
exten => s,n,While($[${i} < 120])
exten => s,n,Playback(${per1}/beaut01)
exten => s,n,SayNumber(${ARG1})
exten => s,n,SayNumber(${ARG2})
exten => s,n,Set(null=${ARG3:0:1})
exten => s,n,Set(cifra=${ARG3:0:2})
exten => s,n,GotoIf($["${null}" = "0"]?too:tuu)

exten => s,n(too),SayNumber(${null})
exten => s,n,SayNumber(${cifra})
exten => s,n,Playback(${per1}/beaut02)
exten => s,n,Set(i=$[${i} + 1])
exten => s,n,Goto(s,1)
exten => s,n,EndWhile
exten => s,n,Hangup()

exten => s,n(tuu),SayNumber(${ARG3})
exten => s,n,Playback(${per1}/beaut02)
exten => s,n,Set(i=$[${i} + 1])
exten => s,n,Goto(s,1)
exten => s,n,EndWhile
exten => s,n,Hangup()

Для того, чтобы астериск начал проговаривать цифры соответствующим образом корректируем файл say.conf

[ru-base](!)

_[n]um:00X => avtoinformator/0, avtoinformator/0, num:${SAY:2}
_[n]um:0XX => avtoinformator/0, num:${SAY:1}
_[n]um:0. => num:${SAY:1}
_[n]um:X => avtoinformator/${SAY}

; Tens

_[n]um:1X => avtoinformator/${SAY}
_[n]um:[2-9]0 => avtoinformator/${SAY}
_[n]um:[2-9][1-9] => avtoinformator/${SAY:0:1}0, num:${SAY:1}

; Hundreds

_[n]um:[1-9]00 => avtoinformator/${SAY}
_[n]um:XXX => num:${SAY:0:1}00, num:${SAY:1}

; Thousands

_[n]um:1XXX => num:${SAY:0:1}, avtoinformator/thousand, num:${SAY:1}
_[n]um:[2-4]XXX => num:${SAY:0:1}, avtoinformator/thousands-i, num:${SAY:1}
_[n]um:[5-9]XXX => num:${SAY:0:1}, avtoinformator/thousands, num:${SAY:1}
_[n]um:X1XXX => num:${SAY:0:2}, avtoinformator/thousand, num:${SAY:2}
_[n]um:X[2-4]XXX => num:${SAY:0:2}, avtoinformator/thousands-i, num:${SAY:2}
_[n]um:X[5-9]XXX => num:${SAY:0:2}, avtoinformator/thousands, num:${SAY:2}
_[n]um:XX1XXX => num:${SAY:0:3}, avtoinformator/thousand, num:${SAY:3}
_[n]um:XX[2-4]XXX => num:${SAY:0:3}, avtoinformator/thousands-i, num:${SAY:3}
_[n]um:XX[5-9]XXX => num:${SAY:0:3}, avtoinformator/thousands, num:${SAY:3}

; Millions

_[n]um:1XXXXXX => num:${SAY:0:1}, avtoinformator/million, num:${SAY:1}
_[n]um:[2-4]XXXXXX => num:${SAY:0:1}, avtoinformator/millions-i, num:${SAY:1}
_[n]um:[5-9]XXXXXX => num:${SAY:0:1}, avtoinformator/millions, num:${SAY:1}
_[n]um:X1XXXXXX => num:${SAY:0:2}, avtoinformator/million, num:${SAY:2}
_[n]um:X[2-4]XXXXXX => num:${SAY:0:2}, avtoinformator/millions-i, num:${SAY:2}
_[n]um:X[5-9]XXXXXX => num:${SAY:0:2}, avtoinformator/millions, num:${SAY:2}
_[n]um:XX1XXXXXX => num:${SAY:0:3}, avtoinformator/million, num:${SAY:3}
_[n]um:XX[2-4]XXXXXX => num:${SAY:0:3}, avtoinformator/millions-i, num:${SAY:3}
_[n]um:XX[5-9]XXXXXX => num:${SAY:0:3}, avtoinformator/millions, num:${SAY:3}

; Billions

_[n]um:1XXXXXXXXX => num:${SAY:0:1}, avtoinformator/billion, num:${SAY:1}
_[n]um:[2-4]XXXXXXXXX => num:${SAY:0:1}, avtoinformator/billions-i, num:${SAY:1}
_[n]um:[5-9]XXXXXXXXX => num:${SAY:0:1}, avtoinformator/billions, num:${SAY:1}
_[n]um:X1XXXXXXXXX => num:${SAY:0:2}, avtoinformator/billion, num:${SAY:2}
_[n]um:X[2-4]XXXXXXXXX => num:${SAY:0:2}, avtoinformator/billions-i, num:${SAY:2}
_[n]um:X[5-9]XXXXXXXXX => num:${SAY:0:2}, avtoinformator/billions, num:${SAY:2}
_[n]um:XX1XXXXXXXXX => num:${SAY:0:3}, avtoinformator/billion, num:${SAY:3}
_[n]um:XX[2-4]XXXXXXXXX => num:${SAY:0:3}, avtoinformator/billions-i, num:${SAY:3}
_[n]um:XX[5-9]XXXXXXXXX => num:${SAY:0:3}, avtoinformator/billions, num:${SAY:3}

; enumeration

_e[n]um:X[mfn] => avtoinformator/h-${SAY}
_e[n]um:1X[mfn] => avtoinformator/h-${SAY}
_e[n]um:[2-9]0[mfn] => avtoinformator/h-${SAY}
_e[n]um:[2-9][1-9][mfn] => num:${SAY:0:1}0, avtoinformator/h-${SAY:1}
_e[n]um:[1-9]XX[mfn] => num:${SAY:0:1}, avtoinformator/hundred, enum:${SAY:1}

[ru](ru-base,digit-base)

_[n]um:00X => avtoinformator/0, avtoinformator/0, num:${SAY:2}
_[n]um:0XX => avtoinformator/0, num:${SAY:1}
_[n]um:0. => num:${SAY}
_date:[Y]:. => enum:${SAY:0:4}m            ; year, [12]xxx
_date:[Bb]:. => avtoinformator/mon-$[${SAY:4:2}-1]  ; month name, 0..11
_date:[Aa]:. => avtoinformator/day-${SAY:16:1}      ; day of week
_date:[de]:. => enum:${SAY:6:2}n            ; day of month
_date:[hH]:. => num:${SAY:8:2}              ; hour
_date:[I]:. => num:$[${SAY:8:2} % 12]      ; hour 0-12
;    _date:[M]:. => num:${SAY:10:2}             ; minut
_date:[M]:. => num:${SAY}             ; minute
_date:[pP]:. => avtoinformator/p-m  ; am pm
_date:[S]:. => num:${SAY:13:2}             ; seconds
_datetime::. => date:AdBY 'avtoinformator/at' IM:${SAY}
_date::. => date:AdBY:${SAY}
_time::. => date:IM:${SAY}
_minut:. => date:M:${SAY}
_mi[n]uta:0 => num:${SAY}, avtoinformator/minutes
_mi[n]uta:1 => digits/1f, queue-minute
_mi[n]uta:2 => digits/2f, avtoinformator/minutes-i
_mi[n]uta:[3-4] => num:${SAY}, avtoinformator/minutes-i
_mi[n]uta:[5-9] => num:${SAY}, minutes
_mi[n]uta:0X => minuta:${SAY:1}
_mi[n]uta:1X => num:${SAY}, minutes
_mi[n]uta:[2-5]0 => num:${SAY}, minutes
_mi[n]uta:[2-5][1-9] => num:${SAY:0:1}0, minuta:${SAY:1}

Для того, чтобы автоинформатор включался только в заданное время достаточно включить его include в контексте следующим образом:
include => answerphone,01:00-23:45,mon-sun,*,*

Поделиться:

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

7 + = 13
Решите простой математический пример. Например для "два плюс четыре =?" введите "6".