FreeSWITCH在呼叫失敗的情況下播放語音提示
阿新 • • 發佈:2019-02-10
看到好多網友問到這個問題。一般我們在打電話時會聽到“您撥的電話正在通話中,請稍後再撥....”,或“電話無應答...”之類的提示,我們在 freeswitch 裡也可以這樣做。
其實很簡單,預設的配置在呼叫失敗時會轉到 voicemail (語音信箱),我們只需要在這裡修改,讓他播放一個語音提示,然後再進入語音信箱(或直接掛 斷也行)。
找到 <extension name="Local_Extension">部分的最後幾行
<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 之類的邏輯播放各種聲音檔案。
2) 當然,如果你指令碼也不想編輯的話,實現上 FreeSWITCH 的 dialplan 功能是非常強大的,你只需要將呼叫轉到播放不同聲音檔案的 dialplan:
<action application="transfer" data="play-cause-${originate_disposition}"/>
然後建立如下 dialplan extension:
<condition field="destination_number" expression="^play-cause-USER_BUSY$"> <action application="playback" "/tmp/sounds/user-busy.wav"/> </condition>
<condition field="destination_number" expression="^play-cause-USER_NOT_REGISTERED$"> <action application="playback" "/tmp/sounds/user-not-registered.wav"/> </condition>
<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>
小結:
當然,能播放上面的聲音檔案還有一個前提,就是在第一個 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"/>