手機打電話時如何識別對方按下的DTMF按鍵的字符
--安卓AI電話機器人
- 一、前言
前面的篇章中,使用藍牙電話攔截手機通話的聲音,并對數據加工,這個功能出來也有一段時間了。前段時間有試用的用戶咨詢說:有沒有辦法在手機上,識別出通話時對方手機按下的DTMF按鍵?就那種電話打通了之后,語音提示對方“按1查話費、按2查流量、按0轉人工”這種功能。之前檢索了一下,Android系統截至目前,并未提供此類“DTMF解碼器”的解析能力。
我們靜下心來思考了一下,覺得這樣的經典IVR場景的需求是非常合理的。以前我們都是建議用戶直接對接到呼叫中心或CRM,由這種語音平臺對通話中的DTMF頻率進行解碼和識別。但如果不接入呼叫中心呢?我們手機本身是否能夠從語音中直接識別出來呢?
這也是本篇章內容編寫的由來。用戶的需求,就是我們產品演化的方向和動力。在本篇章中,我們從DTMF頻率的組成、FFT過濾聲音的頻率,以及DTMF字符的識別等角度,一起探討一下:Android手機中,如何通過手機app,識別出通話時對方手機到底有沒有按鍵、按的是哪個dtmf按鍵。
這個課題方向,估計也比較新穎,因為一般也沒有人去干這種事(一般情況確實也沒有這個需求,打個電話誰會關注對方按什么鍵呢?又不是打摩斯密碼)。但是從一般應用場景來看也確實有這個需求。
- 二、認識DTMF按鍵
我們一般使用電話座機或手機,撥打電話時,在振鈴階段或接通后,均可以按下鍵盤上的數字0-9、*、#等按鍵,把對應的DTMF按鍵值發送給對方。通話的對方接收該按鍵值后進行業務處理和反饋。
通常來說,人耳是無法區分不同的DTMF按鍵值的,這也是DTMF(雙音多頻)中傳輸的頻率太高,遠超出人耳能分辨的頻率所致。按下按鍵后,通常人耳只能聽到“嘟嘟”的按鍵提示音,具體解析要由對應的數學運算模塊對語音進行處理和識別。
本篇是應用文,多余的理論就不在贅述,主要看下面這個圖。對語音數據做FFT運算(從時空域轉頻域),把橫坐標和縱坐標的兩個頻率確定了,DTMF的數字字符就出來了:
詳細描述看這個網址:http://en.wikipedia.org/wiki/Dual-tone_multi-frequency_signaling,有空自己去參考。
- 三、對聲音數據做FFT運算
FFT運算算是非常經典和基礎的算法了,特別對于音頻和視頻圖像處理領域。本來我們在做之前還在想,要不要將FFT和DTMF字符識別的功能,做成一個純Java的jar包,供有需要的或感興趣的同學在Android中試著調用。
但在實踐中發現真沒必要,直接使用TarsosDSP庫就好,反正也就400KB左右,又不大。
具體案例可以參考GitHub上的開源示例代碼:
https://github.com/GreyLabsDev/TarsosDSP-Example
下載下來后,將TarsosDSP-Android-2.4.jar文件丟到Android項目的app\libs目錄即可。
具體的FFT運算和DTMF識別,可以參考DeepSeek中檢索的代碼(實際測試確實可用,不得不說,DS真TM好用。^V^),示例內容如下圖所示:
- 四、識別出DTMF字符
這個也沒什么技術含量,直接按上面章節的DTMF(雙音多頻)的頻率,進行高頻和低頻的解析,然后判斷后即可正常識別出對方按下的DTMF按鍵字符。
DeepSeek中檢索的內容這里也直接貼出來了,可以直接用。有興趣的可以參考或自己在里面按關鍵字來提問獲取代碼。
有兩點需要特意注明一下:
1、聲音的DTMF解碼處理,最好放到新的子線程當中去執行。這樣可以不干擾原有業務的語音播放和識別處理。子線程中大多數時間都不反饋DTMF字符,如果有的話單獨另外處理上拋的消息即可。
2、20ms一包的語音數據(每包數據320 字節)的FFT 的分辨率較低。通常需要緩存多包數據(如 40ms 或 80ms)來提高頻率檢測的準確性。按照一般理論,8k采樣率下,采樣點數量為205時,FFT運算的精度和識別的效果最好。
- 五、最終輸出結果
子線程中FFT運算后上拋的DTMF按鍵值,基本上準確率還是比較高的。但由于每次DTMF音的時長較長,需要對識別的按鍵結果做去除重復的處理。
在運算性能上,由于本篇針對的是語音通話的上行數據做的處理。運算量非常的小,測試結果表明,Android手機上DTMF軟解碼功能的引入,對app的運算性能幾乎可以忽略不計,放心大膽的用。
- 六、總結
本篇這個課題,通話時解碼對方按下的DTMF按鍵值這種需求,正常使用手機的人群,偶爾可能會有這個想法一閃而過,但估計一般人也沒有這個需求。畢竟我們打電話都是用人耳來接聽,但人耳是無法分辨DTMF的“嘟嘟”聲的。
這里之所以會出現識別的需求,前提條件是藍牙電話方案中,已經能將手機SIM卡通話的聲音給提取了出來。在這個基礎之上,擴展出在手機本地進行DTMF識別來對接本地的IVR或AI電話機器人。
目前看起來,從語音中提取DTMF按鍵字符,還是非常簡單的。在通話語音數據中掛一個子線程,把數據丟進去,等待它識別字符并上拋出來就行。
本篇章的內容,除了對手機聲音IVR/AI處理功能比較剛需之外,對于的SIP坐席電話的數據處理,也能起到一定的參考作用。
上一篇:ADB點擊實戰-做一個自動點廣告播放領金幣的腳本app
下一篇:Android應用app實現AI電話機器人接打電話