29.10.2015

Debug

Litnimax еще в 2009 году предложил:

И снова ты говоришь о pbx_config. Это там нужна отладка, в CLI. При выносе всей логики в mod_lua, ты волен сам делать такой debug, какой тебе хочется:
logger = logging.file("/tmp/test-%s.log", "%Y-%m-%d") logging.file("/tmp/test-%s.log", "%Y-%m-%d")
И далее вставляй log.debug(...) куда только захочешь.
Представь себе включение отладки для определенного пользователя - в sip.conf ставишь setvar=log_level=debug, и все звонки он него трассируются. И ты сам волен в любой момент воткнуть logger.debug(...) в любую ветку алгоритма или между любыми командами.

Надо проверить...

28.10.2015

DialPlan в устройствах Linksys

Сегодня пришлось малость переделать DialPlan в 2102 но как-то подзабыл что за то отвечает.
Поэтому для памяти взял у IGORG
Оригинал

 
Диалплан представляет из себя последовательность шаблонов, разделённых вертикальной чертой '|' и ограниченных круглыми скобками. Для каждой линии может задаваться свой диалплан (параметр Dial_Plan). Для устройств, где присутствуют FXO порты (например, SPA3102 и AG310), настроек с диалпланами гораздо больше (по 2 на каждый PIN, используемый для авторизации), в названиях есть аббревиатура DP, перечислять не буду. Есть ограничение на длину параметра, что-то около 256 или 128 символов, сейчас не могу найти точную информацию.
Следует заметить, что все коды дополнительных сервисов, сконфигурированных на устройстве, автоматически добавляются к диалплану, и их не нужно учитывать в записи параметра.
Запись последовательности цифр
Основой записи являются обозначения для записи последовательности набранных цифр. Последовательность цифр записывается с помощью нескольких обозначений:
  1. Цифры набираемые с клавиатуры телефона: 0, 1, 2, 3, ..., 9, # и *. Заметьте, что использование символа # в диалплане может блокировать завершение набора с помощью этой клавиши.
  2. Последовательность цифр, заключённая в квадратные скобки, соответствует любому из заключённых в скобки символу.
    • Пр.: ([1239]) — соответствует любой из цифр 1, 2, 3 или 9
  3. Через тире может быть указан диапазон символов. Чаще всего используется внутри квадратных скобок.
    • Пр.: (1-5) — любая цифра от 1 до 5, ([1-39]) — пример из прошлого пункта, но записанный по-другому
  4. Символ X соответствует любому числу от 0 до 9
    • Пр.: (1XX) — любой трёхзначный номер, начинающийся на 1
  5. Если после символа поставлена точка, то считается, что этот символ может быть повторён любое количество раз (больше нуля)
    • Пр.: (810X.) — международный номер, с любым количеством цифр
Настройки, влияющие на обработку диалплана
  • Interdigit Long Timer — время ожидания ввода следующей цифры в том случае если нет подходящих под набранную комбинацию шаблонов
  • Interdigit Short Timer — время ожидания ввода следующей цифры, если есть один или более подходящий шаблон
  • Enable IP Dialing — разрешает использование в диалплане также и прямых ip-адресов для набора номера, примеры ниже.
Дополнительные возможности:
  1. Замена набранной последовательности. Синтаксис: <arg1:arg2>. Возможность позволяет заменить набранную последовательность на любую последовательность набираемых символов. При этом второй аргумент должен быть указан определённым значением, оба аргумента могут быть пустыми.
    • Пр.: (<83812:> XXXXXX) — данная запись будет соответствовать набранным цифрам 83812, но эта последовательность будет опущена и передана на SIP сервер не будет.
  2. Вставка тона в набор. При выходе на межгород или, в офисных станциях, на город привычно слышать КПВ, что можно реализовать вставкой запятой в нужную позицию последовательности цифр.
    • Пр.: (8, 770) — при наборе номера 8770 после цифры 8 будет выдан непрерывный тон
  3. Запрет набора номера. Если в конце шаблона номера добавить восклицательный знак '!', то набор номеров, соответствующих шаблону будет заблокирован.
    • Пр.: (8 10X xxxxxxx ! | 8 xxx xxxxxxx ) — разрешает набор только междугородних номеров и исключает международные вызовы
  4. Замена значений таймеров набора номера. Значения таймеров могут быть назначены как для всего диалплана, так и для определённого шаблона.
  • Буква S отвечает за установку Interdigit Short Timer, а L — Interdigit Long Timer
  • Значение таймеров может быть указано для всех шаблонов в диалплане, если значение перечислены до открывающейся круглой скобки (если указано только значение короткого таймера, то обязательно должна присутствовать запятая после значение, как показано в примере). Пр.: S:4, (8XXX.) или S:4,L:8 (XXX)
  • Если эти значения указаны только в одной из последовательностей, то действуют только для неё. Так же в этом случае не надо ставить двоеточие между ключём и значением таймаута, значение может быть расположено в любом месте шаблона. Пр.: (S4 8XXX. | XXX) или ([1-5] XX S0) — вызовет мгновенную передачу вызова при наборе трехзначного номера, начинающегося на 1,2, ... , 5.
  • Так же в некоторую последовательности может быть вставлена пауза (ключ P)
Набор по прямому адресу (IP Dialing)

Символ @ поставленный после номера означает что далее будет указан адрес сервера, на который будет отправлен вызов на набранный номер. Лучше всего, если используется IP Dialing разрешить так же приём и передачу вызовов без регистрации (Call Without Reg, Answer Without Reg). Может помочь в случае отказа сервера :)
Для шлюзов SPA3102 вместо адреса может быть использовано ключевое слово gw0, тогда вызов пойдёт через PSTN линию. Адреса gw1, ... , gw4 используются для шлюзов заданных в Gateway1-4. Так же для авторизации на серверах прямо в диалплане могут быть указаны параметры usr, pwd, nat.
Кроме того формат адреса с IP Dialing может быть использован в номерах, предназначенных для переадресации звонков.
Примеры:
  • ( 8 xxx xxxxxxx ) — 11-значный номер, начинающийся на 8.
  • ( 8 xxx xxxxxxx | <:8495> xxxxxxx ) — 11-значный номер, начинающийся на 8, если введён 7-ми значный, то добавить к передаваемому номеру 8495. Очень удобно делать набор локальных номеров через SIP провайдера вроде SIPNET.
  • ( 0[123] | 8 [2-9]xx [2-9]xxxxxx ) — набор номеров экстренных служб, а так же некоторого странного набора междугородних номеров
  • ( S0 <:82125551234> ) — быстрый набор указанного номера, аналог режима хотлайн на других шлюзах
  • ( P5 <:1000> | xxxx ) — такой диал-план позволяет набрать любой номер, состоящий из цифр, а если ничего не введено в течении 5 секунд вызвать номер 1000 (пусть это будет секретарь)
  • Звонить с первой линии на вторую линию устройства: (<02:3463463@192.168.254.254:5061>). С учётом что аккаунт на второй линии 3463463, устройство настроено с использованием указанного IP адреса и номером порта на второй линии.

Transfer

Взято у IGORG, чтоб не забыть.
Оригинал


Самой важной задачей, которую выполняет АТС предприятия — принять звонок, передать необходимому сотруднику и совершить обмен информацией. Совершенно неприемлемой ситуацией является, когда звонок по какой-либо причине теряется. Лояльности это уж точно не добавит.
Одной из важнейших функций PBX является функция перевода вызова, которая, к сожалению в Asterisk работает не так, как, скажем, в традиционном для российского офиса Panasonic. В этом я убедился устанавливая Asterisk в компании на 60 человек, в которой эта функция была критична, но не работала как надо ни на адаптерах, ни на Asterisk. Решилось тогда административными мерами: человек, переводящий звонок, должен был дождаться ответа третьей стороны. Но это не решение, решение далее.
В версии 1.6 усилиями разработчиков появилась функция, позволяющая возвращать вызов сотруднику, делавшему перевод вызова, если на другой стороне вызов принят не был. При этом при возврате вызова Asterisk может сделать несколько вызовов, ведь он может уже быть занят новым разговором. Вот опции, отвечающие за работу:
  • atxferdropcall. Допустим кто-либо осуществляет перевод вызова с согласованием и ложит трубку до того как вызов соединён. Если выбрано значение «yes», то используется старое поведение — при невозможности соединить позвонившего вызов сбрасывается. Если выбрано «no», то система вернёт вызов обратно осуществлявшему transfer.
  • atxfernoanswertimeout. Таймаут, в течении которого система пытается соединиться со третей стороной. По-молчанию 15 секунд.
  • atxferloopdelay. Задержка перед повторным возвратом вызова делавшему transfer сотруднику.
  • atxfercallbackretries. Количество попыток возврата вызова, по-умолчанию 2.
Оказывается можно сделать аналогичным образом и в 1.4 с помощью только функций и переменных диал-плана. Вот пример extensions.conf:
  1. [globals]  
  2. XFERNOANSTIMEOUT=15  
  3. XFERRETRIES=2  
  4. XFERLOOPDELAY=10  
  5.   
  6. [office]  
  7. exten => _XXX,1,Set(TRANSFER_CONTEXT=office-xfer)  
  8. exten => _XXX,n,Dial(SIP/${EXTEN},,Tt)  
  9. [office-xfer]  
  10. exten => _XXX,1,Set(RETRIES=0)  
  11. exten => _XXX,n,ChanIsAvail(SIP/${EXTEN},s)  
  12. exten => _XXX,n,GotoIf($[${LEN(${AVAILCHAN})} = 0]?ret)  
  13. exten => _XXX,n,Dial(SIP/${EXTEN},${XFERNOANSTIMEOUT},Tt)  
  14. exten => _XXX,n(ret),GotoIf($[${BRIDGEPEER} = ${TRANSFERERNAME}]?(h,1))  
  15. exten => _XXX,n,Dial(SIP/${TRANSFERERNAME:4:3},${XFERNOANSTIMEOUT},Tt)  
  16. exten => _XXX,n,Set(RETRIES=$[${RETRIES}+1])  
  17. exten => _XXX,n,GotoIf($[${RETRIES} < ${XFERRETRIES}]?ret)  
  18. exten => _XXX,n,Wait(${XFERLOOPDELAY})  
  19. exten => _XXX,n,Playback(sorry)  
  20. exten => _XXX,n,Hangup()  
  21. exten => h,1,Hangup()  
Такое решение более гибко, чем настройки в features.conf, так как вы можете вместо обратного вызова припарковать клиента или отправить сообщение менеджеру на Jabber о том, что перевод вызова не удался.
В приведённом примере достаточно много шелухи, если постараться то все дополнения уместятся в три-четыре строки. Ключевым здесь является использование переменной. Вот ещё некоторые переменные, которые вы можете использовать:
  • BRIDGEPEER — переменная с именем канала, в данный момент соединённого с данным
  • BLIND_TRANSFER — переменная с именем пира, осуществившего перевод вызова в-слепую
  • TRANSFERERNAME — переменная содержащая имя канала. осуществляющего transfer (это относится только к attented transfer)
 

RHVoice установка

Требуемые пакеты: scons flite libunistring pkgconfig libsndfile libsamplerate pulseaudio и свежий gcc
Исходники берем здесь https://github.com/Olga-Yakovleva/RHVoice

Дальше все по инструкции:
https://github.com/Olga-Yakovleva/RHVoice/wiki/Building-on-Linux-%28Russian%29

scons
scons install
ldconfig

Проверка
echo "Хотите выключить свет на кухне?" | RHVoice-test -p Elena -o 1.wav




В зависимости от воспроизводимых текстов можно поиграться со скоростью воспроизведения в конфиге. Новости лучше чуть быстрее, стихи медленнее.

Озвучивает намного лучше чем Festival и Espeak.

22.10.2015

Espeak + Asterisk


Для установки Easpeak на Gentoo требуется:

emerge -pv libsndfile libsamplerate

USE="flac ao id3tag wavpack mp3rtp" CPU_FLAGS_X86="mmx sse" emerge -vp espeak

Либо тащим с http://espeak.sourceforge.net/
App для астера берем с http://asterisk-espeak.sourceforge.net/ либо http://zaf.github.io/Asterisk-eSpeak/
оно же https://github.com/zaf/Asterisk-eSpeak

Последовательность установки:
Астер, espeak, libsndfile, libsamplerate, app_espeak


Описание чего делать с espeak  чтоб он нормально говорил лежит вот тут http://archlinux.org.ru/forum/topic/8621/?page=2


Качество очень сильно проигрывает RHvoice.