среда, 31 декабря 2008 г.

FreeSWITCH, кодеки, g729

А вы в курсе, что FreeSWITCH практически единственное решение в мире открытых исходников, которое поддерживает HD кодеки?

Так недавно была добавлена поддержка кодеков Siren от компании Polycom. Была добавлена поддержка кодека celt! А кодек celt это 48 кГц - больше чем у CD записей. И это в полосе меньшей, чем у G.711 с 8 кГц. В общем жду когда эти кодеки можно будет попробовать в каком-нибудь IP-телефоне.

Хотя чего ждать? FreeSWITCH может работать как программный IP-телефон. Фактически, linux+FS это готовая программная начинка для IP-телефона с огромными возможностями. 3-way конференция? Легко, причем в HD качестве. Правда пытался присмотреться к железу, на котором можно было бы подобное собрать, и понял что ничего в этом не понимаю - большинство попадавшихся плат были для разработчиков, то есть не для использования для сборки в каких либо продуктах, и откуда берут платы производители телефонов не понимаю. Видимо они их могут сами спроектировать.

А пока я пытаюсь собрать/дописать кодек G.729. Программист на C из меня вообще никакой, так что утечки памяти гарантирую :) Исходники моего творчества лежат тут, если кто то захочет помочь - милости прощу, с радостью свалю задачу человеку, который хорошо понимает значение всех этих звездочек. Если кому то просто интересно получить рабочий кодек (не гарантирую, что стабильный) заглядывайте, смотрите на прогресс.

воскресенье, 21 декабря 2008 г.

Путешествие группы формант по голосовому тракту

Трое монтажников связи. Страдания Джорджа и Гарриса. Жертва ста семи помех. Полезные рецепты. Средство против болезней голосового тракта у монтажников. Монтажники сходятся на том, что переутомились и что им нужен отдых. Неделя в море, вдали от лапши? Джордж предлагает путешествие по реке. Монморенси выдвигает возражение, лапша недостаточно удаляется. Первоначальное предложение принято большинством трех против одного.


Аналоговая телефония



Все что нужно, чтобы связаться посредством двух телефонов - двухжильный провод и питание постоянным током (батарейка "Крона", например). Эту нехитрую истину знают монтажники связи - десятилетия у каждого из представителей доблестной профессии в сумке болтается переделанная трубка от советского дискового телефона.

То есть сама основа аналогового телефонного разговора проста - в трубке установлен угольный микрофон, под действием звуковых волн сопротивление его меняется - происходит модуляция тока. На другом конце, под действием модулированного тока, вибрирует динамик - телефонный капсюль. Первые телефонные станции реализовывали именно эту схему - телефонистка соединяла шнурами двух абонентов.

Конечно же в современных телефонах микрофон вполне может оказаться пьезоэлектрическим, телефоны осуществляют тоновый, а не импульсный набор, а значит наборный круг им не подходит, да и вообще - телефон может оказаться и не аналоговым вовсе.

В дисковых телефонах номер набирался серией импульсов, что в трубке слышалось как серия щелчков. Импульсный набор зародился во времена декадно-шаговых АТС. Импульсы с телефонного аппарата напрямую управляли процессом набора номера на станции. Декадно-шаговые АТС были первыми автоматическими телефонными станциями.

На сегодняшний день используются цифровые АТС и IP-АТС. То есть, конечно, в глухих лесах необъятной Родины можно найти и АТС декадно-шаговой системы, координатные АТС и прочие системы, но на новых объектах их не ставят, а в городах стараются заменять.

АТС в телефонном тракте на начальном этапе играла роль источника питания и коммутатора - между абонентами одной АТС соединение устанавливало одну электрическую цепь. Конечно же на качестве связи отражалось всё - скрутки, станционные приборы, наводки, тепловые токи и т.д.

Цифра


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

Понятно, что в жизни не все так гладко - возможно изменение бита или нескольких, что требует в кодировании заложить избыточность, хотя для голоса это не так критично, при низкой вероятности ошибок.

Человеческое ухо способно воспринимать звук с частотами от 20 герц до 24-25 килогерц. В соответствии с теоремой Котельникова (Найквиста) для оцифровки сигнала требуется частота выборки в два раза большая частоты сигнала. В действительности, для передачи голоса, достаточно гораздо более узкой полосы - в телефонии принята полоса от 300 Гц до 3 кГц. То есть в этой полосе располагаются основные форманты, которые наиболее значимы для различимости речи. В телефонии используется частота дискретизации (выборки) 8 кГц. При использовании 8-ми бит на один шаг получаем 64 кбит/c. В IP-телефонии кодек с такими характеристиками называется G.711.

Таким образом 64 кбит/c является стандартной скоростью передачи одного голосового канала в цифровой технике связи. С какой бы технологией вы не столкнулись - многоканальная связь, цифровая телефония, ISDN, ИКМ - везде под один голосовой канал отводится именно такая пропускная способность. Все скорости передачи в цифровой телефонии кратны 64 кбит/с и теперь вы знаете почему. Так же вам теперь понятно, почему сигнал ADSL, использующий частоты за голосовым спектром, не может быть пропущен через цифровые тракты, и обычно оканчивается на ближайшей городской АТС - телефония предполагает передачу сигнала с частотой не более 3 кГц.

Модемы и факсы также спроектированы с учетом этих фактов. Поэтому, когда в IP-телефонии используется этот же кодек (G711,64 кбит/с), факсы путешествуют через такие каналы без проблем.

Цифровые АТС работают именно с такими потоками. Если к цифровой АТС есть возможность подключить традиционные аналоговые телефоны - на входе их сигнал будет кодирован в цифровой и внутри АТС будет обрабатываться точно так же, как сигналы от цифровых телефонов.

В данной серии были изложены основы и упомянута теорема Котельникова, а Монморенси совершил подвиг, зажав зубами кабель, и спас селекторное. В следующих сериях страшные истории про кодеки, SIP и SDP, а также продолжение серии о монтажнике Джордже.

Принимаются критические замечания, в том числе и в гугл-группе freeswitch-ru.

пятница, 12 декабря 2008 г.

FreeSWITCH, факсы

Итак, кое-что о факсах. Какими бы бурными темпами ни двигался интернет в каждый дом, факс остается весьма важным средством передачи документов. В протоколах VoIP этому моменту уделено внимание, специально для факсов создан протокол T.38.

Временное отсутствие T.38 в FreeSWITCH я не считаю большой проблемой - на сегодняшний день лучше всего передаются факсы при использовании кодека G.711. T.38 будет реализован в обозримом будущем, а пока я опишу то, что уже есть.
В FreeSWITCH был добавлен модуль mod_fax. Он предоставляет две функции - txfax и rxfax. На текущий момент поддерживается протокол T.30. Пример из wiki:

<extension name="fax">
<condition field="destination_number" expression="^fax$">
<action application="answer" />
<action application="playback" data="silence_stream://2000"/>
<action application="rxfax" data="/usr/local/freeswitch/fax/${caller_id_number}-${strftime(%Y-%m-%d-%H-%M-%S)}.tiff"/>
<action application="hangup"/>
</condition>
</extension>



Обнаружение передачи факса.

FreeSWITCH предоставляет специальную функцию для обнаружения тоновых сигналов в голосовом потоке - tone_detect.

<extension name="5555555">
<condition field="destination_number" expression="^(5555555)$"/>
<action application="tone_detect" data="fax 1100 r +5000 transfer fax XML default"/>
<action application="answer"/>
<action application="sleep" data="1000"/>
<action application="ivr" data="main"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="fax">
<condition field="destination_number" expression="^fax$">
<action application="answer" />
<action application="playback" data="silence_stream://2000"/>
<action application="rxfax" data="/usr/local/freeswitch/fax/${caller_id_number}-${strftime(%Y-%m-%d-%H-%M-%S)}.tiff"/>
<action application="hangup"/>
</condition>
</extension>



А можно поставить обнаружение на всю сессию:

<!-- continue="true" - означает, что надо продолжить выполнение номерного плана после этого пункта -->
<extension name="fax_tone_detect_permanent" continue="true">
<!-- ловим любые звонки, так как .* означает любое кол-во любых символов -->
<condition field="destination_number" expression="^.*$"/>
<!-- ставим обнаружение тона 1100 со стороны звонящего(r) бесконечное время(0)
В случае обнаружения тона передаем (transfer) на обработку в "default" номерной план
с номером "fax"-->
<action application="tone_detect" data="fax 1100 r 0 transfer fax XML default"/>
</condition>
</extension>


Таким образом прием факсов в FreeSWITCH организовать достаточно легко. Надеюсь реализация T.38 не заставит себя долго ждать.

Слабым местом пока остается поддержка кодеков. Все заинтересованные уже знакомы с патентной системой США - практически все дистрибутивы в нашей стране имеют "поддержку кодеков из коробки".
G.729, G.723, AMR сейчас поддерживаются только в режиме без перекодирования. То есть использовать с этими кодеками голосовую почту, голосовые меню, запись разговоров затруднительно.

Заколдованый круг - пока FreeSWITCH не поддерживает кодеки он не очень интересен у нас. А пока он не очень интересен - кодеки реализовывать некому.