FreeSWITCH在呼叫失败的情况下如何播放语音提示

简介: 看到好多网友问到这个问题。一般我们在打电话时会听到“您拨的电话正在通话中,请稍后再拨….”,或“电话无应答…”之类的提示,我们在 freeswitch 里也可以这样做。

看到好多网友问到这个问题。一般我们在打电话时会听到“您拨的电话正在通话中,请稍后再拨….”,或“电话无应答…”之类的提示,我们在 freeswitch 里也可以这样做。

其实很简单,默认的配置在呼叫失败时会转到 voicemail (语音信箱),我们只需要在这里修改,让他播放一个语音提示,然后再进入语音信箱(或直接挂 断也行)。

找到 部分的最后几行

<action application="bridge" data="user/${dialed_extension}@${domain_name}"/>
<action application="answer"/>
<action application="sleep" data="1000"/>
<action application="bridge" data="loopback/app=voicemail:default ${domain_name} ${dialed_extension}"/>
复制代码

其中,第一个 bridge 是说明去呼叫被叫号码,如果呼叫失败,则 dialplan 继续往下走,依次是

  • 应答
  • 睡一会
  • 进入 voicemail

OK, 我们只需要把最后一个bridge那行改成

<action application="playback" data="${originate_disposition}.wav"/>
复制代码

重新打电话试一下吧,如果被叫忙,则 originate_disposition 变量就是 USER_BUSY ,用户没注册就是 USER_NOT_REGISTERED 之类的,你只需要保证相关目录下有相对应的声音文件即可(如果LOG中提示找不到声音文件的话试试自己录一个)。

当然,呼不通的原因可能有很多,你总不可能录上所有的声音文件是吧,有两种方法:

  1. 使用一个 lua (或其它语言) 的脚本
<action appliction="lua" data="/tmp/xxx.lua"/>
复制代码

在 lua 脚本中可以拿到这个 originate_disposition 变量,从而可以使用 if then else 之类的逻辑播放各种声音文件。

  1. 当然,如果你脚本也不想编辑的话,实现上 FreeSWITCH 的 dialplan 功能是非常强大的,你只需要将呼叫转到播放不同声音文件的 dialplan:
<action application="transfer" data="play-cause-${originate_disposition}"/>
复制代码

然后创建如下 dialplan extension:

<extension name="Local_Extension_play-cause">
      <condition field="destination_number" expression="^play-cause-USER_BUSY$">
        <action application="playback" "/tmp/sounds/user-busy.wav"/>
      </condition>
   </extension>
   <extension name="Local_Extension_play-cause">
      <condition field="destination_number" expression="^play-cause-USER_NOT_REGISTERED$">
        <action application="playback" "/tmp/sounds/user-not-registered.wav"/>
      </condition>
   </extension>
   <extension name="Local_Extension_play-cause">
      <condition field="destination_number" expression="^play-cause0(.*)$">
        <!-- for all other reasons, play this file -->
        <action application="log" data="WARNING hangup cause: $1"/>
        <action application="playback" "/tmp/sounds/unknown-error.wav"/>
      </condition>
   </extension>
复制代码

小结:

当然,能播放上面的声音文件还有一个前提,就是在第一个 bridge 前面要有以下两行:

<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="continue_on_fail=true"/>
复制代码

第一行的作用是,如果第一个 bridge 成功了,被叫挂断电话后我们就没有必要再播放该声音了,因此直接挂机。当然这一行可以没有,那么你在后面的 originate_disposition 里如果发现值是 “NORMAL_CLEARING” (正常挂机)的情况再决定是否播放相关语音。

第二行的作用是,如果呼叫失败(空号,拒接等),继续往下走,否则(值为 false 的情况)到这里就挂机了。该变量的值还可以有以下几种,表示只有遇到这几种情况才播放语音,其它的就直接挂机。

<action application="set" data="continue_on_fail=NORMAL_TEMPORARY_FAILURE,USER_BUSY,NO_ANSWER,TIMEOUT,NO_ROUTE_DESTINATION"/>
复制代码

祝玩得开心!

相关文章
|
语音技术
FreeSwitch中音乐功能保持和静音回铃声怎样设置
FreeSwitch中音乐功能保持和静音回铃声怎样设置
|
安全 关系型数据库 MySQL
FreeSwitch的安装
本次安装环境是centos 7, 源码目录是
2202 1
|
测试技术
freeswitch在呼叫中心高效使用 IVR 的 5 个最佳技巧
IVR 本来是用于在呼叫中心里通过使用计算机技术来增加客户服务能力的. 但是, 你是否注意到, 你的 IVR 确实增加了你的客户满意度了呢还是激怒了你的用户? 读读下面这 5 个最佳技巧, 可以确保你确实增加了你的客户服务能力. SIPP 是一个很好的SIP测试工具,不过其缺省的配置文件好像有点问题,因此FreeSWITCH推荐使用以下配置文件进行测试:
1230 0
|
存储 视频直播
FreeSwitch中的录像和录音设置
FreeSwitch中的录像和录音设置
|
SQL JSON NoSQL
FreeSWITCH外呼系统通话记录(CDR)接口
通话记录(CDR) 支持把FreeSWITCH的通话记录写入mysql,sqlserver,oracle等数据库,也可以写入redis的list,或者PUBLISH到redis的channel,方便业务程序实时获取通话记录。
2515 0
|
关系型数据库 MySQL 数据库连接
绝对干货!从MySQL5.7平滑升级到MySQL8.0的最佳实践分享
绝对干货!从MySQL5.7平滑升级到MySQL8.0的最佳实践分享
3628 0
|
XML 编解码 Linux
freeswitch 常用指令 fs_cli指令
显示注册用户 : show registrations vars.xml | 一些经常使用变量
4013 0
|
前端开发 Java Maven
springboot优雅的实现excel的导出(自适应列宽实现,中文也行),复制可用
springboot优雅的实现excel的导出(自适应列宽实现,中文也行),复制可用
1177 0
|
编解码 iOS开发 MacOS
MicroSIP软电话的安装和使用
SIP软电话 粗陋理解,安装在电脑上可以当作电话用的软件,就是软电话。 作为一个长期工作在通信一线的免费软件和开源软件的爱好者,我曾经在电脑上安装了几十个免费的软电话软件,以至于到最后他们互相打架——端口冲突(几款设计不良的软件硬性捆绑了5060端口)、霸占声卡、内存泄露。 所以呢,我踩过的坑,你完全不必再去踩一遍了。
4660 0
FreeSwitch下配置DID的方法以及呼叫多个用户
FreeSwitch下配置DID的方法以及呼叫多个用户