批量创建用户
用户配置文件:conf/directory/default/,每个用户对应一个XML配置文件。
创建用户:
批量创建用户:
freeswitch 源代码目录中的 script/perl/add_user 脚本(Perl语言编写)。
创建用户后,reloadxml。修改dialplan,增加到这部分用户的路由。例如增加了1020~1039这20个用户,修改默认的dialplan中的正则表达式:
用freeswitch 实现IVR
IVR(Interactive Voice Response,交互式语音响应):电话语音菜单。可以自己注册一个分机,拨打5000,就可以听到菜单提示了。
最简单的菜单
IVR 系统默认的配置文件:conf/autolaod_configs/ivr.conf.xml,它装入 conf/ivr_menus/目录下的所有xml文件。demo_ivr 是拨打5000听到的那个。
真正的菜单配置信息放到 <menus></menus> 标签中。每个菜单应该有唯一的名字(name)。创建一个xml配置文件 conf/ivr_menus/welcome.xml :
greet-long:指定最开始的欢迎音,该语音文件默认位置:/usr/local/freeswitch/sounds/ 目录下。
在控制台执行reloadxm,使配置生效。
配置dialplan,把用户来话转接到菜单,在dialplan中加入一个extension:
默认IVR简介
菜单项的配置:
按 * 号键可以返回主菜单:
按时间进行路由
构造dialplan:
配置打DID号码才转入IVR:
注意:action和anti-action都设置了inline属性,值为true表示该动作会立即生效。
还需要配置实现 ivr_day 和 ivr_night 两个不同的IVR。
配置中文语音提示
将这些文件直接用中文语音包中对应的文件替换。
使用 sound_prefix
var.xml 中定义:
修改该变量的值,指向中文的语音文件路径:
或在dialplan中针对每一个channel进行改变:
也可以设置到用户目录中,在1002.xml中加入该变量:
测试dialplan:
当1002拨打1234,听到‘123“,但其他用户拨打1234,仍会听到”one two three“。
使用Phrase
freeswitch 实现了 phrase(短语)框架。可以将不同语音的日期、时间、货币及数字等以相同语音表示。
默认的ivr配置中,使用了phrase。 ivr_menus/demo_ivr.xml 中,greet-long的配置:
该phrase 是 conf/lang/en/demo/demo_ivr.xml 中定义的一个宏:
name属性定义了该宏的名称;pause表示在每个action之间暂停多长时间(毫秒),它匹配(match)指定模式(pattern)后,便执行下面的动作(action)。
声音文件在:conf/lang/en/en.xml 中定义,demo_ivr.xml 也是有该文件使用 include 装入。en.xml 的部分内容:
en.xml 定义了一种语言,name 为 en;由say-module 指定的en模块;所有支持的声音文件路径都由sound-prefix指定。
可以拨打 9386 试一下。
中文phrase配置
编辑 zh.xml
在 conf/freeswitch.xml中
增加一行
说 中文
freeswitch中的say接口可以通过一些预先录制的声音文件说出一些常用的词语组合,如日期、时间等。
Say接口支持各种语言,如果需要支持中文,需要mod_say_zh模块。默认不被编译。
编译:
为了freeswitch启动时自动加载,conf/autoload_configs/modules 中将下面行注释去掉:
使用中文语言提示
在dialplan中指定language或default_language通道变量。例如修改默认的5000对应的dialplan:
在1002用户配置文件1002.xml中添加,仅对1002用户生效:
录音
单腿录音
在dialplan中录音
由于只有一个channel,所有录音文件是单声道的。
使用playback测试:
对两条腿的通话进行录音
一般正常的通话通常由两个channel组成。
使用sox附带的play命令
在不同的时间点分别执行:
在dialplan中,使用record_session:
立体声
可以将通话的两个人的声音分别存在两个声道里。
事先将RECORD_STEREO通道变量设置为true可以在录音时直接录成立体声。在dialplan中使用record_session:
录音相关的通道变量
变量区分大小写:
还有一些变量可以设置声音文件的元信息:
原生格式
为了最大限度的节省系统资源,可以将声音录制成原生格式。由mod_native_file模块提供。
将声音文件录成 /tmp/test.PCMU
PCM格式的文件处理:
放音
playback的参数
播放声音文件
文件接口的分类
1.声音文件
由mod_sndfile模块直接调用libsndfile库,典型的如:WAV、AU、AIFF、VOX等
libsndfile 不支持的声音文件由其他模块实现;如mod_shout模块实现了对MP3文件的支持。
编译安装
2.local_stream
mod_local_stream 中实现。每个流在整个系统中只有一个实例,但可以被多个channel读取。适合做保持音乐(MOH)
3.silence_stream
是一个静音流,在mod_stream中实现。
在dialplan中,有一个sleep App 和playback有同样的效果。使当前channel的执行暂停2s:
区别:slience_stream会播放静音,而sleep会中断RTP流的传输。
1400为舒适噪声的参数值,范围为:1~10000,值越小噪声的音量越大;通常使用的参数值为:600~1400。
4.tone_stream
是一个铃流,在mod_tone_stream模块中实现。可以使用TGML语言生成各种信号音。
产生回铃音信号:
英国的回铃音:
conf/vars.xml 中定义了一些其他国家的信号音。
loops=3 表示循环产生3次信号音,loops=1 表示无限循环。
5.file_string
原先在mod_file_string模块中实现,后合并到mod_dptools中。
可以指定多个文件间的播放时间间隔
6.其他接口与参数
mod_vlc模块实现了一个vlc的文件接口。vlc是一个跨平台的多媒体播放器,它能播放主流音、视频文件。
播放一个本地文件:
mod_httapi模块直接实现了一个HTTP接口,它可以将远程文件缓存到本地:
在playback的参数中添加“say”:
<acton application="playback" data="say:tts_commandline:Ting-Ting:hi"/>
默认ivr的配置中的欢迎音就是用带有phrase:前缀的phrase宏实现。
循环播放
endless_playback 和 loop_playback 两个app用于多次播放某个文件。
不断播放 test.wav 直至挂机:
Say
Say是一个接口,通过定义一个统一的接口屏蔽了语言的多样性。Say也是一个app,可以通过特定的语法,使用预先录好的声音读出日期、时间等,并通过Say接口支持多语言。
Say 能读取的数据类型
具体的读法:
TTS
TTS(text to speech)是将文本转换成语言的一项技术,又称为语言合成(Synthesis)。
使用mod_flite
mod_flite 是freeswitch 基于flite语言合成引擎的一个TTS模块。仅支持英文。
编译安装TTS模块
呼叫1000,并执行speak。speak参数使用竖线分隔,第一个参数flite表示TTS引擎的名字;第二个参数kal表示一种嗓音,(awb、kal、rms、slt)。在分机1000振铃并接听后,可以听到“hello,welcome to freeswitch”)。
配置好以上dialplan后,拨打1234。
mod_tts_commandline
可以调用命令,通过命令来执行TTS功能,生成一个声音文件,进而播放。
1.使用Mac上的TTS功能
该命令不支持WAV格式。所有使用了aiff格式。
可以使用SOX软件包中的play命令来播放该文件:
mac系统默认不带中文的语音库,需要安装。
安装步骤:打开“系统偏好” - 选择 “听写与语音”、“文本至语音”,在系统噪音中选择自定义,就可以选择噪音为“Ting-Ting”。
编译安装 mod_tts_commandline模块
编辑 tts_commandline 模块,修改settings部分:
dialplan的配置文件应该使用UTF-8
2.使用windows平台上的TTS功能
建立VBS脚本,例如:C:\src\say.vbs
使用createobject创建一个SAPI的语音对象spvoice,创建一个文件对象spfilestream,该文件对象打开一个声音文件并准备写入,然后把spvoice的音频输出指定为该文件对象,调用spvoice的speak方法进行TTS转换,并把结果写入声音文件中。
配置 conf\autoload_configs\tts_commandline.conf.xml 文件了
生成一个工程文件:
1)找一个差不多的工程文件复制过来,然后稍加修改。例如:application\mod_fsv目录下的 mod_fsv.2010.vcxproj 工程文件复制到 asr_tts\mod_tts_commandline 目录中,并改名:mod_tts_commandline.2010.vcxproj。打开该文件,将所有的 mod_fsv 替换 mod_tts_commandline。
2)打开freeswitch的solution文件freeswitch.2010.express.sln,右击“解决方案资源管理器”,选择“解决方案freeswitch.2.10..”,选择“添加” - “现有项目”,找到刚刚建立的mod_tts_commandline.2010.vcxproj,点击确定。接着在“解决方案资源管理器”中找到“mod_tts_commandline”一项,右击,选择“生成”命令编译该模块。
3.使用Linux上的TTS功能
可以使用Google Translate提供的API自己写一个脚本与mod_tts_commandline集成。
MRCP
MRCP(Media Resource Control Protocol)是一个支持访问网络上的媒体资源的协议。典型应用是TTS和ASR(自动语音识别)。v1版使用RTSP协议进行媒体资源的协商,v2版使用SIP协议。UniMRCP是MRCP协议的一个开源实现,支持v1和v2。
mod_unimrcp 是UniMRCP基础上在freeswitch中实现的一个模块。同时支持TTS和ASR。
Google Translate
把文字变成MP3声音文件:
-A 指定客户端使用的User Agent;-o 指定输出文件。
加载mod_shout,使用如下的dialplan:
呼叫1234就可以听到测试的声音了。
拆成中文和英文分别读:
也可以使用mod_httapi提供的HTTP文件来实现:
TTS小结
什么情况下使用TTS,什么情况下使用录音呢?
在呼叫失败的情况下向主叫用户播放语音提示
实现方法
对本地用户的路由都是在 conf/dialplan/default.xml中的local_extension部分配置的。呼叫失败时,会将电话转到voicemail(语音信箱),提示用户可留言。在电话进入语音信箱之前播放一个语音提示:
第一个bridge用于呼叫被叫号码,如果呼叫失败,则dialplan会继续往下执行,
在最后一个bridge之前加入:
重新拨打电话,如果被叫忙(或拒接),originate_disposition 变量的值会是USER_BUSY,如果用户没注册就是USER_NOT_REGISTERED。拨打一个不存在的用户是,日志如下:
提示找不到指定文件,录一个放上去。如果用户忙,也可以录一段放到/tmp/USER_BUSY.wav文件中。
进阶
1)使用一个LUA脚本;在最后一个bridge之前加入:
2)使用dialplan配置。将呼叫转到播放不同声音文件的dialplan extension:
使用TTS
在 conf/lang/zh/demo 目录下创建脚本,book-demo.xml。
使用两个宏,第一个用于在用户忙的时候播放;第二个在用户未注册的时候播放。
配置后,在freeswitch控制台执行relaodmxl。
在dialplan中:
在dialplan中直接使用phrase app,
只用一个phrase Macro。
先配置dialplan:
在phrase Macro 中配置一个名为 HangupGause的Macro,并将 originate_disposition 作为参数传入。
原理
第一行的作用:在一个成功的bridge之后,如果用户挂断电话,直接挂机。
第二行的作用:如果呼叫失败,让dialplan继续执行,否则channel在第一次呼叫失败时就挂机了。
实现呼叫前转业务
通过拨打一个特定的号码登记需要转移到的电话号码,以后所有的呼叫都转移到该号码上。
为了实现业务登记,先建立路由:
在1002拨打 #57#时将登记的信息删除:
在正常的路由中进行检查:
也可以使用hash api命令进行检查:
直到下面的dialplan extension: