1. 程式人生 > >FreeSWITCH在呼叫失敗的情況下播放語音提示

FreeSWITCH在呼叫失敗的情況下播放語音提示

看到好多網友問到這個問題。一般我們在打電話時會聽到“您撥的電話正在通話中,請稍後再撥....”,或“電話無應答...”之類的提示,我們在 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"/>