吴伟贤のBlog

Feed Rss

FreeSWITCH 1.0.6 第二章-编译安装(二)

07.20.2013, FreeSWITCH 1.0.6 第二章-编译安装(二)已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/20.html

 

Starting FreeSWITCH

运行FreeSWITCH
FreeSWITCH一旦成功编译好了,那就是时候运行它了。
Linux/Unix/OS X: 执行命令 /usr/local/freeswitch/bin/freeswitch
Windows: 执行DEBUG目录中的freeswitch.exe.
系统会开始加载,很多的消息提示会显现在屏幕上。为了方便阅读,控制台的消息是高亮颜色区分的。现在先别管那些提示消息吧,只要看你的系统是否启动,并且你来到了FreeSWITCH的控制台,我们称为命令行接口(CLI)。CLI的提醒看起来如下所示:
freeswitch@localhost>
让我们执行一些命令去检验一下系统是可用的。首先,执行version命令是检查我们安装的版本,如下:
freeswitch@localhost>version
FreeSWITCH Version 1.0.6 (exported)
下一步,执行status命令行,显示一些系统的统计信息,如下:
freeswitch@localhost>status
UP 0 years, 0 days, 0 hours, 0 minutes, 36 seconds, 839 milliseconds, 449
microseconds
0 session(s) since startup
0 session(s) 0/30
1000 session(s) max
这些都只是你将会学习FreeSWITCH中的少数的命令。输入help可以看到所有可用的命令的完整列表。最后,关闭FreeSWITCH使用这条命令:fsctl shutdown.当它关闭时,系统也会显示很多的提示信息,你将会返回到你的系统命令行(如果你是在windows资源管理器中运行的Freeswitch.exe,FreeSWITCH的CLI仅仅是关闭,不会留下系统命令行)。
Running FreeSWITCH in the background
后台运行FreeSWITCH
大多数情况下,你需要在后台运行FreeSWITCH。在Unix/Linux环境下经常叫做守护进程。
在Windows 下被称为服务service.
在UNXI/LINUX环境中以守护进程加载FreeSWITCH:
#>/usr/local/freeswitch/bin/freeswitch –nc
当系统启动时自动执行一个守护进程,不同的Linux和Unix发行版使用不同的实现方式。一些INIT脚本的示例文件可以FreeSWITCH WIKI: wiki.freeswitch.org/wiki/Freeswitch_init中获得。
查询你发行版的系统管理员手册,查找如何配置一个INIT脚本,可让系统在启动时自动加载你的FreeSWITCH。Windows下仅是需要几个步骤就可以让FreeSWITCH以服务运行。如下:
1. 打开windows的命令行(开始-〉运行->输入cmd, 回车)
2. 进入你的FreeSWITCH安装目录,如下:cd FreeSWITCH\freeswitch-1.0.6\Debug
3. 使用参数-install 运行Freeswitch.exe,如下:
 freeswitch –install FreeSWITCH
4. 最后一步是配置服务。打开服务工具,依次单击开始-〉控制面板-〉管理工具-〉服务
FreeSWITCH应该会出现在服务的列表中:
s5.png
5. 右键单击FreeSWITCH,然后点开始。服务的启动会花费一些时间。
6. 确认服务是否启动可以通过DEBUG目录中的fs_cli.exe。
7. 你将会看到一个欢迎屏幕和一个命令行界面。执行status命令,确认系统正在运行中。
8. 输入/exit 关闭fs_cli.exe程序。
现在,你已经实现windows中FreeSWITCH作为一个服务了。Fs_cli应用程序会在第9章通过外部来控制FreeSWITCH来详细讨论。
Summary
总结
在这章中,我们实现了很多目标。它们就是:
•下载和安装FreeSWITCH
•定制安装,通过修改modules.conf去编译mod_flite TTS模块(linux/unix/MAC OS X)。
•定制FreeSWITCH配置文件,通过修改modules.conf.xml文件去实现当FreeSWITCH启动时自动加载mod_flite.
•运行FreeSWITCH,执行一些命令去确认它运行中的状态。
•FreeSWITCH守护进程运行(Linux/Unix),作为服务运行(WINDOWS)。
在下面的章节中,我们会使用我们新安装去探索FreeSWITCH的默认配置。

FreeSWITCH 1.0.6 第二章-编译安装(一)

07.20.2013, FreeSWITCH 1.0.6 第二章-编译安装(一)已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/14.html

 

第二章:Building and Installation

编译和安装
FreeSWITCH 是开源的软件,简单来说就是任何人都可以获得程序的源代码,阅读,编译, mangle, 修改,或是任何你想到的。许多用户,大部分是初学者,会发现与源代码打交道是一项艰巨的任务。但请放心,我们会尽我们最大的努力让这个经历一点都不痛苦。将来,我们会为一个比较流行linux发行版添加编译好的二进制包,但暂时,我们会阐明如何手动获取和安装Freeswitch在Unix和Windows上(为了本章节的目地,称为”类UNIX”和”linux/unix”不仅仅是指unix和linux,也包含FreeBSD和Mac OSX.)如何这个过程看起来是无法战胜的请不要烦恼, 多一些耐心和运气,整个过程会很顺利的。这有些像牙根管。听说很多牙根管会在没有受力的情况下脱落,但他们错了,他们完全的错了。我们全部都是听说的这就是这个恐怖的故事来源。
在此章节中,我们会论述如何下载源码和通过源码为类UNIX操作系统安装FreeSWICH,同样还有Windows.我们会为每个操作系统介绍必要的准备工作。最后,我们会讲解如何去运行FreeSWITCH和如何在后台运行FreeSWITCH.
在这个章节中,我们会涉及以下内容:
•安装FreeSWITCH
•设置FreeSWITCH的编译环境
•下载和安装FreeSWITCH
•运行FreeSWITCH和后台进行
•我们商业的第一步是铺设地基,打好基础
Setting up the FreeSWITCH environment
构建FreeSWITCH环境
FreeSWITCH和大多数软件应用一样都需要一个适当的运行环境。
主要就是说为你的硬件选择适当的操作系统和LAN/WAN的网络连接良好以及物理环境。
Operating system
操作系统
在这里我们要考虑的第一个问题是操作系统: 我们应该使用哪一个操作系统呢?
通常来说,选择你熟悉和觉得爽的操作系统是比较好的。还有一个考虑就是32位VS64位。一些用户告知当在64位的硬件上运行32位的OS会有问题。我们强烈建议如果你有64位的硬件环境就使用64位的操作系统。
如果你更愿意用windows的话你可以选择XP,VISTA,WINDOWS7, Server 2003或server 2008.部分用户回复在发烧的硬件上成功构建一个生产环境中的通信系统,使用的就是windows server 2008.
另一方面,非常多的类UNIX操作系统可以选择,并且大多数它们是可以免费下载的。我们中的大多数都会有一个自己喜欢用的操作系统(linux,BSD,Solaris等等)和发行版(CentOS, Debian, Ubuntu等等)。FreeSWITCH的开发者不会鼓吹任何特定的操作系统或发行版。
有人问在哪个平台下运行FreeSWITCH是最好的。选择一个选择电话系统的平台要有很多的因素需要考虑。FreeSWITCH是跨平台的,因此,它可以在很多平台上被编译和运行。然而,来之不易的经验告诉我们哪一个操作系统和发行版给与我们real-time电话应用。你的底线是系统要稳定和可靠。我们的经验是在RHEL上安装或它的”堂弟”(CentOS), RHEL和CentOS提供最佳的性能和最少的故障。
有些人把RHEL和CentOS描述成“枯燥且缺乏创新”。这些品质正是运行像FreeSWITCH这样的实时电话系统所需要的。
Operating system prerequisites
系统准备工作
每个操作系统的准备工作都是不同的。请确定你看的是你系统平台的准备工作。
Linux/Unix
下面的选项通常情况下都已经安装在你的系统上了。提醒一个SVN或GIT客户端并不是必须的:
•SVN: A Subversion (SVN) client gives you access to the current code repository (recommended for those who simply want the latest code)
•Git: A Git client also gives you access to the current code repository (recommended especially for developers)
•GNUMAKE: The GNU version of make
•AUTOCONF: Version 2.60 or higher
•AUTOMAKE: Version 1.9 or higher
•LIBTOOL: Version 1.5.14 or higher
•GCC: Version 3.3 or higher
•WGET: Any recent version
•LIBNCURSES: Any recent version
Mac OS X
强烈建议Mac用户至少拥有OS X Version 10.4.
在OSX系统上编译FreeSWITCH需要安装Apple XCODE开发工具。你可以从http://connect.apple.com下载,需要注册,免费。
Windows

在windows环境上FreeSWITCH需要两个主要的要求。以下:
1. Microsoft Visual C++ 2008 (or 2008 Express Edition)
2. A fle decompression utility(解压缩工具)
在windows上编译和构建FreeSWITCH用到Microsoft Visual C++ 2008
(MSVC) 或 Visual C++ 2008 Express Edition (MSVCEE).

Express版本是免费下载的尽管同样需要注册。
下载地址http://www.microsoft.com/Express/VC
另一个对于windows环境下的必要条件是一个文件压缩工具像WinZip(www.winzip.com)或WinRAR(www.rarlab.com).另一个免费的工具可供选择7-Zip(www.7-zip.org).这些工具都会在你的windows资源管理器(Windows Explorer)右键菜单里多出一个选项。
Text editors and XML
文本编辑器和XML
与FreeSWITCH打交道你需要一个你比较习惯的文本编辑器。
不管你更喜欢哪种文本编辑器,我们强烈建议你使用一个支持XML语法高亮的。
你会发现编辑XML配置文件时开启了高亮会相对更容易些。
如果你还没有一个自己较终爱的编辑器,我们建议你在你的平台上多尝试几种。
请注意,如果你在使用一个没有GUI(图形用户接口)的linux/Unix环境的话,那么你的选择会很少。
不过,依然有几款优秀的文本编辑器:
Emacs—这个文本编辑器是在类unix环境下使用的,包括Mac OSX. 它可以高亮源代码,XML, HTML,等等。FreeSWITCH的开发小组就使用的这个编辑器(EMACS同样拥有GUI版本。)
Vi/Vim—这个文件编码器也是仅仅适用在类UNIX环境下。像EMACS一样它也是可以高亮源代码和标记型语言。(同样也有GUI版本)
Notepad++—这是一个WINDOWS环境下的图形文本编辑器。它支持高亮很多种语言和标记型语言。它是Windows上非常有用的编辑器,并且它是免费的。
Downloading the source
下载源代码
大多开源项目会把他们的源码分为两个类别:稳定版和最新版。虽然最新版本的FreeSWITCH源码通常也非常的稳定,但我们建议你开始先使用最新的稳定RELEASE版本。以后你可以更新到最新的TRUNK。(请看本章中的使用最新的源代码编译小节)另一点也要知道:你的平台可能可以使用已经编译好的版本。但它们只是特定的环境,以我们的经历,从源码编译可以很容易的排错,更新,定制你的FreeSWITCH安装过程。
请确定你的系统可以上网,因为编译的过程有时会需要下载额外的库。
源代码可以从以下的FreeSWITCH下载站中获得:
http://files.freeswitch.org.找到一个文件名为freeswitch-1.0.6.tar.gz.
下载它到一个本地目录中,然后解压。一个典型的linux操作可能看起来像下面这样:
#>cd /usr/src
#>wget http://files.freeswitch.org/freeswitch-1.0.6.tar.gz
#>tar zxvf freeswitch-1.0.6.tar.gz
这些操作创建了一个包含FreeSWITCH源代码的新目录,准备在你的系统上编译吧。(从现在开始,这个目录我们就称为FreeSWITCH的源代码目录)。
Windows用户应该创建一个新的目录然后下载源码包。本章稍后会有windows上编译FreeSWITCH的小节。
Building from the latest code
使用最新的源码编译
如果你更愿意使用最新的FreeSWITCH源码,那么你需要一个Subversion(SVN)客户端或一个Git客户端。
FreeSWITCH的开发都最近已经把开发树从subversion到Git.
不过,他们依然在维护一个只读的SVN镜像,所以你依然能通过SVN获取最新的源码。
你也可以使用Git去获取最新的源码;不过如果你是一个想提交一些代码的开发都,你需要使用GIT客户端。
大多数的linux/UNIX环境已经安装或可以很简单的安装一个SVN的客户端。
在Windows环境中,一个流行并且免费的Subversion客户端是TortoiseSVN (tortoisesvn.tigris.org). 同样也有一个TortoiseGit (code.google.com/p/tortoisegit).
在Windows环境下,编译的过程实际是相同的:打开恰当的项目文件然后编译。
在Linux/Unix环境下,在编译前要必须要先执行”bootstrap”。
不过呢,也有捷径可走。下面的命令就会下载和编译一个从SVN中下载的最新的FreeSWITCH,使用默认的配置和所有的声音文件:
#>cd /usr/src ; wget http://www.freeswitch.org/eg/Makefile ; make
#>make all
#>cd freeswitch.trunk
#>make install
#>make cd-sounds-install
#>make cd-moh-install
前面的命令可以要花费一些时间才能完成,你可以通过&&操作符把命令串连在一起使它自动完成整个过程。
Compiling FreeSWITCH for Linux/Unix/Mac OS X
在Linux/Unix/Ma OSX上编译FreeSWITCH
实际上Linux,Unix 和Mac OS X的安装过程是相同的。然而,确定你已经在你的系统上做了之前章节中列出的准备工作。
Compiling FreeSWITCH
编译FreeSWITCH
编译Freeswitch仅仅需要几步操作,它需要花费一些时间,要看你的系统运行速度。
编译FreeSWITCH的基本步骤如下:
•编辑modules.conf文件定制你默认想编译的模块
•执行configure脚本
•执行make和make install编译和安装
•编译modules.conf.xml定制默认加载哪些模块
•安装声音和音乐文件
下面是详细的手把手教你编译FreeSWITCH的说明。
Step 1: Edit modules.conf
第一步:修改modules.conf
Modules.conf 文件包含着FreeSWITCH中默认configured和编译的模块列表。默认的modules.conf文件中的模块设置是比较合乎情理的,预选择的都会编译。然而,有一个可选的模块我们将会开启它。你现在在你的源码文件夹中有一个名为Freesiwtch-x.y.x子目录,x.y.z在这里代表版本号。例如,如果最新的稳定版本是1.0.6,那么,你的freeswitch源码目录将会是/usr/src/freeswitch-1.0.6. 执行下面的步骤:
1.       进入新的FreeSWITCH源码目录
    #>cd /usr/src/freeswitch-1.0.6
2.       使用文本编译器打开modules.conf. 移动到下面的一行:
   #asr_tts/mod_flite
3.       删除这一行前面的#符号,保存退出。mod_flite模块让freeSwitch可以使用开源的TTS(文字到语音)引擎Festival Lite(Flite TTS 引擎并不具备产生特别高质量的语音合成的能力。但是,用它来进行TTS测试是非常的便捷。).
编辑完modules.conf文件后,我们就可以开始编译了。
在modules.conf中删除一行起始的#符号,则当我们执行make命令时,这一行中写的模块将会默认编译。同样的,在每一行起始添加#符号则会阻止自动编译相应的模块。
Step 2: Run configure script
步骤2:执行configure脚本
和多数的开源项目一样,类UNIX环境下FreeSWITCH也使用当下非常流行的configure脚本。
在包含FreeSWITCH的源码路径中,执行configure脚本,如下:
#>./configure
Configure脚本会执行很多任务,包括确保准备工作已经完毕。如果编译前的准备工作没有做好,configure 脚本会退出并且告诉你哪一个依赖没有正确添加。如果有错误发生,你必须先解决提示的问题,并且重新运行configure脚本。在执行configure脚本前,你应该确保所有的准备工作都已经到位,configure会正常完成。
在执行配置的过程中,你会看到它会configure会执行很多次。
FreeSWITCH使用了很多的库像apache Portable Runtime(APR)和Perl Compatible Regular Expressions(PCRE)。这些库都有自己特定的根据自身项目需要定义的configure脚本。
等待一些时间configure脚本完成,它会显示系统的提示信息。你肯定会在系统configuration的过程中在屏幕上看到很多的输出内容,但如果你没有看到任何的错误,你就可以进行编译的过程了。
Step 3: Run make and make install
步骤3:执行make和make install
上一步的configuration过程实际是生成了FreeSWITCH的Makefile, 以及它依赖的库和它自己一系列的模块的Makefile。 编译和安装FreeSWITCH都是由make来进行的。首先执行make,然后再执行make install. 大多数都会合二为一的执行命令,看起来像这样:
#>make && make install
和configure脚本一样,make 的过程会花费一些时间,中间有错误会停止。通常情况下不会出错误,编译和安装的最后你会看到下面的欢迎信息:
+——– FreeSWITCH install Complete ———-+
+ FreeSWITCH has been successfully installed.   +
+                                               +
+       Install sounds:                         +
+       (uhd-sounds includes hd-sounds, sounds) +
+       (hd-sounds includes sounds)             +
+       ————————————    +
+               make cd-sounds-install          +
+               make cd-moh-install             +
+                                               +
+               make uhd-sounds-install         +
+               make uhd-moh-install            +
+                                               +
+               make hd-sounds-install          +
+               make hd-moh-install             +
+                                               +
+               make sounds-install             +
+               make moh-install                +
+                                               +
+       Install non english sounds:             +
+       replace XX with language                +
+       (ru : Russian)                          +
+       ————————————    +
+               make cd-sounds-XX-install       +
+               make uhd-sounds-XX-install      +
+               make hd-sounds-XX-install       +
+               make sounds-XX-install          +
+                                               +
+       Upgrade to latest:                      +
+       ———————————-      +
+               make current                    +
+                                               +
+       Rebuild all:                            +
+       ———————————-      +
+               make sure                       +
+                                               +
+       Install/Re-install default config:      +
+       ———————————-      +
+               make samples                    +
+                                               +
+                                               +
+       Additional resources:                   +
+       ———————————-      +
+       http://www.freeswitch.org               +
+       http://wiki.freeswitch.org              +
+       http://jira.freeswitch.org              +
+       http://lists.freeswitch.org             +
+                                               +
+       irc.freenode.net / #freeswitch          +
+                                               +
+———————————————–+
如果你看到了类似的消息,那么你已经成功的编译了FreeSWITCH, 你可以执行下面的步骤了。如果在编译过程中发生了错误,过程会停止并且报告提示错误。如果错误信息是不常见的,你需要通过附件A(The FreeSWITCH Online Community)中的资源去联系FreeSWITCH的社区。
Step 4: Edit modules.conf.xml
步骤4:修改modules.conf.xml
modules.conf.xml 文件包含FreeSWITCH运行时默认加载的模块列表。默认的modules.conf.xml文件中的内容是和modules.conf的内容一致的。模块通过modules.conf默认编译同样默认开启通过modules.conf.xml文件。因为我们在modules.conf中开启了mod_flite的默认编译,所以我们需要在modules.conf.xml中启用mod_flite,以便在FreeSWITCH启动时它就会被默认加载。一般来说,任何模块,你需要它在FreeSWITCH启动时加载,你都必须在modules.conf.xml中开启。module.conf.xml文件位于conf/autoload_configs子目录中。默认的配置路径是/usr/local/freeswitch/conf/autoload_configs/modules.conf.xml。
使用文本编辑器打开,然后在文件快结束的地方找到下面的一行:
<!– <load module=”mod_flite”/> –>
去除<!–和 –> 标签,那么这句话就看起来像这样:
<load module=”mod_flite”/>
保存和退出。你差不多已经准备好可以运行FreeSWITCH了。
modules.conf和mofules.conf.xml文件之间的区别是什么呢?modules.conf文件存在于源码路径中,它是用来决定执行make命令时哪些FreeSWITCH模块将会被编译。Modules.conf.xml文件是默认的XML配置中的一部分,它存在于FreeSWITCH的autoload_configs子目录中。它控制当FreeSWITCH启动时哪些模块被加载。
Step 5: Install sound and music files
步骤5:安装声音和音乐文件
Sound和music文件并不是一定需要。然后,强烈建立安装它们。如果你不装它们,通话操持时你会没有音乐,示例IVR和语音邮件应用也会没有声音。FreeSWITCH有不同的采样率的示例声音,音乐文件。我们建议全部安装以便于你在有些可能的条件下得到高质量的声音连接。
安装sound文件只需要在FreeSWITCH的源码目录中执行下面命令:
#>make cd-sounds-install
安装music文件执行下面的命令:
#>make cd-moh-install
这些命令会下载和安装8kHz,16kHz,32kHz和48kHz的声音和音乐文件。当给一个呼叫者播放一个声音或音乐文件时,FreeSWITCH会使用相应的采样率(sampling rate)。
Compiling FreeSWITCH for Windows
Windows上编译FreeSWITCH
在系统准备工作章节中提到,FreeSWITCH使用MSVC或MSVCEE编译。目前的步骤是使用Express Edition版,但是,使用标准版本的步骤也是大致相同的。
Building the solution with MSVC/MSVCEE
使用MSV/MSVCEE编译项目
在使用MSVC编译前,有几个小步骤是要先做的,那就是:
1. 创建一个新的目录,然后拷贝tar.gz的文件到它里面。在我们的示例中,我们使用的是
C:\FreeSWITCH\freeswitch-1.0.6.tar.gz.
2. 右击freeswitch-1.0.6.tar.gz,使用你的解压工具解压文件。现在你会得到一个新的名为freeswitch-1.0.6.tar的文件。
3. 右击freeswitch-1.0.6.tar 再次解压。这个过程会花费一些时间。你会看到一个和下面截图相似的一个窗口:
ssss1.png
备注:WinRAR可以一步同时解压.gz和.tar文件。
1.       解压成功后,你会得到一个新的后面包含FreeSWITCH最新版本的子文件夹。在我们例子中,我们现在拥有一个名为freeswitch-1.0.6的子文件夹。双击进入文件夹查看完整的Freeswitch 源码结构。屏幕看起来应该和下面的截图相似:
s2.png
5. 文件夹中有不少的文件,我们只需要关注其中的两个项目文件。MSVC的项目文件是Freeswitch.2008.sln,MSVCEE的项目文件是Freeswitch.2008.experess.sln. 根据你的MSVC版本双击打开相应的项目文件。示例中的截图是使用的MSVC2008 Express Edition. 不过,标准版和专业版看起来也大致相同。
6. 项目文件加载后,单击 Build -> Build Solution 或 按F7。项目会开始编译。Output窗口会出现很多的信息。当项目编译完后,你会在Output窗口的底部看到一个像下面截图中那样的提示:
s3.png
7. 备注:MSVC/EE项目文件会自动执行有些我们在Linux/Unix安装过程中手动执行的一些步骤。包括下载所有的声音和音乐文件,还有编译可选的模块像Flite(text-to-speech)和PocketSphinx(speech recognition). 但是,如果你希望这些可选的模块自动加载,你需要在modules.conf.xml文件中开启。
8. 项目一旦编译完成,你就可以关闭MSVC了。所有剩下的步骤都可以从Windows资源管理器和windows命令行中执行。
9. 再次来到Windows资源管理器中。你会发现编译过程中已经创建了一个新的名为DEBUG的文件夹。这就是FreeSWITCH的安装目录。在运行FreeSWITCH前的最后一步是编辑modules.conf.xml文件让FreeSWTICH启动中自动加载mod_flite模块。在本书中的很多的示例中我们会用到mod_flite(TTS)引擎。
10. 双击conf目录,然后再双击autoload_configs目录。
11. 使用编辑器打开modules.conf.xml。在我们的例子中,我们使用Notepad++编辑,如下图所示:
s4.png
12. 找到靠近文件结尾的下面一行:
<!– <load module=”mod_flite”/> –>
删除<!—和–>标签,让它看起来像这样:
<load module=”mod_flite”/>
保存退出编辑器。现在你已经准备好可以第一次运行FreeSWITCH了。

FreeSWITCH 1.0.6 第一章-FreeSWITCH架构(一)

07.20.2013, FreeSWITCH 1.0.6 第一章-FreeSWITCH架构(一)已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/7.html

Architecture  of  FreeSWITCH

                                                 Freeswitch的架构
欢迎来到FreeSWITCH! 如果你正读到此,那么无可置疑你对VOIP和电信行业很感兴趣。
FreeSWITCH 是一个在电信通讯技术革命中起到革命性软件。在看这个强大的软件的架构前,我们先瞧一瞧有趣的电信技术。这对我们深入了解FreeSWITCH会有帮助。
在此章节,我们将会了解:
• 一场电信业的革命
• FreeSWITCH的特性
• 终端和拨号模块
• FreeSWITCH是怎么简化像语音留言这样复杂的应用的
一场革命已经开始,秘密已被揭开
对于大多数人来说,电话的工作原理是比较神秘的。它的工作原理被保守为秘密已经许多年了。我们仅仅是把我们的电话插到墙上的电话口里,然后它们正常使用了。大多数人仅仅这样做,然后期待它们工作正常。不过电信界的革命已经开始了,我们已经开始去解开这个电信业遗留的最关键秘密。现在,像你我这样的普通人都有能力去创建比传统电信系统更好,同时可以以相对较低的价格提供高级功能的电话系统。不少人已经将FreeSWITCH用于商业电话系统,获取利润。FreeSWITCH已经把这一切变得更加的容易了,所以我们要看一下它的架构,更好的理解它是如何工作的。
如果这些概念听起来很晦涩难懂和抽象,不要担心和丧气,学习电话技术,特别是VOIP,可不是一朝一夕的事情,其实,我们建议你多读几遍本章节。在你看第一遍的时候尽可能多的理解与吸收,然后当你读完了第五章后再重复温习一遍,理解了XML的拨号方案,你会惊讶的发现你对VOIP和FreeSWITCH的理解将会大大的提升。当你读完第9章节的内容后再来略读它第三遍,通过外部命令来控制FreeSWITCH, 在那时,你将会有一个深刻地领会到VOIP和FreeSWITCH的概念。给自己一个充足的时间去消化这些陌生的新概念。然后你就会发现你已经是一个非常牛的FreeSWITCH管理员。如果你不气馁,你会对这个陌生而美妙的电话世界有一个有意义的认知。电话和电话系统都是非常复杂难理解的,并且经过多年的发展,通讯变来越来越多样化。
在美国和英国最流行的电话当属传统模拟电话,我们也叫它 POTS lines 或 纯粹老的电话服务(Plain Old Telephone Service)。大多数我们今天使用的电话,从传统的Ma Bell电话到移动无线电话,同样一件事被掩盖--那就是他们背后的技术。在最近的10到15年间,电脑和电话的技术交汇点,催生出了一对儿与POTS line通讯的便宜方案—–移动电话和VOIP 电话(也叫网络电话)。
FreeSWITCH 将多种电话通讯技术桥接在一起来适应如此混杂的通讯方案。所以,我们可以无障碍的沟通,尽管这些通讯技术间不兼容,FreeSWITCH还可以桥接电话到你自己写的电脑程序上去,然后用从未发生过的方式来响应。FreeSWITCH 是一个可以运行在Windows和多种UNIX上,如Mac OSX,linux,solaris和BSD上的软件。这表示无论是你的家庭PC和高端的服务器,你都可以安装FreeSWITCH和使用FreeSWITCH处理电话呼叫。
关于如何安装FreeSWITCH我们将会在第二章节进行详细的讨论,编译和安装。我们了解完了基础的架构后,我们就会立即进行安装。
 
 
 
 
 
FreeSWITCH的设计:模块化,可扩展,稳定
FreeSWITCH的设计目标是提供一个围绕在switching核心的模块化,可扩展,并且为开发人员提供用来添加和控制系统的健全接口的通讯系统。FreeSWITCH中的每一个分子都是彼此独立,同时不需要了解其他部分是如何工作,此外,每个分子所提供的我们叫作“裸露功能”。
FreeSWITCH的功能同样可以使用加载模块进行扩展,一种可以绑定外部功能到核心的特殊技术。
FreeSWITCH 拥有很多不同的模块类型围绕在中央核心,比较像行星围绕着恒星公转一样。列表如下:
Module Type:
模块类型:
Purpose:
作用:
终端
电话协议像SIP.H.323和POTS lines。
拨号方案
分析通话详细信息和决定将通话路由到哪里
编码
音频格式之间的转换
应用
执行一个任务,像播放声音或设置数据
应用程序接口
(API)
导出一个接受text参数同时也返回text内容的函数,这种函数可以供跨模块或使用外部连接调用的函数。
文件
提供一个接口来提取和播放各种格式的音频文件的声音
(TTS) 文本到语音转换
文本到语音引擎的接口。
自动语音识别ASR
语音识别系统的接口。
目录
连接目录信息服务到通用核心查找API,如LDAP。
Chat
桥接和交换多种聊天协议
Say
使用多种语言将语音文件串联,提供反馈播放像电话号码,时间,拼写单词,等等。

 

如图ssss.png

 

通过各个模块接口的功能相结合,FreeSWITCH可以配置连接IP电话,POSTS lines和基于IP的电话服务。它也可以转换音频格式和你可以自己创建带自定义菜单系统的接口。你甚至可以从其他的机器上来控制一台正在运行中的Freeswitch 服务器。让我们从一个使用很广泛的模块终端模块来开始更进一步的观察。
Important modules: Endpoint and Dialplan
重要模块:终端和拨号方案
终端模块是极为重要的,添加了一些使FreeSWITCH变成现在强大平台的关键性的功能。
终端模块扮演的主要角色是添加通用的通信技术,然后将他们初始化成一个 我们叫做session的抽象实体。一个Session代表一个FreeSWITCH的和特定的协议之间的连接。目前FreeSWITCH拥有好些个终端模块,已经实现了像SIP,H323,GTALK以及其他的通信协议。我们将会花一些时间去了解freeswitch中一个比较常用叫mod_sofia的模块。Sofia-SIP(http://sofia-sip.sourceforge.net)是一个由诺基亚(NOKIA)赞助的开源项目。这个项目的设计之初是为会话发始协议也叫SIP做一个程序接口。我们在FreeSWITCH中的mod_sofia模块中使用了这个库。mod_sofia模块注册了所有在FreeSWITCH中创建模块的必要 Hook. 同时互相转换FreeSWITCH结构和SIP结构。模块的配置信息取自FreeSWITCH的中心配置文件,允许mod_sofia加载用户定义的参数和详细连接信息。这样FreeSWITCH 就可以接受SIP电话设备的注册,注册到其他的SIP服务,发送通知,以及提供像语言留言这样的服务。当一个SIP呼叫已经建立在FreeSWITCH与另一个SIP设备之间,它会在FreeSWITCH中显示为一个活动中的会话。如果有电话打进来,可以将呼叫转移或格拉到IVR菜单,保持音乐,一个或多个分机,有许多其它的选择可用。让我们来看一个典型的场景,当一个已经注册的SIP电话分机2000呼叫分机2001,希望建立一个呼叫。首先,SIP电话通过网络发送一个呼叫建立消息(INVITE)到mod_sofia(mod_sofia 正在侦听等待这类的消息).收到消息后,mod_sofia 模块分析有关细节,同时将呼叫转入到FreeSWITCH的核心状态机。下一步是寻找拨号方案模块,依据配置内容进行呼叫终端。默认及最常用的拨号文案模块是XML 拨号方案模块。XML拨号方案模块设计用来从freeswitch的中央XML注册表中读取指令列表。XML拨号方案模块使用 正则表达式 匹配来 解析一系列的XML扩展对象。
当我们呼叫2001时,我们希望找到一个XML extension 测试其destination_number字段是否匹配“2001”,然后再使用相应的规则进行路由(route);拨号方案并不是限制仅匹配一个extension.
其实,在第五章,理解XML拨号方案,你将会得到extension的更详细的定义。XML拨号方案为每一个通话创建了一种“task list”, 每一个可以匹配的extension中的action都将会添加到通话的“task list”。假设FreeSWITCH至少找到一个extension符合通话,XML Diaplan 将会插入一些尝试把通话连接到2001的一些说明到会话对象。一旦这些instructions被插入到会话中,通话的状态由ROUTING转到EXECUTE状态,EXECUTE从列表中找下一个handler drill同时执行由ROUTING状态获得的instructions。This is where the application interface comes into the picture.
每一个添加到session的instruction都使用包含 应用名称和一个将要传到应用的数据参数.
在例子中我们要用的应用是bridge.这个应用的目的是创建一个session和另一个出站连接(outbound connection), 然后连接这两个session,开启语音交流。
我们提供给bridge的参数是user/2001, 一个很简单的方式生成一个呼叫分机2001的通话。
一个2001拨号规则的条目可以看起来像这样:
<extension name=”example”>
<condition field=”destination_number” expression=”^2001$”>
<action application=”bridge” data=”user/2001″/>
</condition>
</extension>
Extension的名字是”example”,它只有一个条件可以匹配。
如果条件被匹配,它只有一个应用去执行。
用白话来说,刚才提到的extension,可以这样表达:如果 主叫 拨打了2001,然后在主叫和对端(一个电话)2001确立一个连接。思考一下这是怎样发生的。
一旦我们插入instructions到一个session, 它的状态就会从切换到EXECUTE, FreeSWITCH的核心将会使用收集到的数据执行想要的行为.首先, 默认执行的将会是解析命令以便于执行bridge 到 user/2001, 然后它会寻找bridge应用, 然后传送参数 user/2001 到bridge 应用中.FreeSWTICH的核心将会建立一个所需类型的outbound session.用户2001也是一个SIP电话, 所以user/2001将会解析到一个SIP的拨号字符串, 它将用来传送到mod_sofia 去请求mod_sofia去创建一个新的outbound session.
如果新的session建立成功, 现在FreeSWTICH核心中会有两个session.
Bridge应用将会取得新的session和原来的session(主叫的电话), 然后在它们之间执行bridge function.
这样只要分机2001的人实际上接听了电话, 双向的语音流就可以传输了.
如果用户无法接听或繁忙, 一个超时(这表示一个失败)将会产生,同时发送对应的MESSAGE到主叫的电话.
如果电话未接通或分机繁忙, 很多的 routing 选项是可选择的, 像呼叫转移或语音邮箱.
所有的一切都由一个简单的动作产生—拿起电话听筒然后拨打2001.
FreeSWTICH拥有复杂的SIP协议的全部, 同时把它的复杂性减少到了一个common denominator.
From there, 它通过允许我们来配置一个简单的指令到拨号规则实现连接电话2000到电话2001来进一步降低复杂度.
如果我们想让2001电话能拨打电话2000, 我们可以添加另一个相反的条目到拨号方案.
<extension name=”example 2″>
 <condition field=”destination_number” expression=”^2000$”>
    <action application=”bridge” data=”user/2000/”>
 </condition>
</extension>
在这个情景中, 终端模块把SIP转换为FreeSWTICH的session, 拨号方案模块转换XML为extension.
Bridge应用把创建一个outbound call 和连接音频的复杂代码转换为一个简单的 应用/参数 对。
无论是拨号方案模块和应用模块接口的设计都是围绕在通用的FreeSWITCH sessions.
因此, 抽象不仅仅使用户级别更加简单,同时它也简化了应用和拨号方案的设计,因为they can be made agnostic of the actual endpoint technology involved in the call.
就是因为这种抽象, 当我们明天添加一个新的模块为一些其它协议像Skype(顺便说一下,也确实有一个这样的存在),我们可以再使用相同的应用和拨号方案模块。相同的理论适用与Say, ASR, TTS等其他模块。
如果你想让一些由终端的原生协议提供的一些特有的数据变的可用,这也是可能的。
举个例子,在SIP中有几个特有的协议头以及SIP包中一些有趣数据。
我们通过向channel中添加变量去解决这个问题。使用channel变量,mod_sofia可以设置它独有的值,,在你的拨号方案和应用中你可以通过名字从channel重新取得这些值。这样, 我们分享我们对于这些特殊变量的理解通过SIP终端。然而, FreeSWITCH的核心仅仅把它们当作是专用的channel变量,这些核心并不关心。也有一些保留的channel变量,它们可以影响FreeSWITCH的行为通过很多有的趣的方式。如果你使用过一种脚本语言,或使用变量的配置文件引擎, 那么有助于你的理解,因为channel变量和它们的概念非常的相似。一个简单的变量名和一个值传到了channel中,数值就被设定了。甚至有一个应用接口专门为此: SET应用允许你通过diaplan来设置你自己的变量。
<extension name=”example 3”>
 <condition field=”destination_number” expression=”^2000$”>
    <action application=”set” data=”foo=bar”/>
    <action application=”bridge” data=”user/2000”/>
 </condition>
</extension>
上面的示例和上一个例子几乎相同, 但是并没有直接进行了呼叫,我们先设置了一个名为foo值为bar的变量。这个变量将会自始至终存在于这个通话中,在通话结束时的详细记录中也会被提及。
我们把事情分的越细,越多的相同的底层资源就可以被复用, 使系统可以简单地使用。
例如, 编码接口除了关心它的编码解码世界,对核心一无无知。一旦一个可用的编码模块已经被写成, 它就可以被任何终端使用,在它的音频流中使用这个编码。这表明如果我们把一个 文字-到-语音 模块工作正常,我们可以生成合成的语音在任何,所有FreeSWITCH支持的模块。 这不需要关心哪一个模块先被添加,互相也不需要更改些什么。TTS模块因它可以使用更多的编码更变得更有用;编码变得更有用,因为我们利用它们添加了一个新的功能。同样的想法用于用 应用模块。如果我们写了一个新的应用模块,已经存在终端可以立即执行和使用那个应用。
Complex applications made simple
复杂的应用简单化
FreeSWITCH降低了许多高级应用的复杂性。让我们来看一下更复杂的应用中的两个示例。
Voicemail语音邮件
第一个我们要讨论的模块就是语音邮件应用。这个模块的作用是很容易猜到。它提供语音留言服务。在通话不能正常接通的情况下,这个应用作为第二个选择是很有用的。我们可以使用一个精心的组合去实现这个应用选择,这两个中的某一个新奇的变量,我们已经了解过了。
让我们来看一下最后的一个extension. 它允许我们留下一个口讯
<extension name=”example 4”>
 <condition field=”destination_number” expression=”^2000$”>
    <action application=”set” data=”hangup_after_bridge=true”/>
    <action application=”bridge” data=”user/2000”/>
    <action application=”voicemail” data=”default ${domain} 2000”/>
 </condition>
</extension>
这里我们看到了channel 变量的两种用法。首先,我们设置了 hangup_after_bridge=true 告诉系统,一旦我们至少成功bridge一个通话到另一个电话则挂断,忽视其余的指令。
你已经看到了,我们也通过以美元符号做前缀括号使用了domain变量,${domain}. 这个特殊的变量默认是所有的电话配置文件中的自动配置的域名。在例子中,我们检查如果有人正在拨打2000,我们尝试去bridge注册在分机2000的电话。如果呼叫失败或对方正忙,我们会执行下一个指令,也就是进入语言留言应用。我们提供了一些应用需要的一些信息,哪一个分机要进入语音邮件,所以语音邮件应用知道在这种情形下怎么去处理。下一步, 语音邮件应用播放预先录制的问候语或使用我们刚才简短的讨论过的SAY模块接口去生成一个问候语。SAY模块串连一些语音文件去生成一个语音说:“分机2000的人现在没空,请留下您的口信”。然后,mod_voicemail 提醒你去录下你的留言,现在是你的选择是否通过留下一个口信来留下你的标记在那个人的收件箱里。还有一个附加的功能,如果你对你的录音不太满意,你可以重复录音多次,直到你满意。一旦你最终提交了口信,一个FreeSWITCH的 MESSAGE_WAITING 事件被触发到核心的事件系统,它被mod_sofia作为一个实现事件接收器的方式,就是把事件信息转换为SIP。如果一切都能如计划一样进行,注册在分机2000的电话将会点亮它的消息提醒灯。
再回到这个例子中来,除了表面我们能看到的怎么去播放一个问候语,录下一条留言,然后发送它到用户那里,我们也揭开了另一个没有被歌颂的英雄--事件系统。
FreeSWITCH的事件系统不是一个像其它例子中那样的模块化接口,它是一个核心引擎,你可以用它来侦听特定命令的消息,然后当事件被收到时根据你的需要来进行响应。换句话说,整个FreeSWITCH的核心,都是事件的发来和接收。
模块可以侦听很多消息,当然也可以”fire”消息到 core engine(事件引擎)中,其它的模块可以侦听这些消息。如我们讨论的那样,sofia SIP模块侦听和订阅 指定的事件 为获取MESSAGE_WAITING 信息。这样就允许我们的mod_voicemail 模块和mod_sofia模块进行交互,互相不需要拥有任何了解关于对方的存在。事件由mod_voicemail触发,由mod_sofia接收然后转换事件到合适的SIP消息—一切看起来是神奇的,人性化的事件系统。当考虑到所有的需要被支持的语言以及如何自动化的播放文件和把它们串连起来,还有好几个难点在这样一个复杂的交互式的系统中。Say模块提供了一个很好的方式能把语音文件串连起来,但在有些情况,如说一个单词,计算或说一个特定的日期,它就显得不足了。我们克服这个困难通过在Say模块的上层定义了一个更复杂的层—宏片(Phrase Macros).宏片是一个XML语法的集合,它通过正则表达式匹配来组建一个参数列表和执行一串命令。这和XML 的diaplan工作原理非常相似,只有量身定制的交互式语音应答方案系统(IVR)。例如,当mod_voicemail请求你录下留言, 不是编码文件的字符串去例say去说的,而是仅仅调用 宏片(Phrase Macro) voicemail_record_message.这个特定的字符串在mod_voicemail和 宏片 间共享,允许我们和用户去编辑文件而不用任何奇特的编程。
<macro name=”voicemail_record_message”>
 <input pattern=”^(.*)$”>
    <match>
      <action function=”play-file” data=”voicemail/vm_record_message.wav”/>
    </match>
 </input>
</macro>
当mod_voicemail 执行宏voicemail_record_message的时候,它首先对pattern进行匹配,在这个例子中是匹配所有,因为这个特别的宏没有输入。
如果宏有输入的话,pattern匹配根据不同的输入可以用来执行不行的动作。 一旦寻找到一个匹配,被匹配的参数就被解析成XML标签就像我们的dialplan例子。
这个宏仅仅是播放文件vm_record_message.wav, 但是更复杂的宏,像那个验证你的录音或告诉你的语音收件箱里有几封语音留言的宏,他们可能需要使用许多次say模块和播放声音文件。宏短语会详细的讨论在第6章-使用内置的XML IVR引擎,然后更广范的使用在第7章节-使用LUA建立IVR应用。
再说一次,我们让phrase系统,声音文件和SAY模块,由系统加载在一起使他们协作可以提供强大的功能。Say模块是专门为一种特定语言或某中语言的声音所开发的。我们可以通过编程来请求说一个特定的时间和根据输入的变量来翻译这个时间到合适的say模块。Phrase Macro 系统是一个很伟大的方式去在你的代码中加入更大的变量概念,这样可以让普通用户非常容易的调整.
例如,如果我们想要建立一个轻量级的IVR,请求用户输入一个4位的号码然后把它读出来后挂断通话,我们可以建立一个宏叫“myapp_ask_for_digits”和另一个宏叫“myapp_read_digits”。
在我们的代码中,我们可以用过名字来执行这些宏--当是时候请求数字的时候执行第一个,另一个去读回我们输入后传入的数字。一旦这些就位,一个无经验的个人就有能力实现通过XML文件去播放适当的声音。他/她可以使用say模块去读出输入的数字,并且支持多种语言而不需要再进行编码。Voicemail仅仅是FreeSWITCH作为一个应用服务器使用的例子。当我们使用FreeSWITCH连接电话和电脑时,一切皆有可能!
Multi-party conferencing
多方会议
FreeSWITCH的另一个非常受欢迎的功能是由mod_conference模块提供的会议功能。mod_conderence模块提供动态的会议室,会议室可以将好几个不同的语音通道桥接在一起。
这样可以用来支持会议,当有好几个呼叫者想互相沟通在同一个通话中。每一个新的session连接到相同的会议室时将会互相连接,并且可以立即在相同的时间向与会的所有成员聊天。通用一个Diaplan的示例,和brigde到其他的电话一样,我们可以使一个分机加入一个会议室:
<extension name=”example 4”>
 <condition field=”destination_number” expression=”^3000$”>
    <action application=”conference” data=”3000@default”/>
 </condition>
</extension>
这和连接一通电话很像,但是在这个extension中特别地是很多的主叫者都可以呼叫3000去加入相同的会议室。如果三个人加入了这个会议,其中的一个决定离开,其它的两个人依然可以继续他们的会议。这个会议模块还有一个特别的功能,像可以播放声音文件或TTS,甚至只是一个单个成员会议。
你可能已经猜到了,我们可以通过TTS和声音文件接口他们各自的模块去提供这些功能。再说一遍,
the smaller pieces组合在一起可以不需要清楚的了解系统中其它组件去扩展功能。
会议模块通过一个叫做自定义事件(custom events)的方式去使用事件系统。像mod_conference这样的模块在它被加载的时候可以保留一个特殊的事件命名空间的子集。当我们关心的事件发生,像一个成员加入或离开了会议,它触发这类CUSTOM的事件到核心中。当我们对接收这类的事件很感兴趣时,所有我们需要做的是仅仅是订阅这个CUSTOM事件,提供一个额外的子集字符标识,这个标识用来指定哪一种CUSTOM的事件我们希望接收。在这个例子中,这是conference::maintenance.这样就使获取到重要的事件,像有人加入或离开会议,开始和结束讲话,变成了可能。会议将会在在第10章,高级应用和加深阅读,进行详细的讨论。

FreeSWITCH 编码协商

07.20.2013, FreeSWITCH 编码协商已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/113.html

 

编码协商

介绍:
编码协商是一个比较令人困惑的主题. 如果你不熟悉SDP(会话描述协议),那么就更加多了一层神秘的面纱. 如果你对编码协商不太熟悉(或你对你所读到的和经历的有些困惑), 下面的这个简短的介绍也许对你有些许帮助.

首先, 当我们谈编码协商时是在谈什么?  我们在讨论通话中的每一个leg选择使用哪个编码的过程. FreeSWITCH支持很多种编码.大部分的SIP终端也是支持多种编码的. 每一个leg只能使用一种编码, 所以编码协商的过程中会进行筛选和选择要使用的一个编码.正是这个筛选过程会导致混淆. 这个过程是如何工作的? 如何才能对它进行修改?  本章内容就是帮你来解决这些疑惑.

FreeSWITCH的编码协商

FreeSWITCH支持编码协商的两种模式: 早期(early)延后(late).

早期协商  就表示, FreeSWITCH和终端间的编码协商越早越好, 甚至早于FreeSWITCH发送媒体前(像振铃)或接通呼叫. 早期协商在一通电话还没有进入拨号方案前就进行.

延后协商  表示直到进入到拨号方案中再进行协商, 这样就有更多的信息可以收集. 这些额外的信息可以用于影响协商过程. 让我们演示早期协商和延后协商的区别.

假设有这个环境:

—-   Alice的电话支持G722和PCMU
—-   Bob的电话支持 PCMU和PCMA
—-   FreeSWITCH 的outbound “codec prefs” 是 G722, G722.1,PCMU,PCMA,G729
(这个是FS在外呼时携带的编码列表)

看看下面的这两个呼叫流程. 瞧瞧你是否能搞懂何时A Leg进行协商:

Early Negotiation(早期协商)

Alice(A) 拨打 Bob(B)

A 呼叫FS, 提供两种编码: G722和PCMU
FS看到这两个编码后, 立即为A leg 选择G722编码
FS呼叫B, 提供G722, G722.1, PCMU,PCMA,G729
B看到这些编码后, 选择了PCMU
FS接通A和B
FS会在G722和PCMU之间进行转码

延后协商, 同时设置了 inherit codec 

Alice(A) 拨打 Bob(B)

A 呼叫FS, 提供两种编码: G722和PCMU
FS看到这两个编码后, 并不会立即选择一个.
FS呼叫B, 提供G722和PCMU两种编码
B看到这两种编码后选择PCMU
FS现在为A leg选择PCMU
FS 接通A和B
A和B使用PCMU进行通讯(没有额外的编解码)

注意, 不同点就是在于何时决定A leg的编码.当使用早期协商时,FreeSWITCH会立即选择一个codec(G722). 它并不会关心外呼的leg(B leg). 所以A leg  就使用G722. 在决定好Aleg使用的编码后, FreeSWITCH 将通话进到拨号方案中, 当然最终会使用bridge到bob的电话. 要桥接呼叫, FreeSWITCH呼叫B leg然后提供一个比较大的编码列表. 这个列表就是FreeSWITCH的”outbound codec prefs”.(这个列表可以自己定义, 后面再说这个.)  Bob的电话看到了所有的编码, 然后选择了第一个匹配的, 在这个案例中是PCMU. 此时两个leg都协商完毕:

A leg使用G722
B leg 使用PCMU

只要Bob的电话返回一个回铃信号, 两个leg就桥接到一起了. FreeSWITCH需要在G722和PCMU之间进行转码. 平常这没啥问题, 你更希望两个电话使用相同的编码, 这样会降低CPU的使用. 这就是为什么 延后协商 要出现.

正如你能看到的, 当FreeSWITCH不知道B leg的编码时设置A leg的编码, 那么就容易让两端不匹配.  编码不匹配并不总是个坏事, 但很多情况下两个leg使用相同的编码是比较好的, 省资源嘛. 使用 延后协商和一个叫”继承编码”的技术, 我们可以强制A leg使用和B leg一样的编码.  (这个实现过程会在其他的细节中讲述, 在这里,我们先只说说这个基本的概念).

在我们的第二个呼叫流程示例中, FreeSWITCH得到了A leg后并不立即协商出个编码.  取而代之的是, FreeSWITCH在A leg执行完拨号方案前并不会进行协商编码.  在这个示例中, 拨号方案最后会bridge到bob的电话. 在bridge的过程中, FreeSWITCH和bob的电话协商出了一个编码—在这个示例中是PCMU. 一旦在B leg上协商出了编码, FreeSWITCH 返回给Alice的电话, 通知它应该使用PCMU编码. 现在, 两个leg中都使用相同的编码, 这正是我们想要的.

这就是 早期协商和延后协商的不同. 只需要记住这一点: 仅仅开启 延后协商 并不会自动强制A leg 继承 B leg 的编码.  开启延后协商仅是允许使用 “继承编码” 作为编码协商的一种方法. 延后协商还允许其他的一些编码协商的策略. 继续阅读下文了解FreeSWITCH中编码协商的更具体介绍.

 

Early Negotiation parameters
早期协商的参数

disable-transcoding      禁止转码

这个参数你可以会设置到外呼的SIP Profile中.这个参数会强制发送到B leg的编码和与A协商出来的编码一致(送单一编码, A协商成啥就送啥).

开启禁止转码, 添加以下行到你想设置的SIP profile中:

<param name="disable-transcoding" value="true"/>

注意: 常见的一个误解是, 这个参数会禁用FS的转码功能.  这是错误滴.

这个参数仅仅是转换外呼的编码和呼入的编码相同, 所以就不需要转码了.

相同的效果也可以通过设置  absolute_codec_string 变量为呼入的编码来实现.

这个参数(当延后协商关闭时才生效)会获取A leg协商出来的编码, 然后把它作为和B leg协商的唯一编码(忽略任务其他的编码)如果B leg 不能接受这个编码, 通话结束.

absolute_codec_string

这个是一个通道变量, 你可以在拨号方案中进行设置, 要在bridge之前设置.
这个参数可以设置发送到B leg时的编码列表, 不考虑别的.

以下是个例子:

<action application="export" data="nolocal:absolute_codec_string=PCMA,PCMU"/>
<action application="bridge" data="sofia/gateway/mygateway/mynumber"/>

<action application="bridge" data="{absolute_codec_string='PCMA,PCMU'}sofia/gateway/mygateway/mynumber"/>

请确保使用单引号来括住逗号(‘PCMA, PCMU’) 防止它把编码列表分割成变量.

注意: 这个参数可以无视disable-transcoding参数. 所以如果你在外呼的SIP Profile中关闭了转码, 你可以在拨号方案中使用absolute_codec_string 设置让外呼的编码和主叫呼入的编码不相同,转码一样会发生.

codec_string

它是一个通道变量, 你可以在拨号方案中使用, 在Bridge前设置.
使用这个变量设置的编码会覆盖你Profile中的outbound-codec-prefs 参数.

示例:

<action application="export" data="nolocal:codec_string=PCMA,PCMU"/>
<action application="bridge" data="sofia/gateway/mygateway/mynumber"/>

<action application="bridge" data="{codec_string='PCMA,PCMU'}sofia/gateway/mygateway/mynumber"/>


codec_string 和 absolute_codec_string 的区别
codec_string是覆盖Profile中的outbound-codec-prefs参数的, 所以如果设置 disable-transcoding 为true, 则codec_string就无效果了, 但absolute_codec_string无视disable-transcoding参数.

Early Negotiation + Disable Transcoding:

<param name="disable-transcoding" value="true"/>

如果SOFIA PROFLE中参数disable-transcoding设置为true, 呼叫到B leg的INVITE消息将会只包含A LEG协商出来的编码.

A leg中的变量”codec_string”控制呼叫B Leg时携带哪些编码.

变量”absolute_codec_string”功能也类似, 但它实现了一个编码的隐式列表. 同时它会从编码列表中禁用其他行为中添加到A leg的编码, 相当于它是绝对的, 只要在Bridge前,设置它, 其他的都得失效.

 

Late Negotiation

延后协商(需要配置参数开启)

<param name="inbound-late-negotiation" value="true"/>

1.  进入拨号方案前不会进行编码匹配
2.  当A leg接通时协商才发生
3.  延后协商会允许你将通话路由到一个脚本, 然后检查SDP和使用通道变量”codec_string”重写可接受的编码

inherit_codec

<action application="set" data="inherit_codec=true"/>

inherit_codec=true (延后协商开启后才适用) 时当B leg 接通时才会进行编码协商, 同时会将B leg 协商出来的编码传到 A leg, 所以A 和 B就会使用相同的编码(如果A leg支持协商出来的编码); 否则, 它将会使用任何A leg可以支持的编码.

ep_codec_string

只有在SIP Profile中开启了延后协商才有效果. 这个变量是一个可读的字符串, 它包含了主叫终端提供的编码. 这个可以很容易的在拨号方案中解析.

<action application="export" data="codec_string=${ep_codec_string}"/>

Proxy Media

如果proxy media 开启和answer应用不执行,编码协商不能进行.

Warnings

如果你的SDP包含携带不同ptime设置的编码, 同时SDP中携带了ptime参数, 那么sofia不会为单个编码发送ptime的属性值.

2010-10-18 11:47:52.234322 [WARNING] sofia_glue.c:213 Codec G723 payload 4 added to sdp wanting ptime 30 but it's already 20 (G729:18:20), disabling ptime.


Examples

以下的拨号方案示例可以允许你在使用proxy_media模式时允许你改变编码的优先顺序同时享受到proxy_media模式带来的低CPU使用. 这个有点像openser/opensips/kamailio 模块textops中的substr().

<context>
  <extension name="sdp_mangler">
    <!-- Set some defaults for this call -->
    <condition field="destination_number" expression="^(\d+)$" break="on-false">
      <action application="set" data="transfer_to=${destination_number} XML fail"/>
    </condition>

    <!-- Here we check for G729 if found we are going make sure we have it first in preference order -->
    <condition field="${switch_r_sdp}" expression="/(.*)(m=audio \d+ RTP\/AVP)(?=[ \d]+18|18[ \d]+)([ \d]*)(.*)/s" break="never">
      <action application="set" data="codec_mangle= 18"/>
      <action application="set" data="transfer_to=${destination_number} XML public_proxy"/>
    </condition>

    <!-- Here we check for PCMU to add it back into the SDP if we want -->
    <condition field="${switch_r_sdp}" expression="/(.*)(m=audio \d+ RTP\/AVP)(?=[ \d]+0|0[ \d]+)([ \d]*)(.*)/s" break="never">
      <action application="set" data="codec_mangle=${codec_mangle} 0"/>
    </condition>

    <!-- Here we rebuild our SDP Moving G729 up front-->
    <condition field="${switch_r_sdp}" expression="/(.*)(m=audio \d+ RTP\/AVP)([ \d]+)(.*)/s" break="never">
      <action application="set" data="switch_r_sdp=$1$2${codec_mangle} 101$4"/>
    </condition>

    <condition>
      <action application="transfer" data="${transfer_to}"/>
    </condition>
  </extension>
</context>

Rewriting SDP重写SDP

switch_r_sdp:

<action application="set">
<![CDATA[switch_r_sdp=(sdp here)
 ]]>
</action>



Disable G.729b on outbound

外呼时禁用G729B编码

<extension name="disable-annexB" continue="true">
  <condition field="${switch_r_sdp}" expression="/(.*)(m=audio \d+ RTP\/AVP)(.*)( 18 )(.*)/s">
     <action application="export" data="sip_append_audio_sdp=a=fmtp:18 annexb=no"/>
  </condition>
</extension>



Codec Negotiation when proxy media enabled

Proxy Media 开启后的编码协商

Correct正确

<extension name="test_proxy_media">
  <condition field="source" expression="mod_sofia">
    <action application="answer"/>
    <action application="playback" data="ivr/ivr-welcome_to_freeswitch.wav"/>
  </condition>
</extension>


Not correct 不正确

<extension name="test_proxy_media">
  <condition field="source" expression="mod_sofia">
    <action application="playback" data="ivr/ivr-welcome_to_freeswitch.wav"/>
  </condition>
</extension>


原文地址:   
http://wiki.freeswitch.org/wiki/Codec_negotiation

另见:

 

FreeSWITCH 第五章(九) 轻量级的TTS–mod_flite

07.20.2013, FreeSWITCH 第五章(九) 轻量级的TTS–mod_flite已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/mod_flite.html

轻量级的TTS–mod_flite

有些时候你需要一个快速, 简单和免费的TTS, 用于快速的测试.  在FreeSWITCH中你可以使用mod_flite来进行简单的TTS测试.
但在专业的, 生产环境中, 它就不适合了, 它满足快速,简单免费的标准.

Getting ready

有一个电话和一个文本编辑器, 就可开始mod_flite的测试了.  记住, 在Windows上默认mod_flite就已经编译了,但没有自动加载.
在Linux/Unix系统上, 你需要执行以下步骤.

How to do it…

如果你在windows上使用,就直接跳到第3步. 如果你在Linux/Unix平台, 那就需要以下步骤来开启mod_flite:

1. 打开源码目录下的 modules.conf , 取消#asr_tts/mod_flite 行的注释.
2. 保存退出. 安装:
make mod_flite-install
3. 如果你希望启动FreeSWITCH的时候就加载mod_flite, 在文件conf/autoload_configs/modules.conf.xml 中取消这一行注释.
<!– <load module=”mod_flite”/> –>
4. 保存退出. 进入到fs_cli中, 执行命令 load mod_flite.

此时mod_flite已经激活并且可以使用了. 现在我们添加一个用于测试的简单拨号方案:

1. 打开文件 conf/diaplan/default/01_Custom.xml 文件, 添加以下行:

<extension name="mod_flite example"> 
  <condition field="destination_number" expression="^(5008)"> 
    <action application="answer"/> 
    <action application="sleep" data="500"/>
    <action application="speak"
        data="flite|kal|Hello world. This is a FreeSWITCH test."/> 
  </condition> 
</extension>

2. 保存退出. 通过fs_cli执行reloadxml命令.

现在已经可以测试TTS了, 拨打号码5008, 听到了什么!

How it works…

FreeSWITCH有一个叫speak的拨号方案应用, 它可以用于访问任何安装的TTS引擎. 它接受管道分割的参数.注意拨号方案中的这一行:

<action application="speak"
        data="flite|kal|Hello world. This is a FreeSWITCH test."/>

第一个参数是TTS引擎, 第二个参数是指定声音.最后一个参数就是要读出的文字了.  sleep应用是可选的, 但在很多情况下接通后等待一下让媒体流连接也是很必要的. (如果总是会漏掉前几个字, 就是需要sleep一下).

|||||请不要把speak和say搞混了. say应用是方便”说” 日期, 时间, 数量, 金额等, 它是使用预先录好的声音.|||||||||

Flite 中有四种不同你声音你可以尝试: awb,kal,rms,slt.

其实我觉得都不好听.

参见
使用mod_tts_commandline的高级TTS

freeswitch cookbook 第5章(八) Receiving faxes 收传真

07.20.2013, freeswitch cookbook 第5章(八) Receiving faxes 收传真已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/112.html

 

Receiving faxes

收传真

上一篇说到了发传真, 现在咱就说说收传真.

Getting ready 

最简单的方式, 收一个传真只需要你把一个通话路由到一个执行rxfax应用的extension就成了. 结合上一篇, 我们可以使用FreeSWITCH服务器作为传真的发送者和接收者.因为是测试, 我们就使用在发传真时用到的示例文件: /tmp/txfax-sample.tiff.

How to do it…

执行以下步骤去完成一个简单的传真发送和接收:
1.    打开fs_cli
2.    执行命令:

originate loopback/9178 &txfax(/tmp/txfax-sample.tiff)

观察控制台, 最终传真的发送应该会成功完成.

How it works…

我们使用了默认配置文件中的fax_receive extension来接传真:

这个extension是非常简单的:

<extension name="fax_receive">
  <condition field="destination_number" expression="^9178$">
    <action application="answer" />
    <action application="playback" data="silence_stream://2000"/>
    <action application="rxfax" data="/tmp/rxfax.tif"/>
    <action application="hangup"/>
  </condition>
</extension>

接收到的传真保存在 /tmp/rxfax.tif. 文件名是可以随意更改的. 例如, 如果你在freeswitch的主安装目录中有一个子目录专门用来存传真, 你可以改拨号方案为:

<action application="rxfax" data="${base_dir}/faxes/${uuid}.tif"/>

每个接收到的传真都会有一个唯一的文件名, 保存在faxes子目录.

There’s more…

接收传真通常只是大系统或程序的一部分. 以下的内容有一些关于处理入站传真的有用的信息.

Detecting inbound faxes  检测入站传真

比方说你的应用是自动接听来电, 播放声音, 让主叫选择他们要呼叫的被叫号码.(企业IVR吧). 偶尔会来个传真. 不要断开, 你可以检测到传真, 然后把通话转到一个传真处理的extensions上去.添加这个extension到你处理呼入的拨号方案:

<extension name="fax detect" continue="true">
  <condition>
    <action application="set"
            data="execute_on_fax_detect=execute_extension handle_
incoming_fax"/>
  </condition>
</extension>

现在添加一个实际上处理入站传真的extension:

<extension name="fax_receive">
  <condition field="destination_number" 
             expression="^handle_incoming_fax$">
    <action application="playback" data="silence_stream://2000"/>
    <action application="rxfax" 
            data="${base_dir}/faxes/${uuid}.tif"/>
    <action application="hangup"/>
  </condition>
</extension>

现在你的系统就可以自动处理入站传真了.

Processing a received fax  处理接收到的传真

一旦一个传真接收完毕, 很少只是让它呆在某个目录里. 通常你想让一个人看到这份传真.
通常的做法就是把TIFF文件转到PDF, 然后把PDF作为邮件附件发送出去. 此外, 当用户看到主叫的ID信息放到邮件的主题栏时感觉非常爽. 记住, 你必须得在系统上配置一个没问题的邮件传输代理MTA才行. 更改接收传真的extension为这样:

<extension name="fax_receive">
  <condition field="destination_number" 
             expression="^handle_incoming_fax$">
    <action application="set"
            data="api_hangup_hook=system  
                  ${base_dir}/scripts/emailfax.sh 
                  ${fax_remote_station_id}   
                  ${base_dir}/faxes/${uuid}.tif"/>
    <action application="playback" data="silence_stream://2000"/>
    <action application="rxfax" 
            data="${base_dir}/faxes/${uuid}.tif"/>
    <action application="hangup"/>
  </condition>
</extension>

注意, 我们添加了一个 api_hangup_hook到接收传真的extension. 这样的话通话结束的时候emailfax.sh就会执行. 在文本编辑器中创建脚本文件添加下面这些内容:

#!/bin/bash
#
# $1 is the calling fax machine's station ID
# $2 is filename 
mutt -n -f /dev/null -F ~/.muttrc -a $2 -s "Fax from $1" user@domain.
com < /dev/null

一定得用一个真实的可用的邮件地址替换 user@domain.com . 最后, 创建.muttrc文件在home目录,然后添加以下行:

set from = 'sender@domain'
set realname = 'Organization or business name'
set folder = /dev/null

接收到的传真现在就会被发送指定的用户, 同时还会带上发来传真的号码.

很多脚本像Perl, Python和ruby都有可以让你发邮件的库. 可以把emailfax.sh换为你自己的邮件发送脚本.

freeswitch cookbook 第5章(七) Send Faxes 发送传真

07.20.2013, freeswitch cookbook 第5章(七) Send Faxes 发送传真已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/103.html

 

Send Faxes

发送传真

FreeSWITCH可以将一份电子文档传送到一个普通的传真机.但只能传TIFF格式的文档, 不过呢,很多格式都可以转到TIFF(本小方法中会讨论一些通用且免费使用的转换工具).

准备工作

简单来说, 发送传真需要准备一些东西, 如TIFF文档, 网关和一台目标传真机(测试的话可以下载一个测试文档http://files.freeswitch.org/txfax-sample.tiff).

把你的TIFF文档放到一个指定的路径. 在我们的例子中使用的是/tmp/txfax-sample.tiff. 网关就是可以让你连接到外部世界(PSTN),传真机就是用来接受你传真的啦.如果你没有网关或传真机, 你仍然可以通过使用默认拨号方案中的fax_receive extension很方便的去尝试本文内容.

如何开始

大多数情况下,发送传真你需要外呼到你的传真机(A leg),然后执行txfax拨号方案应用(diaplan application). 使用以下步骤来完成一个简单的传真发送:

1.    打开fs_cli.
2.    执行以下命令:

originate loopback/9178 &txfax(/tmp/txfax-sample.tiff)

观察控制台, 不出意外的话传真会发送成功.

工作原理

originate命令用于创建传真呼叫中的外呼leg. 在这个例子中, 从字面上看,我们在FreeSWITCH服务器中使用loopback通道发起了一通呼叫. 目标分机号码是”9178”. 在实际的应用中,当然,我们会拨打一个外部号码.例如, 我们可以这样做:

originate sofia/gateway/my_gw/18005551212 &txfax(/tmp/txfax-sample.tiff)

在以上两个例子中, 一旦A leg 接听, txfax应用就被调用. 如果一切正常,传真会顺利的传送并且会收到一个文件/tmp/rxfax.tiff.

不止这些

检查被叫是否是传真并做出反应

在有些情况下, 你可能就是自动打电话然后直接发送传真,假设对方是传真机上. 可能你更想是检测到对方是传真机的时候再发传真,如果不是传真机就正常通话. 这个需要可以配合通道变量execute_on_fax_detect 来实现. 瞧瞧这个拨号方案片断:

<extension name="fax detect test">
  <condition field="destination_number" expression="1234">
    <action application="export" 
            data="execute_on_fax_detect='execute_extension 9178'"/>
    <action application="bridge" data="loopback/9664"/>
  </condition>
</extension>

以上拨号方案中我们告诉系统如果检测到传真信号就执行extension(9178), 否则就正常接通电话和播放保持音乐.

你可以在你的拨号方案中用以下这个”理论”进行调整以适应你的需求.

——-只需创建一个处理传真的extension, 使用execute_on_fax_detect检测传真信号,如果检测到传真信号就用execute_extension去执行处理传真的extension.

检测传真问题

传真出问题是很普遍的, 尤其是在VOIP的环境下.
当传真发送失败时,出于某种原因吧,FreeSWITCH可以帮助我们发现出了什么问题. 如果你使用XML CDRs记录通话记录, 每个传真呼叫的CDR中中都会有一些通道变量,不管传真发送成功或失败. 以下就是一个示例:

<fax_v17_disabled>0</fax_v17_disabled>
<fax_ecm_requested>1</fax_ecm_requested>
<fax_filename>/tmp/txfax.tif</fax_filename>
<fax_success>1</fax_success>
<fax_result_code>0</fax_result_code>
<fax_result_text>OK</fax_result_text>
<fax_ecm_used>on</fax_ecm_used>
<fax_local_station_id>SpanDSP%20Fax%20Ident</fax_local_station_id>
<fax_remote_station_id>SpanDSP%20Fax%20Ident</fax_remote_station_id>
<fax_document_transferred_pages>1</fax_document_transferred_pages>
<fax_document_total_pages>1</fax_document_total_pages>
<fax_image_resolution>8031x3850</fax_image_resolution>
<fax_image_size>24111</fax_image_size>
<fax_bad_rows>0</fax_bad_rows>
<fax_transfer_rate>14400</fax_transfer_rate>

使用这些信息去检查传真问题.

有用的软件

有许多开源和免费的软件(FOSS)包, 可帮助我们去处理PDF和TIFF文件. FreeSWITCH社区成员已经成功的使用Ghost Script(http://pages.cs.wisc.edu/~ghost/)对PDF和PostScript文件转换到其他格式或将其他文件转换为PDF和PostScript文件.
通常的应用就是在发送传真前将PDF文件转换到TIFF格式. 下面的命令就可以把PDF转换为一个标准分辨率的TIFF文件.

gs -q -r204x98 -g1728x1078 -dNOPAUSE -dBATCH -dSAFER -sDEVICE=tiffg3 
-sOutputFile=txfax.tiff -- txfax.pdf

产生更高分辨率的TIFF文件, 使用以下命令:

gs -q -r204x196 -g1728x2156 -dNOPAUSE -dBATCH -dSAFER -sDEVICE=tiffg3 
-sOutputFile=txfax.tiff -- txfax.pdf

Ghost Scripts executable(gs)非常适合SHELL脚本.(参数贼多呗).

另参见
> 请参阅本章中的 接收传真
> 请参阅第3章中的使用XML CDRs

freeswitch cookbook 第5章(六) 创建会议室

07.20.2013, freeswitch cookbook 第5章(六) 创建会议室已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/101.html

 

Creating conferences
创建会议室

FreeSWITCH擅长让多方连接到一个”会议室”, 可以听到彼此说话. 默认的配置已经有一些会议的示例, 我们可以从它学起. 请记住在FreeSWITCH中并不需要显示地去”创建”一个会议室  ———-  拨号方案中的conference应用会为我们做好一切.

Getting ready

除了有一个文件编辑器外, 你还需要至少两部电话用于测试, 最好是有一个或两个人,那样就可以检验你的电话会议是否工作正常. 同时, 你已经安装了FreeSWITCH默认的配置文件,声音文件和音乐文件.

How to do it…

遵循以下步骤:

1.    拨打号码 3000,然后听. 你将会加入到一个标准的电话会议室. 还有如果会议室中仅有你一个人,你就只能在里面听保持音乐了.
2.    使用另一个电话拨打3000, 两个人就在同一个会议室了.
3.    拨打3000加入更多的成员.

Freeswitch默认的拨号方案已经预定义了一些会议室并且已经可以使用了(注意, 直到至少一个人拨入, 会议才算真正的开启).
默认的拨号方案有以下会议号码:

Extension Range Conference Audio Sampling Rate
3000-3099 8 kHz
3100-3199 16 kHz
3200-3299 32 kHz
3300-3399 48 kHz

采样率表示会议中允许成员最大的采样率. 例如如果你有一个使用G722编码,16kHz采样率的话机加入会议室3000, 在发送到其他参会成员前,你的声音会被重新采样为8khz. 如果你拥有多个支持宽带音频的电话, 然后一定要去使用一个高采样率的会议室以获取更高的声音质量.

如果你仅仅需要几个人进入到一个会议室中可以彼此说话, 那么用默认拨号方案中的那些会议就好了, 顶多就是把会议室号码改成你想要的.

There’s more…
会议模块还支持不少功能的, 比如 来电控制和会议主持人. 继续阅读获取有关使用这些功能的信息.

Caller controls  主叫控制

在一个会议中你可以给参会者很多的控制权限. 最普通的就是如下:

>   Talk volume:  主叫发送的声音的音量(这就是, 麦克风增益控制)
>   Listen volume: 你听到的声音音量.
>   Energy threshold: 将主叫的声音认为是他是在说话的最小音量. 当主叫在一个比较嘈杂的环境中时, 提高这个值的大小可以消减背景噪音.

查看默认的主叫控制配置, 打开 conf/autoload_configs/conference.conf.xml 然后定位到下面的内容:

<caller-controls>
  <group name="default">
    <control action="mute" digits="0"/>
    <control action="deaf mute" digits="*"/>
    <control action="energy up" digits="9"/>
    <control action="energy equ" digits="8"/>
    <control action="energy dn" digits="7"/>
    <control action="vol talk up" digits="3"/>
    <control action="vol talk zero" digits="2"/>
    <control action="vol talk dn" digits="1"/>
    <control action="vol listen up" digits="6"/>
    <control action="vol listen zero" digits="5"/>
    <control action="vol listen dn" digits="4"/>
    <control action="hangup" digits="#"/>
  </group>
</caller-controls>

这个主叫控制组的名字是”default”, 而且它不能修改(名字不能修改, 内容随便你). 不过, 你可以定义你自己的主叫控制 ,然后把它们添加到你的会议定义中.

每一种会议都需要在conference.conf.xml文件中的<profiles>章节中添加一个”配置文件”.

假设你创建了一个主叫控制组名字叫”custom”. 在会议配置文件添加这一行就可以让这种会议使用你创建的主叫控制了:

<param name="caller-controls" value="custom"/>

现在所有加入到会议的成员都要使用你指定的主叫控制了.

Conference moderator and PIN
会议主持人和密码

一些会议室有一个”会议主持人”的概念, 他对会议有一定程度的控制权. 在Freeswitch中, 会议主持人就是一个普通会议成员,他是否加入会议室会对会议产生影响.

会议主持人影响会议的两大主要方法如下:

>    所有的成员必须等待, 主持人不来会议不开始
>    主持人离开整个会议结束(所有参会成员都踢出会议室)

通过修改拨号方案中conference 应用的参数来创建一个会议主持人.
对比下面两行”

<action application="conference" data="$1@default"/>
<action application="conference" data="$1@default+flags{moderator}"/>

注意我们添加”+flags{moderator}”就将主叫设置为会议主持人了. 你可以使用逗号分割来添加多个参数, 例如, “+flag{moderator,mute}”.

给会议室添加一个密码也类似. 上面列出的两个会议室可以这样来添加一个密码:

<action application="conference" data="$1@default+1234"/>
<action application="conference" data="$1@default+1234+flags{moderator}"/>

在这两个例子中, 会议室密码都是”1234”, 如果他或她不能输入正确的会议室密码就别想加入到会议.

freeswitch cookbook 第5章(五) Music on hold 保持音乐

07.20.2013, freeswitch cookbook 第5章(五) Music on hold 保持音乐已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/89.html

Music on hold
保持音乐

保持音乐(MOH)是现代电话系统中常见的功能. FreeSWITCH可以让你有许多不同的保持音乐选择.

Getting ready

如果你需要自定义MOH, 你需要一些音乐文件. 而且, 如果你想用在保持音乐中的文件格式是MP3,那么你需要一个可以把MP3转成标准WAV文件的工具. 网站 http://www.mpg123.de上有一个免费的工具. 你还需要一个文件编辑器以及一个注册到你FreeSWITCH上的电话.

How to do it…

首先从FreeSWITCH的下载站点安装默认的保持音乐. Linux/unix用户在FreeSWITCH的源码目录中执行以下命令:

make cd-moh-install

在windows上, 声音文件已经作为MSVC解决方案文件的一部分且编译时自动安装好了.

一旦声音文件安装完毕, 你可以通过拨打9664来确定他们是否安装正常.(不需要reloadxml或系统重启).

How it works…

刚才执行的make命令安装了8KHz, 16kHZ, 32kHZ和48kHZ采样率的保持音乐文件(windows编译时同样安装了).
default拨号方案中的extension 9664会播放默认的保持音乐给主叫. 音乐是由模块mod_file_stream提供的. 通过添加其他的流就可以在你的系统上自定义保持音乐了.

There’s more…

让我们创建一个可选的保持音乐源和测试它.
把你想使用的MP3或WAV文件拷贝到FreeSWITCH服务器上的一个新子目录中.
在这个例子中, 我们会下载几首无版权费用的音乐以及一个声音片断, 还有我们会使用mpg123工具把它们转换为WAV格式.

首先创建一个保存我们新声音文件的目录. 在Linux/Unix做法如下:

mkdir /usr/local/freeswitch/sounds/music/custom1
cd /usr/local/freeswitch/sounds/music/custom1

拷贝你的MP3文件到这个目录中. 或者你可以下载一些免版权的音乐:

wget http://music.incompetech.com/royalty-free/Skye%20Cuillin.mp3
wget http://music.incompetech.com/royalty-free/Parisian.mp3
wget http://music.incompetech.com/royalty-free/credits%20sounder.mp3

现在转换MP3文件到WAV文件格式和删除原始的MP3文件.

for i in *.mp3; do mpg123 -m -r 8000 -w "`basename "$i" .mp3`".wav "$i";
done
rm *.mp3

现在你有了一些可以用作声音源的8kHz的WAV文件. 下一步就是创建实际文件流.

打开文件conf/autoload_configs/local_stream.conf.xml, 然后添加以下新的流定义”

<directory name="custom1" path="$${sounds_dir}/music/custom1">
  <param name="rate" value="8000"/>
  <param name="shuffle" value="true"/>
  <param name="channels" value="1"/>
  <param name="interval" value="20"/>
  <param name="timer-name" value="soft"/>
</directory>

保存文件退出.打开conf/dialplan/default/01_Custom.xml和添加以下extension:

<extension name="hold_music">
  <condition field="destination_number" expression="^96642$">
    <action application="playback" data="${custom1}"/>
  </condition>
</extension>

保存文件退出. 最后我们需要创建一个全局变量${custom1},在任何地方播放我们自定义的保持音乐时都可以使用它. 打开conf/vars.xml文件, 添加以下行:

 <X-PRE-PROCESS cmd="set" data="custom1=local_stream://custom1"/>

保存文件退出. 进入fs_cli然后执行reloadxml或按F6.
当改动本地流定义时你需要重新加载local_stream模块, 在fs_cli中执行:

 reload mod_local_stream

模块重新加载好, 执行以下命令:

 show_local_stream

在本地流列表中应该会有你的新”custom1”流:

custom1,/usr/local/freeswitch/sounds/music/custom1

现在你可以拨打 96642, 然后你可以听到你的新音乐源.
你可以使用 ${custom1} 作为保持音乐(MOH),回铃音和呼转回铃音的源.
例子:

<action application="set" data="ringback=${custom1}"/>
<action application="set" data="transfer_ringback=${custom1}"/>
<action application="set" data="hold_music=${custom1}"/>

——————————————————————————————————————-

freeswitch cookbook 第5章(四) 创建XML互动式语音菜单

07.20.2013, freeswitch cookbook 第5章(四) 创建XML互动式语音菜单已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/80.html

Creating XML IVR menus
创建XML互动式语音菜单

FreeSWITCH包含一个 用于创建和主叫进行交互IVR菜单 的系统,简单但很灵活。
在本方法中,我们会创建一个和Freeswitch默认配置的demo IVR 非常相似的自定义语音菜单。

Getting ready

为了测试,我们需要一个文本编辑器和电话。我们会在你拨打5002时收听到创建的自定义菜单。自定义菜单使用FreeSWITCH声音文件中的通用欢迎辞。

How to do it…

使用以下步骤来定义一个menu:

1. 打开文本编辑器,创建一个新的文件conf/ivr_menus/custom_ivr.xml.
2.  添加以下行:

<menu name="simple_greeting" 
      greet-long="ivr/ivr-generic_greeting.wav" 
      greet-short="ivr/ivr-generic_greeting.wav" 
      invalid-sound="ivr/ivr-that_was_an_invalid_entry.wav" 
      exit-sound="voicemail/vm-goodbye.wav" 
      confirm-attempts="3" 
      timeout="10000" 
      inter-digit-timeout="2000"
      max-failures="3" 
      max-timeouts="3" 
      digit-len="4"> 
  <entry action="menu-exec-app" digits="9" 
         param="directory default ${domain}"/> 
  <entry action="menu-exec-app" 
         digits="/^(10[01][0-9])$/" 
         param="transfer $1 XML features"/> 
  <entry action="menu-top" digits="*"/>
</menu>

3.  保存文件

下面,我们创建一个简单的extension, 用来测试我们的IVR菜单:
1. 使用文本编辑器打开conf/dialplan/default/01_Custom.xml
2. 添加这个extension:

<extension name="sample greeting">
  <!-- Good morning 12am to 11:59 --> 
  <condition hour="0-11" break="never"> 
    <action application="set" data="tod=morning" inline="true"/> 
  </condition> 
  <!-- Good afternoon 12pm to 17:59 --> 
  <condition hour="12-17" break="never"> 
    <action application="set" data="tod=afternoon" inline="true"/> 
  </condition> 
  <!-- Good morning 18:00 to 23:59 --> 
  <condition hour="18-23" break="never"> 
    <action application="set" data="tod=evening" inline="true"/> 
  </condition> 
  <condition field="destination_number" expression="^5002$"> 
    <action application="answer"/> 
    <action application="sleep" data="1000"/> 
    <action application="playback" 
            data="ivr/ivrgood_${tod}.wav"/> 
    <action application="sleep" data="500"/> 
    <action application="ivr" data="simple_greeting"/>
  </condition> 
</extension>

3.  保存文件退出
4.  在fs_cli中执行reloadxml命令或按F6

拨打5002来测试一下新的extension.

How it works…
虽然这是一个创建菜单的超小例子,但对于如何为一个企业PBX创建一个简单的“主欢迎辞” 依然非常有用。

There’s more…
很多时候把短语宏和IVR菜单结合起来是非常有用的。例如,在我们的拨号方案中,我们显示地计算一天中的时间然后再把声音播放给主叫。然后我们使用ivr 应用加载我们的通用欢迎辞。用几个理由来说明这样并不是最好的。首先,我们的欢迎语仅使用一个WAV文件,所以不管录的是什么,我们都是不能动的. 其次, 使用一个短语宏就给了我们一些灵活性.让我们来使用短语宏来提高一下我们的菜单.我们的目标如下:

Ø 在我们的欢迎辞中添加”重复以上选项,请按星号键.”
Ø 当重复选项时,跳过”早上好,中午好,下午好”
Ø 提高拨号方案的可读性

下面就是见证奇迹的时刻, 使用一个短语宏就可以实现这些目标,甚至更多. 首先, 我们清理一下拨号方案. 打开conf/dialplan/default/01_Custom.xml和编辑我们的extension使它只有以下的行:

<extension name="sample greeting"> 
  <condition field="destination_number" expression="^5002$"> 
    <action application="answer"/> 
    <action application="ivr" data="simple_greeting"/> 
  </condition> 
</extension>

现在我们创建一个独立的extension,它永远在diaplan开始的时候就执行. 通常情况下就放到default context 的开头.打开conf/dialplan/default.xml,把以下内容添加为default context的第一个extension.

<extension name="set_tod" continue="true">
  <!-- Good morning 12am to 11:59 --> 
  <condition hour="0-11" break="never"> 
    <action application="set" 
            data="tod=morning" 
            inline="true"/> 
  </condition> 
  <!-- Good afternoon 12pm to 17:59 --> 
  <condition hour="12-17" break="never"> 
    <action application="set" 
            data="tod=afternoon" 
            inline="true"/>
  </condition> 
  <!-- Good morning 18:00 to 23:59 --> 
  <condition hour="18-23" break="never"> 
    <action application="set" 
            data="tod=evening" 
            inline="true"/>
  </condition>
</extension>

添加了这个extension, 通过default context的所有通话都会设置一个通道变量tod.
这样的顺序就可以使任何的extension(或脚本,短语宏)都有权限访问tod, 而不是我们特定的extension.

下面, 打开conf/ivr_menus/custom_ivr.xml, 改变下面这两行为我们的宏:

greet-long="phrase:simple_greeting:long" 
greet-short="phrase:simple_greeting:short"

最后, 添加两个新的宏. 它有些长, 但它给我们实现了不少东西.打开conf/lang/en/ivr/custom.xml, 添加一个新的宏:

<macro name="simple_greeting">
  <input pattern="^(long)$" break-on-match="true"> 
    <match> 
      <action function="sleep" 
              data="1000"/> 
      <action function="play-file" 
              data="ivr/ivr-good_${tod}.wav"/> 
      <action function="sleep" 
              data="500"/> 
      <action function="play-file" 
              data="ivr/ivr-generic_greeting.wav"/> 
      <action function="sleep" 
              data="500"/> 
      <action function="play-file" 
              data="ivr/ivr-to_repeat_these_options.wav"/> 
      <action function="sleep" 
              data="250"/> 
      <action function="play-file" 
              data="voicemail/vm-press.wav"/> 
      <action function="sleep" 
              data="100"/> 
      <action function="play-file" 
              data="ascii/42.wav"/> 
</match>
  </input> 
  <input pattern="^(short)$"> 
    <match> 
      <action function="play-file" 
              data="ivr/ivr-generic_greeting.wav"/> 
      <action function="sleep" 
              data="500"/> 
      <action function="play-file" 
              data="ivr/ivr-to_repeat_these_options.wav"/> 
      <action function="sleep" 
              data="250"/> 
      <action function="play-file" 
              data="voicemail/vm-press.wav"/> 
      <action function="sleep" 
              data="100"/> 
      <action function="play-file" 
              data="ascii/42.wav"/> 
    </match> 
  </input> 
</macro>

保存所有的文件, 在fs_cli中执行reloadxml命令或按F6. 尝试拨打5002和按*重复语音菜单.
在重复中,系统不会再播放早上好,等等. 除了更多的功能, 使用短语宏还可以更简单地改变播给主叫的提示音.

See also
Ø Refer to the Company directory recipe earlier in this chapter
Ø 参考本章节中前面提及的 公司目录