何建軍
【摘要】? ? 本文在安卓平臺(tái)上設(shè)計(jì)實(shí)現(xiàn)了基于GMM模型的說話人識別系統(tǒng),完成了GMM模型參數(shù)的訓(xùn)練和識別過程。并基于TIMIT語料庫,通過調(diào)整GMM階數(shù)和測試人數(shù),對基于GMM模型的說話人識別系統(tǒng)的時(shí)效性進(jìn)行了驗(yàn)證分析。實(shí)驗(yàn)結(jié)果表明:①GMM模型的階數(shù)越多,系統(tǒng)的識別時(shí)間越長;②測試人數(shù)越多,系統(tǒng)的識別時(shí)間越長。在GMM模型階數(shù)不高以及使用人數(shù)不多的情況下,該說話人識別系統(tǒng)基本滿足用戶的使用需求。
【關(guān)鍵詞】? ? 美爾頻率倒譜系數(shù)? ? 高斯混合模型? ? 說話人識別? ? 安卓
引言:
說話人識別,也叫聲紋識別,是通過對說話人語音信號的分析處理來完成說話人的辨認(rèn)或確認(rèn)。隨著嵌入式軟硬件技術(shù)和無線通信領(lǐng)域的迅猛發(fā)展,語音輸入和控制將成為手持移動(dòng)設(shè)備和嵌入式系統(tǒng)最佳的交互方式,以聲紋信息為特征的身份鑒別技術(shù)也越發(fā)顯得重要。
與基于PC機(jī)的說話人識別系統(tǒng)相比,雖然基于嵌入式設(shè)備的說話人識別系統(tǒng)在存儲(chǔ)容量、運(yùn)算速度等方面都不及PC機(jī),但是,基于嵌入式設(shè)備的說話人識別系統(tǒng)由于同時(shí)具備嵌入式系統(tǒng)本身的低功耗、便攜性、可靠性,以及說話人識別技術(shù)的準(zhǔn)確性、方便性、經(jīng)濟(jì)性等諸多優(yōu)勢[1],隨著嵌入式軟硬件技術(shù)和無線電通信技術(shù)的迅猛發(fā)展,基于嵌入式設(shè)備的說話人識別系統(tǒng)的優(yōu)勢越發(fā)彰顯。
一、說話人識別技術(shù)
目前,說話人識別新技術(shù)接連不斷出現(xiàn),如GMM-UBM結(jié)構(gòu)[2]與支持向量機(jī)(support vector machine,簡稱SVM) [3-4]結(jié)合技術(shù)、基于得分規(guī)整技術(shù)的HNORM、ZNORM和TNORM技術(shù)、潛伏因子分析(latent factor analysis,簡稱LFA)技術(shù)、大詞匯表連續(xù)語音識別(large vocabulary continuous speech recognition,簡稱LVCSR)應(yīng)用于說話人識別技術(shù)、話音信號中的高維信息使用、以及用于解決通道失配問題的SMS技術(shù)等等。然而,當(dāng)今最出色的說話人識別系統(tǒng)依然是基于GMM模型的,尤其是基于UBM-MAP結(jié)構(gòu)的。
說話人識別的目的是識別出說話人的身份,其前提是需要提供說話人所講的一段話,從而從該語音中提取能夠反映說話人個(gè)性的特征參數(shù),再分析和處理這些參數(shù),最終甄別出說話人的身份。其實(shí)質(zhì)是一個(gè)模式識別[5-6]的問題,基本原理是將待識別的說話人模型與現(xiàn)存模板庫中的模型進(jìn)行比較,根據(jù)概率似然度或某種距離來判定待識別的說話人是庫中哪個(gè)說話人,或判斷待識別的說話人究竟是不是所聲稱的那個(gè)說話人。說話人識別系統(tǒng)通常由語音信號預(yù)處理、說話人特征參數(shù)提取、模型參數(shù)訓(xùn)練、模式匹配和結(jié)果判決等幾部分組成,其基本結(jié)構(gòu)框圖[7]如圖1所示。此外,說話人識別系統(tǒng)還必須對判決閾值進(jìn)行選擇,從而達(dá)到較好的識別效果。
一個(gè)完整的說話人識別系統(tǒng)的建立和應(yīng)用可分為模型參數(shù)訓(xùn)練階段和結(jié)果識別階段[8]。
模型訓(xùn)練框圖如圖2所示。
結(jié)果識別框圖如圖3所示。
本文語音加窗預(yù)處理使用的是漢明窗,采用美爾頻率倒譜系數(shù)(Mel Frequency Cepstrum Coefficient,簡稱MFCC)[9-11]作為特征參數(shù),采用高斯混合模型作為訓(xùn)練/識別模型。
二、系統(tǒng)實(shí)現(xiàn)及實(shí)驗(yàn)結(jié)果分析
2.1系統(tǒng)在安卓平臺(tái)的實(shí)現(xiàn)
2.1.1 軟件開發(fā)環(huán)境
軟件開發(fā)環(huán)境如下:
1.操作系統(tǒng):Windows XP;
2.開發(fā)環(huán)境:Eclipse 3.5;
3.開發(fā)工具包:JDK1.6和Android 2.2 SDK。
2.1.2 用戶界面
用戶界面是使用安卓提供的GUI組件實(shí)現(xiàn)的,最終實(shí)現(xiàn)的效果如圖4所示。
訓(xùn)練部分:訓(xùn)練時(shí),先設(shè)置特征向量和GMM模型參數(shù),然后點(diǎn)擊“選擇語音文件”按鈕選擇訓(xùn)練語音文件,最后點(diǎn)擊“建立模型”或“繼續(xù)訓(xùn)練”按鈕進(jìn)行模型訓(xùn)練,并保存模型參數(shù),模型訓(xùn)練流程如圖5所示。
識別時(shí),同樣需要先設(shè)置特征向量和GMM模型參數(shù),然后點(diǎn)擊“選擇語音文件”選擇待識別語音文件,最后點(diǎn)擊“識別”按鈕進(jìn)行識別并輸出匹配結(jié)果,識別流程如圖6所示。
2.1.3 語音數(shù)據(jù)
語音數(shù)據(jù)提取主要實(shí)現(xiàn)由類WavReader(如圖7所示)完成,用戶選擇語音文件后,在選擇“建立模型”、“繼續(xù)訓(xùn)練”或“識別”按鈕時(shí),主程序?qū)⒄Z音文件路徑傳入類WavReader中,類WavReader則從語音文件中讀取并返回語音數(shù)據(jù)。
類WavReader的主要成員方法說明:
1. public WavReader( String fileName )
該方法用于實(shí)例化一個(gè)WavReader對象。其中,方法參數(shù)為待讀取的語音文件路徑。
2. public int getSampleRate( )
該方法用于獲取wav文件的采樣率。
3. public int getNumSamples( )
該方法用于獲取wav文件數(shù)據(jù)點(diǎn)數(shù),即語音數(shù)據(jù)采樣點(diǎn)數(shù)。
4. public double[] getSampleData( )
該方法用于獲取Wav文件語音數(shù)據(jù),獲取的語音數(shù)據(jù)長度為getNumSamples()的返回值。
2.1.4 特征提取
本文采用MFCC作為特征參數(shù),先將語音的功率譜轉(zhuǎn)換成Mel頻率對應(yīng)的功率譜,再進(jìn)行濾波取對數(shù),最后進(jìn)行離散余弦變換的方法求取出來,其計(jì)算流程如圖8所示。
特征提取的主要實(shí)現(xiàn)由類MFCC(如圖9所示)完成,用戶選擇語音文件后,再次選擇“建立模型”、“繼續(xù)訓(xùn)練”或“識別”按鈕時(shí),主程序?qū)⒆x取出的語音采樣數(shù)據(jù)與待提取特征矢量的相關(guān)參數(shù)傳入類MFCC中,類MFCC則進(jìn)行特征參數(shù)提取并返回特征矢量。
類MFCC的主要成員方法說明:
1. public MFCC(int sampleRate, int windowSize, int incSize, int
numberCoefficients, int numberFilters)
該方法用于實(shí)例化一個(gè)MFCC對象。其中,方法參數(shù)sampleRate為語音數(shù)據(jù)采樣率;windowSize為一幀語音數(shù)據(jù)采樣點(diǎn)數(shù),即幀長;incSize為相鄰兩幀重疊點(diǎn)數(shù),即幀移;numberCoefficients為MFCC參數(shù)維數(shù);numberFilters為Mel尺度濾波器數(shù)。
2. public float[][] melcepst(double input[])
該方法用于從語音數(shù)據(jù)中提取MFCC特征參數(shù)。其中,方法參數(shù)input為從wav文件中提取出來的語音數(shù)據(jù)。
3. private double[] hamming(int size)
該方法用于產(chǎn)生漢明窗。其中,方法參數(shù)size為窗口長度。
4. private double[][] enframe(double input[], double window[], int frameShift)
該方法用于對語音數(shù)據(jù)進(jìn)行分幀。其中,方法參數(shù)input為待分幀語音數(shù)據(jù);window為幀長,也是加窗操作的漢明窗窗口長度;frameShift為幀移。
5. private Map rfft(double input[][], int row, int column, int n, int dim)
該方法用于計(jì)算語音信號的頻譜,即進(jìn)行短時(shí)傅里葉變換(DFT)。其中,方法參數(shù)input為分幀后的語音數(shù)據(jù);row為分幀語音數(shù)據(jù)的列數(shù);column為分幀語音數(shù)據(jù)的行數(shù);n為FFT變換點(diǎn)數(shù);dim為矩陣維數(shù)。
6. private Map melbankm(int melChnNum, int fftSize, int fs, float fl, float fh)
該方法用于計(jì)算Mel尺度濾波器系數(shù)。其中,方法參數(shù)melChnNum為Mel尺度濾波器數(shù);fftSize為FFT長度;fs為采樣率;fl為Mel濾波器的開始間隔;fh為Mel濾波器的結(jié)束間隔。
7. private double[][] rdct(double x[][], int m, int k)
該方法用于對Mel尺度濾波器輸出的對數(shù)功率譜進(jìn)行反離散余弦變換(DCT)。其中,方法參數(shù)x為濾波器輸出的對數(shù)功率譜;m為FFT長度;k為幀長。
2.1.5 模型訓(xùn)練/識別
模型訓(xùn)練/識別的主要實(shí)現(xiàn)由類Gauss(如圖10所示)完成,用戶選擇語音文件,及選擇“建立模型”或“繼續(xù)訓(xùn)練”后,主程序?qū)⒆x取出的語音采樣數(shù)據(jù)與待提取特征矢量的相關(guān)參數(shù)傳入類Gauss中,類Gauss則進(jìn)行GMM模型參數(shù)估計(jì)。
類Gauss的主要成員方法說明:
1. public Map gaussmix(float x[][], float c, float l, int m0, String v0)
該方法用于初始化GMM模型參數(shù)。其中,方法參數(shù)x為MFCC特征參數(shù);c為最小方差的歸一化數(shù)據(jù);l的整數(shù)部分為最大迭代次數(shù),小數(shù)部分為迭代終止閥值;m0為GMM混合數(shù);v0為GMM初始方法設(shè)置。
本函數(shù)采用K-均值聚類算法初始化GMM模型參數(shù)。
2. public Map gaussmix(float x[][], float c, float l, float m0[][], float v0[][], float w0[])
該方法用于估計(jì)GMM模型參數(shù)。其中,方法參數(shù)x為MFCC特征參數(shù);c為最小方差的歸一化數(shù)據(jù);l的整數(shù)部分為最大迭代次數(shù),小數(shù)部分為迭代終止閥值;m0為GMM模型的均值矩陣;v0為GMM模型的方差矩陣;w0為GMM模型的權(quán)重向量。
本函數(shù)采用EM算法對GMM模型參數(shù)進(jìn)行估算。
3. public Map gaussmixp(float y[][], float m[][], float v[][], float w[])
該方法用于計(jì)算對數(shù)似然度。其中,方法參數(shù)y為MFCC特征參數(shù);m為GMM模型的均值矩陣;v為GMM模型的方差矩陣;w為GMM模型的權(quán)重向量。
4. private Map gaussmix_train_diagonal(float xs[][], float m[][], float v[][],float w[],float c, float l, float sx0[], float mx0[])
該方法用于估計(jì)GMM模型參數(shù),協(xié)方差矩陣取對角陣。其中,方法參數(shù)xs為MFCC特征參數(shù);m為GMM模型的均值矩陣;v為GMM模型的方差矩陣;w為GMM模型的權(quán)重向量;c為最小方差的歸一化數(shù)據(jù);l的整數(shù)部分為最大迭代次數(shù),小數(shù)部分為迭代終止閥值;sx0和mx0為gaussmix( )方法內(nèi)部使用變量。
5. public Map kmeans(float d[][], int k, String x0, int l)
該方法為K-均值聚類算法。其中,方法參數(shù)d為待分類的數(shù)據(jù);k為GMM模型混合數(shù);x0為初始化方法設(shè)置;l為最大迭代次數(shù)。
2.1.6 模型參數(shù)存取
模型訓(xùn)練完成后,需將模型參數(shù)存儲(chǔ)在SD卡中,在識別時(shí)從SD卡讀出。模型參數(shù)存取的主要實(shí)現(xiàn)由類Matrix(如圖11所示)完成。
識別時(shí),同樣需要先設(shè)置特征向量和GMM模型參數(shù),然后點(diǎn)擊“選擇語音文件”選擇待識別語音文件,最后點(diǎn)擊“識別”按鈕進(jìn)行識別并輸出匹配結(jié)果,識別流程如圖6所示。
操作Matrix的主要方法說明:
1. public void writeMatrix(Matrix matrix,String fileName)
該方法用于將Matrix對象數(shù)據(jù)保存到文件中。其中,方法參數(shù)matrix為待寫入的矩陣數(shù)據(jù);fileName為待寫入文件的文件名。
2. public Matrix? readMatrix(String fileName)
該方法用于從文件中讀取Matrix對象數(shù)據(jù)。其中,方法參數(shù)fileName為待讀取矩陣數(shù)據(jù)的文件名。
估計(jì)出的GMM模型參數(shù)的存儲(chǔ)、讀取分別由函數(shù)writeMatrix()和readMatrix()來完成。
2.1.7 權(quán)限聲明
要實(shí)現(xiàn)對SD卡的寫入、刪除,以及錄音操作,需為應(yīng)用程序添加相應(yīng)操作權(quán)限。應(yīng)用程序的操作權(quán)限需AndroidManifest.xml文件中添加,即在
1.添加寫SD卡權(quán)限
2.添加SD卡文件刪除權(quán)限
3.添加錄音權(quán)限
2.2 實(shí)驗(yàn)結(jié)果分析
在安卓平臺(tái)手機(jī)上進(jìn)行說話人識別,時(shí)效性是影響系統(tǒng)性能的一個(gè)重要指標(biāo)。實(shí)驗(yàn)從TIMIT語音庫中隨機(jī)選取20人的語音作為樣本,分別從不同訓(xùn)練語音時(shí)長和不同測試人數(shù)對說話人識別系統(tǒng)的時(shí)效性進(jìn)行了分析。
2.2.1 實(shí)驗(yàn)環(huán)境
識別系統(tǒng)的運(yùn)行環(huán)境為LG P990手機(jī),其主要配置如下:
1. CPU:雙核1GHz;
2. RAM:512MB;
3.操作系統(tǒng):安卓 2.2。
2.2.2 GMM模型的階數(shù)對系統(tǒng)時(shí)效性的影響
GMM模型的階數(shù)不同,系統(tǒng)的識別時(shí)間也不相同,為了測試不同GMM模型的階數(shù)對系統(tǒng)時(shí)效性的影響,本論文做了GMM模型階數(shù)對系統(tǒng)時(shí)效性影響實(shí)驗(yàn)。
實(shí)驗(yàn)條件如下:從TIMIT語音庫中選取10人的10段語音作為樣本數(shù)據(jù),平均每段語音長4.5秒, 任選其中一段作為測試數(shù)據(jù),在MFCC系數(shù)的維數(shù)為12,測試人數(shù)為10的情況下,分別用不同GMM模型階數(shù)測試系統(tǒng)的識別時(shí)間,測試結(jié)果如表1所示:
從實(shí)驗(yàn)結(jié)果可以看出,GMM模型的階數(shù)越多,系統(tǒng)的識別時(shí)間越長。因此,為安卓平臺(tái)手機(jī)選擇一個(gè)合適的GMM模型階數(shù)是很有必要的。一般來說,階數(shù)的選擇不易取得過高,但也不能太小,往往需要大量的實(shí)驗(yàn)數(shù)據(jù)來確定。
2.2.3 測試人數(shù)對系統(tǒng)時(shí)效性的影響
測試人數(shù)不同,系統(tǒng)的識別時(shí)間也不相同,為了測試不同人數(shù)對系統(tǒng)時(shí)效性的影響,本論文做了測試人數(shù)對系統(tǒng)時(shí)效性影響實(shí)驗(yàn)。
實(shí)驗(yàn)條件如下:從TIMIT語音庫中選取20人的20段語音作為樣本數(shù)據(jù),平均每段語音長4.5秒, 任選其中一段作為測試數(shù)據(jù),在GMM模型的階數(shù)為16,MFCC系數(shù)的維數(shù)為12的情況下,分別用不同人數(shù)測試系統(tǒng)的識別時(shí)間,測試結(jié)果如表2所示:
從實(shí)驗(yàn)結(jié)果可以看出,測試人數(shù)越多,系統(tǒng)的識別時(shí)間越長。因此,在安卓平臺(tái)手機(jī)上進(jìn)行說話人識別,應(yīng)限制使用人數(shù),過長的系統(tǒng)識別時(shí)間是人們所不能接受的。
四、結(jié)束語
本文在Android平臺(tái)上設(shè)計(jì)實(shí)現(xiàn)的基于GMM的說話人識別系統(tǒng),并通過實(shí)驗(yàn)分析了不同模型參數(shù)以及不同人數(shù)對系統(tǒng)時(shí)效性的影響。實(shí)驗(yàn)結(jié)果表明,在GMM模型階數(shù)不高以及使用人數(shù)不多的情況下,本文實(shí)現(xiàn)的說話人識別系統(tǒng)基本滿足用戶的使用需求。
參? 考? 文? 獻(xiàn)
[1]哈斯塔木嘎. 嵌入式Linux環(huán)境下與文本有關(guān)的說話人確認(rèn)系統(tǒng)的實(shí)現(xiàn)[D]. 呼和浩特:內(nèi)蒙古大學(xué)學(xué)位論文,2009:1-2.
[2]周玥媛,孔欽. 基于 GMM-UBM 的聲紋識別技術(shù)的特征參數(shù)研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2020,30(5):76-83.
[3] Cortes C, Vapnik V. Support-Vector Networks[J]. Machine Learning, 1995,20(3):273-297.
[4]李薈, 趙云敏. GMM-UBM和 SVM在說話人識別中的應(yīng)用[J]. 計(jì)算機(jī)系統(tǒng)應(yīng)用,2018,27(1):225-230.
[5]齊敏,李大健,郝重陽. 模式識別導(dǎo)論[M]. 北京:清華大學(xué)出版社,2009:27-30.
[6]孫即祥. 現(xiàn)代模式識別(第二版)[M]. 北京:高等教育出版社,2008:47.
[7] Reynolds D A, Quatieri T F, Dunn R B. Speaker Verification Using Adapted Gaussian Mixture Model[J]. Digital Signal Processing,2000 (10):19-41.
[8]陳強(qiáng). 基于GMM的說話人識別系統(tǒng)研究與實(shí)現(xiàn)[D]. 武漢:武漢理工大學(xué)碩士學(xué)位論文,2010:31.
[9]周萍 沈昊,鄭凱鵬. 基于MFCC 與GFCC 混合特征參數(shù)的說話人識別[J]. 應(yīng)用科學(xué)學(xué)報(bào),2019,37(1):24-32.
[10]邵央等. 基于MFCC和加權(quán)矢量量化的說話人識別系統(tǒng)[J]. 計(jì)算機(jī)工程與應(yīng)用,2002(5):127-128.
[11]蔣皓石. 基于矢量量化的說話人識別研究[D]. 長沙:國防科學(xué)技術(shù)大學(xué)碩士學(xué)位論文,2005:24-26.