這是學習時的筆記,包含相關資料鏈接,有的當時沒有細看,記錄下來在需要的時候回顧。
有些較混亂的部分,后續會再更新。
歡迎感興趣的小伙伴一起討論,跪求大神指點~
Material
- [ ] wiki
- [ ] Efficient voice activity detection algorithms using long-term speech information
- [ ] Noise-robust voice activity detection (rVAD) - source code
綜述
- Bowon Lee, Mark Hasegawa-Johnson. Minimum Mean-squared Error A Posteriori Estimation of High Variance Vehicular Noise
method: MMSE,最小均方誤
針對汽車噪音
code: https://github.com/mwv/vad
提取特征設定閾值(語音頻帶能量比,周期性測量,運行最小最大均方根能量估計,自適應和噪聲閾值計算,拖尾平滑以淡入淡出語音/噪音邊界)
- Audio-Visual Voice Activity Detection Using Diffusion Maps
- Deep Belief Networks Based Voice Activity Detection
- DENOISING DEEP NEURAL NETWORKS BASED VOICE ACTIVITY DETECTION
- RECURRENT NEURAL NETWORKS FOR VOICE ACTIVITY DETECTION
Information
難點
- 算法假設背景噪聲在長時間內是平穩的,當實際噪聲環境為非平穩噪聲或劇烈變化時,算法檢測性能急劇下滑
- 絕大多數算法依賴語音信號本身音節的特征對語音和噪音進行區分。某些以清音或摩擦音、爆破音開頭的語音信號易被淹沒,導致語音丟失。同時,在大多數算法的語音起始和結束段檢測效果不佳。
假設
-
在信號處理時,將語音信號作為一個短時的平穩過程來處理(語音信號具有短時平穩性)。實際處理中,將連續的語音數據流用一個窗函數序列分割成連續段,然后對每一段(幀)進行處理。
典型的分割窗序列:矩形窗、海明窗、漢寧窗頻譜泄露與傅里葉變換尤其是離散時間傅里葉變換有關:信號為無限長序列,運算需要截取其中一部分(截斷),於是需要加窗函數,加了窗函數相當於時域相乘,於是相當於頻域卷積,於是頻譜中除了本來該有的主瓣之外,還會出現本不該有的旁瓣,這就是頻譜泄露!為了減弱頻譜泄露,可以采用加權的窗函數,加權的窗函數包括平頂窗、漢寧窗、高斯窗等等。而未加權的矩形窗泄露最為嚴重。(主瓣通常指Sa(x)=sinx/x函數或與之有關的函數圖像(例如頻譜)中從負到正第一個完整的瓣,旁瓣是指后面其他的低矮的瓣。)
語音信號時域
以時間作為參照來觀察動態世界的方法我們稱其為時域分析
- 短時能量:標志語音信號在計算長度內的幅度大小,可以由它的量值粗略判斷語音信號有無,也可以判斷該幀是請是濁。實際處理中,一般不單獨計算語音幀的能量,而是利用自相關法求解LPC系數,自相關序列第一個值代表幀能量。
- 短時過零率:信號變化快慢
- 自相關函數:估計基音周期
- 基音檢測
語音信號頻域
- 短時傅立葉變換(STFT)
- 頻譜分析:0dB是播放設備所輸出信號的最大值。所以軟件里,經常在0以下,就是負值了。頻譜反映的是這個瞬間,音頻信號各分量的電平值大小。
你眼中看似落葉紛飛變化無常的世界,實際只是躺在上帝懷中一份早已譜好的樂章。 ——> 時域和頻域
語音信號特征提取
激勵模型:發濁音時聲帶的不斷開啟和關閉將產生間歇的脈沖波,濁音具有周期性。發清音時聲帶不振動,因此清音沒有周期性。清音由空氣摩擦產生,在分析研究時等效為隨機白噪聲。
聲道模型:聲道部分的數學模型目前有兩種觀點,一種是將聲道視為多個不同截面積的管子串聯而形成的系統,即“聲管模型”,另一種是將聲道視為一個諧振腔,即“共振峰模型”。
輻射模型:輻射模型表征口和唇的輻射效應和圓形頭部的繞射效應。
音素:語音中最小的基本單位是音素。分為元音和輔音。(元音和共振峰關系密切)
聲強
在物理學中,把單位時間內通過垂直於聲波傳播方向的單位面積的平均聲能,稱為聲強。實驗的研究表明,人對聲音強弱的感覺並不是與聲強成正比,而是與其對數成正比的。
SIL=10lg[I/I’]=10lg(I/I’)
式中I為聲強,I’=10e-12瓦/平米稱為基准聲強,聲強級的常用單位是分貝(dB)
響度
一般來說,聲音頻率一定時,聲強越強,響度也越大。但是響度與頻率有關,相同的聲強,頻率不同時,響度也可能不同。響度若用對數值表示,即為響度級,響度級的單位定義為方,符號為phon。根據國際協議規定,0dB聲級的1000Hz純音的響度級定義為0 phon,n dB聲級的1000Hz純音的響度級就是n phon。
音高
音高也是一種主觀心理量,是人類聽覺系統對於聲音頻率高低的感覺。音高的單位是美爾(Mel)。響度級為40 phon,頻率為1000Hz的聲音的音高定義為1000Mel。
基音周期和基音頻率
基音周期
基音周期描述了語音激勵源的一個重要特征,它反映了聲門相鄰兩次開閉之間的時間間隔或開閉的頻率。(因為女性基頻比男性高,所以有些算法中使用基頻來區分性別,還挺准的)
基音周期的估算方法
基音周期的估算方法很多,比較常用的有自相關法,倒譜法(我們提基頻用的倒譜法),平均幅度差函數法,線性預測法,小波—自相關函數法,譜減—自相關函數法等。
自相關法:
1. 預處理:為了提高基音檢測的可靠性,有人提出了端點檢測和帶通數字濾波器兩種預處理方法對原始信號進行預處理。在提取基頻時端點檢測比一般端點檢測更為嚴格(一般端點檢測會保留語音有話段的頭和尾,以避免把有用信息當作噪聲濾除,但頭和尾不包括基頻信息,所以在進行提取基音的端點檢測時閾值設定更為嚴格,濾去頭部和尾部)。用帶通濾波器預處理的目的是為了防止共振峰第一峰值的干擾,一般帶通濾波器的頻率范圍選為60~500Hz。
2. 自相關法:短時自相關函數的定義為 其中k是時間的延遲量,N為幀長,短時自相關函數具有以下重要性質。若當原信號具有周期性,那么它的自相關函數也具有周期性,並且周期性與原信號的周期相同。且在K等於周期整數倍時會出現峰值。清音信號無周期性,它的自相關函數會隨着K的增大呈衰減趨勢,濁音具有周期性,它的R(k)在基因周期整數倍上具有峰值,通常取第一最大峰值點作為基因周期點。自相關函數法基音檢測正是利用這一性質來進行基因周期檢查的。
信噪比
定義:信噪比的計量單位是dB,其計算方法是10lg(PS/PN),其中PS和PN分別代表信號和噪聲的功率(用能量也是一樣的)。
在噪聲和語音完全混雜的情況下信噪比很難計算,在預知噪聲的情況下,可以用實際信號(純語音+噪聲)減去噪聲,得到近似的純語音信號。從而通過進一步計算求得信噪比。
我們在實驗中所采集的信號信噪比低時在10幾dB,信噪比高時在30dB以上。
梅爾倒譜系數
在語音識別(Speech Recognition)和話者識別(Speaker Recognition)方面,最常用到的語音特征就是梅爾倒譜系數。梅爾倒譜系數是在Mel標度頻率域提取出來的倒譜參數,Mel標度描述了人耳頻率的非線性特性,它與頻率的關系可用下式近似表示:
Mel(f)=2595*lg(1+f/700),式中f為頻率,單位為Hz。計算方法點[這里](http://blog.csdn.net/u010451580/article/details/51178190)。
人類對不同頻率語音有不同的感知能力:對1kHz以下,與頻率成線性關系,對1kHz以上,與頻率成對數關系。頻率越高,感知能力就越差了。因此,在應用中常常只使用低頻MFCC,而丟棄中高頻MFCC。
短時能量
短時平均幅度
短時平均幅度也是一幀語音信號能量大小的表征,它與短時能量的區別在於計算時不論采樣值的大小,不會因為取二次方而造成較大的差異。
短時平均過零率
短時平均過零率表示一幀語音中語音信號波形穿過橫軸(零電平)的次數。
共振峰
共振峰是指在聲音的頻譜中能量相對集中的一些區域,共振峰不但是音質的決定因素,而且反映了聲道(共振腔)的物理特征。
聲音在經過共振腔時,受到腔體的濾波作用,使得頻域中不同頻率的能量重新分配,一部分因為共振腔的共振作用得到強化,另一部分則受到衰減。由於能量分布不均勻,強的部分猶如山峰一般,故而稱之為共振峰。
在語音聲學中,共振峰決定着元音的音質。共振峰可以等效為聲道系統函數的復極點對,由於人的聲道平均長度為17cm,而語音信號的能量主要集中在0-5kHz。因此語音通常包含4到5個穩定的共振峰,一般只需要研究前三個共振峰。
共振峰:單元音頻譜圖,橫軸為頻率,縱軸為分貝。每一尖峰代表一個諧波,諧波頻率不穩定所以呈尖峰圖形。幾個相鄰的比較高的尖峰組成共振峰,共振峰頻率是它們的包絡線所在的峰值。
MFCC
理論
https://my.oschina.net/jamesju/blog/193343
http://blog.csdn.net/u014332048/article/details/43021789
?兩個DCT公式貌似不一樣,MFCC的維度到底和什么相關?本來以為是濾波器個數。
https://my.oschina.net/zzw922cn/blog/533175
http://blog.csdn.net/fengzhonghen/article/details/51722555
http://blog.csdn.net/joey_su/article/details/36414877
快速傅立葉變換后的點數(維度)由來
這里需要先介紹下Nyquist頻率,奈奎斯特頻率(Nyquist頻率)是離散信號系統采樣頻率的一半,因哈里·奈奎斯特(Harry Nyquist)或奈奎斯特-香農采樣定理得名。采樣定理指出,只要離散系統的奈奎斯特頻率高於被采樣信號的最高頻率或帶寬,就可以避免混疊現象。在語音系統中我通常采樣率取16khz,而人發生的頻率在300hz~3400hz之間,按照Nyquist頻率的定義就有Nyquist頻率等於8khz高於人發生的最高頻率,滿足Nyquist頻率的限制條件。FFT就是根據Nyquist頻率截取采樣率的一半來計算,具體來說就是,假設一幀有512個采樣點,傅里葉變換的點數也是512,經過FFT計算后輸出的點數是257(N/2+1),其含義表示的是從0(Hz)到采樣率/2(Hz)的N/2+1點頻率的成分。也就是說在經過FFT計算時不僅把信號從時域轉到了頻域並且去除了高於被采樣信號的最高頻率的點的影響,同時也降低了維度。
參數
TARGETRATE=100000
-窗間隔為10ms
WINDOWSIZE=250000
-窗長為25ms
注:HTK中時間單位為100ns
ZMEANSOURCE=T
-將來源文件取zeromean,即去掉DC值
USEHAMMING=T
-使用hammingwindow
PREEMCOEF=0.97
-預加重系數0.97
NUMCHANS=26
-在MEL刻度下等分成26個頻帶
USEPOWER=F
-不使用c(0)參數
NUMCEPS=13
-最后使用13階MFCC
CEPLIFTER= 22
-倒譜濾波系數
ENORMALISE=T
-窗的能量值做正規化
LOFREQ=200
-設定頻帶的下截止頻率
HIFREQ=3500
-設定頻帶的上截止頻率
代碼
htk計算mfcc
github:Gist: 里面的mfcc之后好好看看,瀏覽了一下,寫的很少。
Delta
式中,dt表示第t個一階差分,Ct表示第t個倒譜系數,Q表示倒譜系數的階數,K表示一階導數的時間差,可取1或2。將上式的結果再代入就可以得到二階差分的參數。
Voice-Activity-detection-master
Code
stringstream ss;
ss << "example_" << i << ".txt";
ofstream myfile;
cout << ss.str();
const string &s = ss.str();
const char * p = s.c_str();
myfile.open (ss.str());
//error
/your_VAD_folder/VAD/Voice-Activity-Detection-master/voice_detection.cpp: In function ‘int main()’:
/your_VAD_folder/VAD/Voice-Activity-Detection-master/voice_detection.cpp:91:24: error: no matching function for call to ‘std::basic_ofstream<char>::open(std::basic_stringstream<char>::__string_type)’
myfile.open (ss.str());
^
//修改:使用C的字符串。
const string &s = ss.str();
const char * p = s.c_str();
myfile.open (p);
//因為std::ofstream::open中
//c++11
void open (const char* filename, ios_base::openmode mode = ios_base::out);
void open (const string& filename, ios_base::openmode mode = ios_base::out);
//c++98
void open (const char* filename, ios_base::openmode mode = ios_base::out);
//C++的string類無法作為open的參數。
操作
sudo apt-get install fftw3 fftw3-dev fftw3-doc
PCM (脈沖編碼調制)
wav格式 signed 16 bit PCM
歸一化時除以2的15次,因為第16位是符號
(若非特別聲明,文章均為Vanessa的個人筆記,轉載請注明出處。文章如有侵權內容,請聯系我,我會及時刪除)
