HTML5實現DTMF(電話撥號按鍵訊號)解碼、編碼,程式碼簡單易於移植
阿新 • • 發佈:2020-06-28
目錄
DTMF(Dual Tone Multi Frequency) 雙音多頻,由高頻群和低頻群組成,高低頻群各包含4個頻率;兩個頻率波形合成按鍵訊號(0-9 * # A B C D)。
SIP中檢測DTMF訊號的方法:SIPINFO、RFC2833、INBAND;至於這些是什麼我這個外行純屬熱鬧;拿兩個手機互打電話,中途按下的按鍵嘟嘟的聲音就是直接通過話音來傳輸DTMF訊號,屬於INBAND(帶內檢測)吧。
拿Adobe Audition開啟手機上的電話錄音檔案,可以直觀的肉眼看到整齊的DTMF訊號,分析一下就能很快GET到此訊號的解碼、編碼原理。
線上測試地址:線上測試
【圖1】簡單粗暴合成的PCM訊號雜波較多,但和華為手機打出來的錄音訊號差不多(他們雜波少點)
一、前言
1.1 HTML5實現DTMF的一些動機
我的GitHub開源庫 Recorder 功能日漸豐富,最近又有專案可能會用到DTMF的解碼功能,所以就用js實現了一下,本著易於移植的目的,相關程式碼都是簡單的純js程式碼,移植到別的語言非常方便。
涉及到三個原始碼,個個小巧:
- FFT:lib.fft.js 111行(程式碼+空行+註釋)
- DTMF解碼:dtmf.decode.js 192行(程式碼+空行+註釋)
- DTMF編碼:dtmf.encode.js 191行(程式碼+空行+註釋)
自評:高效能、準確度高、誤識別率低;歡迎到 線上測試,下載別的一個軟體 dtmf2num(命令列) 來對比傷害一下。
1.2 一些有效場景
(1) 10086
查話費請按1,嘟(你按了一個1),您的話費餘額為9億9千萬……不能否認,這些能力的實現是建立在DTMF訊號的編解碼之上。
(2) 軟電話
透過某些渠道,比如在你伺服器上的程式擁有了自動撥打電話的能力,你希望通過使用者按下某些按鍵後實現一些功能,比如輸入密碼,這樣你的伺服器端程式就需要帶上DTMF解碼功能。
(3) 小玩具
寫一些小玩具把玩。嘿哈