a级片网址,www.一级毛片,日批国产,中文字幕日韩精品有码视频,黄色毛片免费网站,久久久精品午夜免费不卡,天堂福利视频

您當前的位置是:  首頁 > 資訊 > 文章精選 >
 首頁 > 資訊 > 文章精選 >

使用FreeSWITCH檢測聲音文件中的DTMF信息

2019-10-12 09:59:47   作者:杜金房   來源:CTI論壇   評論:0  點擊:


  今天,有網(wǎng)友問到一個問題——使用什么工具檢測錄音文件中的DTMF信息。其實FreeSWITCH本身就具備檢測DTMF的功能,簡單配置一下,寫幾個腳本就可以了。
  先簡單說一下DTMF,DTMF是Double Tone Multiple Frequency的縮寫,即雙音多頻。在電話通話中,通過兩個不同的頻率的組合來傳遞按鍵信息,如題圖中所顯示的,1209和697兩種頻率的組合就代表1,其它依此類推。
  在模擬電話以及傳統(tǒng)的PSTN中,DTMF與聲音數(shù)據(jù)是混在一起的,因為它們根本沒法分開。在VoIP中常常使用DTMF2833或SIP INFO來傳輸DTMF,但那不是我們今天要講的內(nèi)容。
  由于DTMF與聲音都混在話路中,在錄音時就也一塊將DTMF信息錄在了錄音文件中,如果想從錄音文件中提取這些DTMF信息,就需要對聲音文件進行分析,也就是今天我們要解決的問題。
  我們有了FreeSWITCH,當然不需要去找別的工具,下面我們就來看一看怎么做。
  為了做一次完整的實驗,我們先得有個錄音文件。首先把SIP電話設成使用inband方式發(fā)送DTMF,以便能夠錄到DTMF信息,具體的設置方式因不同的話機(或軟電話)而已,我們就不多說了。然后,使用如下方法我們可以得到一個錄音文件:
  freeswitch> originate user/1008 &record(/tmp/dtmf.wav)
  上面使用originate命令呼叫1008,被叫接聽后,開始錄音。記得接聽后要按幾個鍵啊。在本次實驗中,我按了1234,并掛機。
  掛機后找個工具播放一下dtmf.wav,便能聽到嘀嘀的按鍵音,雖然每個按鍵的聲音不一樣,但我們的耳朵認不出來,還得借助軟件。
  我們昨天剛講了Lua,今天正好進一步再來一個例子,因而我們寫了一個Lua腳本來檢測DTMF,命名為dtmf.lua,內(nèi)容如下:
  function onInputCBF(s, type, obj, arg)
  if (type == "dtmf") then
  freeswitch.consoleLog("INFO", "Got DTMF: "  obj.digit  " Duration: "  obj.duration  "\n")
  end
  return ''
  end
  session:answer()
  session:execute("start_dtmf", "")
  session:setInputCallback('onInputCBF', '')
  session:streamFile("local_stream://moh」)
  其中,我們設了一個回調(diào)函數(shù) onInputCBF,當檢測到DTMF時便進行回調(diào),在日志中打印相關的DTMF信息。
  session:answer() 對Channel進行應答 session:execute()執(zhí)行一個App,這里我們執(zhí)行了start_dtmf以啟動對inband類型的DTMF的檢測 session:setInputCallbck()安裝一個回調(diào)函數(shù),在檢測到DTMF時便執(zhí)行該回調(diào)函數(shù),就是我們上面寫的那個onInputCBF session:streamFile() 一行只是播放一個無限長的聲音文件,防止掛機
  通過該Lua腳本,當有電話呼入時,我們將來電路由到該腳本,便可以實時檢測來電中的DTMF了。但是在這里我們有一個問題,那就是我們要檢測的是錄音文件里面的,它不是一路電話,即不是一個Channel。
  當然,這也難不住我們,既然我們有FreeSWITCH,那我們可以弄兩個FreeSWITCH實例,從一個中呼叫另一個,在其中一個執(zhí)行playback以播放聲音文件,另一個執(zhí)行上面的Lua腳本檢測,問題不就解決了?
  是的,但我們還有更簡單的解決辦法。
  在FreeSWITCH中,不管是播放聲音文件還是檢測DTMF都需要一個Channel,在沒有實際Channel的情況下,我們就可以生成一個假的Channel。對于這一點,F(xiàn)reeSWITCH早就幫我們想到了,那就是loopback Interface。它其實也是一個Endpoint,通過下面的命令生成一個Channel,并執(zhí)行我們的Lua腳本:
  freeswitch> originate loopback/dtmf &lua(dtmf.lua)
  其中,loopback/ 后面的dtmf是被叫號碼,當一個Channel產(chǎn)生后,該Channel的一端(一頭)會進入Dialplan查找路由,另一頭則執(zhí)行 lua App,即執(zhí)行我們的Lua腳本。關于loopback我們就不多解釋了,我們只需要知道它在查找Dialplan時需要在Dialplan中讓它能找到,因而,我們在默認的Dialplan(default.xml)中加入以下內(nèi)容:
  •  
  •  
  上述Dialplan會匹配被叫號碼dtmf,然后應答,然后播放一個聲音文件,就是我們剛才錄的那一個。
  在Channel的另一頭執(zhí)行我們的Lua腳本,就可以檢測DTMF了,筆者測試時,日志輸出如下:
  • [INFO] switch_cpp.cpp:1291 Got DTMF: 1 Duration: 1120
  • [INFO] switch_cpp.cpp:1291 Got DTMF: 2 Duration: 1120
  • [INFO] switch_cpp.cpp:1291 Got DTMF: 3 Duration: 1120
  • [INFO] switch_cpp.cpp:1291 Got DTMF: 4 Duration: 1120
  帥不帥?
  當然,以上我們的Lua腳本比較簡單,通過增加一些語句,你也可以比較精確的打印DTMF在錄音文件中的時間等信息,這些,自己練習一下吧。
  廣告時間:
  本文收錄于《FreeSWITCH 實例解析》中,感興趣的小伙伴可以點擊鏈接購買商品。
  現(xiàn)在加入FreeSWITCH VIP知識星球即可獲取全部『FreeSWITCH系列』電子書。
  VIP星球:
  2019年最新一期FreeSWITCH培訓(北京站)以及第八屆FreeSWITCH開發(fā)者沙龍正在火熱報名中,現(xiàn)在報名還可享受八折優(yōu)惠,歡迎點擊『閱讀原文』了解詳情。
  同時歡迎贊助商及講師加入我們本次的FreeSWITCH開發(fā)者沙龍。
【免責聲明】本文僅代表作者本人觀點,與CTI論壇無關。CTI論壇對文中陳述、觀點判斷保持中立,不對所包含內(nèi)容的準確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔全部責任。

相關閱讀:

專題

CTI論壇會員企業(yè)

宁化县| 北安市| 孟津县| 万山特区| 壶关县| 磐石市| 积石山| 唐海县| 当阳市| 宁明县| 凤阳县| 襄城县| 大石桥市| 深泽县| 望江县| 盐亭县| 界首市| 延寿县| 依兰县| 陈巴尔虎旗| 内黄县| 浦北县| 环江| 南岸区| 独山县| 琼结县| 峨山| 华宁县| 肥西县| 永安市| 祥云县| 石屏县| 嘉义县| 土默特右旗| 西平县| 邯郸县| 元谋县| 全椒县| 霸州市| 东丰县| 新津县|