顧名思義,VAD(Voice Activity Detection)算法的作用是檢測是否是人的語音,它的使用
范圍極廣,降噪,語音識別等領域都需要有vad檢測。vad檢測有很多方法,這里我們之介紹一
下webrtc里面的vad檢測。
webrtc的vad檢測原理是根據人聲的頻譜范圍,把輸入的頻譜分成六個子帶
(80Hz~250Hz,250Hz~500Hz,500Hz~1K,1K~2K,2K~3K,3K~4K。) 分別計算這六個子帶的、
能量。然后使用高斯模型的概率密度函數做運算,得出一個對數似然比函數。對數似然比分為
全局和局部,全局是六個子帶之加權之和,而局部是指每一個子帶則是局部,所以語音判決會
先判斷子帶,子帶判斷沒有時會判斷全局,只要有一方過了,就算有語音。
webrtc的vad檢測代碼比較簡潔,核心代碼只在三個文件中。
webrtc_vad.c 該文件是用戶調用的API函數,使用vad一般只需要調用該里面的函數即可。
使用函數:WebRtcVad_Create WebRtcVad_Init 申請內存和初始化一些參數。
使用函數:WebRtcVad_set_mode 設置vad要處理的采樣率,一般是8000或16000
使用函數:WebRtcVad_Process 核心函數,完成檢測是否有人聲的核心。
vad_core.c 該文件是webrtc_vad.c 文件中函數的實現代碼,也是vad最深層的核心代碼,
有興趣的話可以研究一下。這里不做展開。
使用方法:
初始化調用:
WebRtcVad_Create();
WebRtcVad_Init();
WebRtcVad_set_mode();
處理調用:
WebRtcVad_Process();
注意事項:
這里共有三種幀長可以用到,分別是80/10ms,160/20ms,240/30ms。其它采樣率
的48k,32k,24k,16k會重采樣到8k來計算VAD。之所以選擇上述三種幀長度,是因為語
音信號是短時平穩信號,其在10ms~30ms之間可看成平穩信號,高斯馬爾科夫等比較
的信號處理方法基於的前提是信號是平穩的,在10ms~30ms,平穩信號處理方法是可
以使用的。
從vad的代碼中可以看出,實際上,系統只處理默認10ms,20ms,30ms長度的數據,
其它長度的數據沒有支持,筆者修改過可以支持其它在10ms-30ms之間長度的幀長度
發現也是可以的。
vad檢測共四種模式,用數字0~3來區分,激進程度與數值大小正相關。
0: Normal,1:low Bitrate, 2:Aggressive;3:Very Aggressive 可以根據實際的使用
在初始化的時候可以配置。
自問自答:
問題一:為什么子帶是從80HZ開始的?
答復:我國交流電標准是220V~50Hz,電源50Hz的干擾會混入麥克風采集到的數據中且物理震動也會帶來影響,所以取了80Hz以上的信號。