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

2021-01-14 CTI論壇

  今天,有網友問到一個問題——使用什麼工具檢測錄音文件中的DTMF信息。其實FreeSWITCH本身就具備檢測DTMF的功能,簡單配置一下,寫幾個腳本就可以了。

  先簡單說一下DTMF,DTMF是Double Tone Multiple Frequency的縮寫,即雙音多頻。在電話通話中,通過兩個不同的頻率的組合來傳遞按鍵信息,如題圖中所顯示的,1209和697兩種頻率的組合就代表1,其它依此類推。

  在模擬電話以及傳統的PSTN中,DTMF與聲音數據是混在一起的,因為它們根本沒法分開。在VoIP中常常使用DTMF2833或SIP INFO來傳輸DTMF,但那不是我們今天要講的內容。

  由於DTMF與聲音都混在話路中,在錄音時就也一塊將DTMF信息錄在了錄音文件中,如果想從錄音文件中提取這些DTMF信息,就需要對聲音文件進行分析,也就是今天我們要解決的問題。

  我們有了FreeSWITCH,當然不需要去找別的工具,下面我們就來看一看怎麼做。

  為了做一次完整的實驗,我們先得有個錄音文件。首先把SIP電話設成使用inband方式發送DTMF,以便能夠錄到DTMF信息,具體的設置方式因不同的話機(或軟電話)而已,我們就不多說了。然後,使用如下方法我們可以得到一個錄音文件:

  freeswitch> originate user/1008 &record(/tmp/dtmf.wav)

  上面使用originate命令呼叫1008,被叫接聽後,開始錄音。記得接聽後要按幾個鍵啊。在本次實驗中,我按了1234,並掛機。

  掛機後找個工具播放一下dtmf.wav,便能聽到嘀嘀的按鍵音,雖然每個按鍵的聲音不一樣,但我們的耳朵認不出來,還得藉助軟體。

  我們昨天剛講了Lua,今天正好進一步再來一個例子,因而我們寫了一個Lua腳本來檢測DTMF,命名為dtmf.lua,內容如下:

  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」)

  其中,我們設了一個回調函數 onInputCBF,當檢測到DTMF時便進行回調,在日誌中列印相關的DTMF信息。

  session:answer() 對Channel進行應答 session:execute()執行一個App,這裡我們執行了start_dtmf以啟動對inband類型的DTMF的檢測 session:setInputCallbck()安裝一個回調函數,在檢測到DTMF時便執行該回調函數,就是我們上面寫的那個onInputCBF session:streamFile() 一行只是播放一個無限長的聲音文件,防止掛機

  通過該Lua腳本,當有電話呼入時,我們將來電路由到該腳本,便可以實時檢測來電中的DTMF了。但是在這裡我們有一個問題,那就是我們要檢測的是錄音文件裡面的,它不是一路電話,即不是一個Channel。

  當然,這也難不住我們,既然我們有FreeSWITCH,那我們可以弄兩個FreeSWITCH實例,從一個中呼叫另一個,在其中一個執行playback以播放聲音文件,另一個執行上面的Lua腳本檢測,問題不就解決了?

  是的,但我們還有更簡單的解決辦法。

  在FreeSWITCH中,不管是播放聲音文件還是檢測DTMF都需要一個Channel,在沒有實際Channel的情況下,我們就可以生成一個假的Channel。對於這一點,FreeSWITCH早就幫我們想到了,那就是loopback Interface。它其實也是一個Endpoint,通過下面的命令生成一個Channel,並執行我們的Lua腳本:

  freeswitch> originate loopback/dtmf &lua(dtmf.lua)

  其中,loopback/ 後面的dtmf是被叫號碼,當一個Channel產生後,該Channel的一端(一頭)會進入Dialplan查找路由,另一頭則執行 lua App,即執行我們的Lua腳本。關於loopback我們就不多解釋了,我們只需要知道它在查找Dialplan時需要在Dialplan中讓它能找到,因而,我們在默認的Dialplan(default.xml)中加入以下內容:

  上述Dialplan會匹配被叫號碼dtmf,然後應答,然後播放一個聲音文件,就是我們剛才錄的那一個。

  在Channel的另一頭執行我們的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 實例解析》中,感興趣的小夥伴可以點擊連結購買商品。

  現在加入FreeSWITCH VIP知識星球即可獲取全部『FreeSWITCH系列』電子書。

  VIP星球:

  2019年最新一期FreeSWITCH培訓(北京站)以及第八屆FreeSWITCH開發者沙龍正在火熱報名中,現在報名還可享受八折優惠,歡迎點擊『閱讀原文』了解詳情。

  同時歡迎贊助商及講師加入我們本次的FreeSWITCH開發者沙龍。

相關焦點

  • 《FreeSWITCH: VoIP實戰》:FreeSWITCH 架構
    文件格式  支持不同的聲音文件格式,如 wav,mp3等。  日誌  日誌可以寫到控制臺、日誌文件、系統日誌(syslog)以及遠程的日誌伺服器。bin         可執行程序db          系統資料庫(sqlite),FreeSWITCH 把呼叫信息存放到資料庫裡以便在查詢時無需對核心數據結構加鎖htdocs      HTTP Web srver 根目錄lib         庫文件mod         可加載模塊run         運行目錄,存放 PIDsounds
  • 《FreeSWITCH: VoIP實戰》: 使用Erlang建立IVR實現複雜業務邏輯
    曾寫過一篇使用XML實現IVR 。但當你要實現更複雜、更智能的業務邏輯時,你免不了跟資料庫或其它系統交互。我們曾用Ruby藉助event_socket實現過比較複雜的功能,但當業務變得更加複雜時,我們使用Erlang重寫了整個邏輯。  什麼是 Erlang ?
  • FreeSWITCH中文社區:找一群人共同寫一本書
    今天,我們重新啟動這個計劃,我們將有專人負責跟進寫作進度:  《FreeSWITCH案例大全》:大家在使用過程中遇到的一些案例。  《FreeSWITCH參考手冊》:FreeSWITCH的Application、Command、Channel Varaiable等命令參考。  《FreeSWITCH原始碼分析》:你懂的。
  • 淺談聲音檢測技術的「風口」(下)
    管道運輸業——在各種管道傳輸中,可能會發生因人為損壞或自然因素造成的洩漏事故。如輸水管道的漏水、油氣輸送管道的第三方破壞等。此外,在傳輸管道中頻繁使用的閥門也會出現洩漏現象。管道和閥門的洩露現象不易檢測。傳統的方式是人工監聽,需要有豐富的經驗,容易造成誤判.基於洩漏聲音的自動檢測是一類很有希望的方法。
  • 信息技術春考必備+經典檢測
    計算機基礎知識計算機基礎知識經典檢測經典檢測(計算機基礎)一、單選題1.計算機存儲信息的文件格式有多種,txt格式的文件用於存儲哪種信息()。A.文本 B. 圖片 C.聲音 D.視頻16.在Windows中,Alt+Tab 鍵的作用是( )。A. 關閉應用程式 B.
  • 使用OpenCv和Dlib進行打哈欠檢測
    打哈欠檢測與應用打哈欠檢測就是使用OpenCV和Dlib來檢測打哈欠(由於疲勞或無聊而張大嘴巴深吸氣)。可廣泛應用於自駕車、駕駛員疲勞檢測、駕駛員睡意檢測、駕駛員意識檢測等領域。安裝OpenCv和Dlib庫OpenCv的安裝如下:pip install opencv-pythonDlib的安裝如下:pip install cmakepip install dlib導入Opencv,Dlib和Numpy庫設置dat文件我們將.dat文件放置到工作目錄中,它是一個可以識別面部特徵並提供信息的模型
  • 採集聲音方式多(五年級信息技術教案)
    一、教學目標: 1、能使用麥克風和計算機錄製聲音。2、能夠編輯聲音文件。 教學重點:用麥克風和計算機錄製聲音。教學難點:能夠編輯聲音文件。②右鍵單擊任務欄中的聲音圖標。 ③選擇「打開聲音控制」選項。 ④調整「麥克風音量」。2、讀一讀。
  • 我與FreeSWITCH的故事
    我很欣慰,像我這種自學成才的Linux菜鳥在整個團隊中卻成了Linux專家。而且,更讓我喜歡的是,我可以完全使用Linux桌面工作了,以前的各種Windows上專用的軟體都見鬼去了(後來有了錢,電腦換成了Mac)。在工作中,我學會了Ruby、Ruby on Rails、SVN以及後來的Erlang等技術。我很勤奮,分內的分外的事情我都做,以至於後來整個系統從最底層到最上層我都懂。
  • 使用JavaScript,也能在 Web 應用中實現人臉檢測功能?!
    在本文中,我們將以 JavaScript 庫 pico.js 為依託,手把手教你如何為一款應用添加面部檢測功能。Pico.js是一個很小的JavaScript庫,目前它還是一個近似於概念驗證的庫,還不能用於生產環境,但在我研究過的人臉檢測庫中,Pico.js的效果最佳。
  • 使用PyTorch實現鳥類音頻檢測卷積網絡模型
    以及為什麼鳥類的聲音檢測對我們環境的未來如此重要介紹你聽說過自動語音識別,你聽說過音樂標籤和生成,但是你聽說過鳥的聲音檢測嗎?大約在一年前,在我高二的時候,我第一次聽到這種音頻深度學習的用例。事實上,鳥音頻檢測是我做深度學習和計算機科學的第一個項目。我參與了一個研究項目,在北阿拉斯加的郊區用純粹的聲音來探測鳥類的存在。跳入其中,鳥的音頻檢測出現了這樣一個利基(有利可圖的形式),在本文中,我將向您展示如何在BirdVox-70k數據集上使用一個簡單的卷積神經網絡(CNN)來實現這一點。為什麼鳥類的聲音檢測很重要呢?
  • Linux下使用nohup命令,輸出信息到指定文件
    在Linux環境中,進行部署項目時,經常會用到nohup命令,以Weblogic容器為例,使用nohup命令啟動項目,並把輸出寫到指定的文件中去,寫法如下 nohup .
  • 使用 TensorFlow.js 在瀏覽器中自定義目標檢測
    獲取 API Token接著,您便可以開始下載數據:getting-data.ipynb 現在,我們需要創建一個 labelmap 文件,以定義我們將要使用的數據類別。>}最後一步是將數據轉換為一系列二進位記錄,然後我們便能將這些數據輸入到 TensorFlow 的目標檢測 API。
  • 想錄製聲音,使用win10自帶的錄音機,免費又簡單
    如果需要一種快速在計算機上錄製音頻的解決方案,那麼,Windows 10自帶的免費「錄音機」應用程式應該是一個首選項,可以使用該應用程式錄製採訪、對話、演講、播客等幾乎所有需要錄製聲音的場合。完成這些步驟後,錄製的音頻將使用.m4a文件格式自動保存在「文檔」文件夾中的「錄音」文件夾中。(二)播放錄音要播放以前錄製的音頻,請使用以下步驟:1.打開「錄音機」。
  • 簡單小案例(一):使用Pandas在Python中讀取和寫入CSV文件
    有幾種不同的方法,例如,您可以使用Python的內置open()函數來讀取CSV(逗號分隔值)文件,或者可以使用Python的專用csv模塊來讀取和寫入CSV文件。根據您的用例,您還可以使用Python的Pandas庫讀取和寫入CSV文件。在本文中,您將看到如何使用Python的Pandas庫讀取和寫入CSV文件。但是,在此之前,讓我們簡要地看看什麼是CSV文件。
  • 使用文件對象讀取Python文件內容
    一般來說,文件的存儲類型主要分為文本文件和二進位文件兩大類。文本文件就是可以用記事本打開的文件,文本文件主要存儲了文字信息及換行符等控制符號,任何程序都可以打開文本文件並能正確顯示文件內容;二進位文件主要是以二進位方式來存儲內容,二進位文件很難被用戶或其它程序理解,讀取後也無法正確顯示,只有創建它的程序才能夠正確讀取和顯示,如DOC文檔、圖片文件、音視頻等文件。
  • 滲透測試 對文件上傳安全檢測與webshell分析
    前段時間我們SINE安全收到客戶的滲透測試服務委託,在這之前,客戶網站受到攻擊,數據被篡改,要求我們對網站進行全面的滲透測試,包括漏洞的檢測與測試,邏輯漏洞.垂直水平越權漏洞,文件上傳漏洞.等等服務項目,在進行安全測試之前,我們對客戶的網站大體的了解了一下,整個平臺網站,包括APP,安卓端,IOS端都採用的JSP+oracle資料庫架構開發,前端使用VUE,伺服器是linux
  • 使用cat命令在Linux中組合文本文件
    然後可以將合併的文本保存到另一個文本文件中。 在本教程中,您將學習如何使用cat命令將兩個或多個文件中的文本合併為一個文件。 這將幫助您從普通初學者獲得Ubuntu上的高級用戶狀態。 我們在Ubuntu 18.04 LTS系統上運行了本教程中提到的命令。
  • 基於深度學習的咳嗽識別模型有助於實時檢測咳嗽聲音的位置
    KAIST中心宣布,他們的咳嗽檢測攝像機可以識別咳嗽的發生地點,並可視化位置。最終的咳嗽識別攝像機可以實時跟蹤和記錄有關咳嗽者,其位置以及咳嗽次數的信息。機械工程系教授開發了一種基於深度學習的咳嗽識別模型,以對咳嗽聲進行實時分類。
  • Linux磁碟檢測工具smartctl的使用和分析
    1 編寫目的本文引用地址:http://www.eepw.com.cn/article/201610/305661.htm在如今大數據的環境中,磁碟的性能和穩定性是非常重要的一個業務因素。在Linux系統中,smartctl是較為常用的磁碟檢測工具。
  • 滲透技巧——使用Mimilib從dump文件中導出口令
    0x00 前言在上篇文章《Mimilib利用分析》提到mimilib可作為WinDbg的插件進行使用,所以本文將會詳細介紹這個插件的用法,實現從內核模式轉儲文件中導出口令,結合利用思路給出防禦建議。獲得dump文件詳細信息的命令如下:報錯提示:Kernel symbols are WRONG. Please fix symbols to do analysis.如下圖: