基于FPGA的說(shuō)話(huà)人識別系統,包含原理圖、源代碼
項目實(shí)施背景及可行性分析:
隨著(zhù)網(wǎng)絡(luò )信息化技術(shù)的迅猛發(fā)展,身份驗證的數字化、隱性化、便捷化顯得越來(lái)越重要。語(yǔ)言作為人類(lèi)的自然屬性之一,說(shuō)話(huà)人語(yǔ)言具有各自的生物特征,這使得通過(guò)語(yǔ)音分析進(jìn)行說(shuō)話(huà)人識別(Speaker Recognition, RS)成為可能。人的語(yǔ)音可以非常自然的產(chǎn)生,訓練和識別時(shí)并不需要特別的輸入設備,諸如個(gè)人電腦普遍配置的麥克風(fēng)和到處都有的電話(huà)都可以作為輸入設備,因此采用說(shuō)話(huà)人語(yǔ)音進(jìn)行說(shuō)話(huà)人識別和其他傳統的生物識別技術(shù)相比,具有更為簡(jiǎn)便、準確、經(jīng)濟及可擴展性良好等眾多優(yōu)勢。
說(shuō)話(huà)人識別的研究始于20世紀60年代,如今在特征提取、模型匹配、環(huán)境適應性等方面的研究已臻于成熟,各種算法也趨于穩定,說(shuō)話(huà)人識別技術(shù)也正逐步進(jìn)入到實(shí)用化階段。因此,我們根據已有的特征提取算法基于FPGA工具搭建說(shuō)話(huà)人識別系統是可行的。
項目目前進(jìn)度:
系統具體方案及模型已搭建成功,并采用最小距離算法對系統進(jìn)行說(shuō)話(huà)人確認和說(shuō)話(huà)人辨認的matlab仿真。 仿真結果顯示,識別成功。
項目實(shí)施方案:
1 項目基本框圖:
圖1 說(shuō)話(huà)人識別基本框圖
圖1是一個(gè)典型的說(shuō)話(huà)人識別框圖,包括訓練和識別兩個(gè)部分,訓練又分為訓練語(yǔ)音預處理、特征提取、訓練建模、獲取模型參數庫四個(gè)過(guò)程,識別部分分為測試語(yǔ)音預處理、特征提取、模式匹配、判決輸出四個(gè)過(guò)程。識別部分的模式匹配模塊是將測試語(yǔ)音的特征矢量同模型庫里的特征矢量進(jìn)行距離匹配。
2 具體步驟
2.1 預處理
無(wú)論是訓練語(yǔ)音信號還是測試語(yǔ)音信號在進(jìn)行特征提取之前都要進(jìn)行預處理。預處理包括預加重、分幀加窗、端點(diǎn)檢測等。
(1)預加重:正常人的語(yǔ)音頻率范圍一般為40Hz~4000Hz,在求語(yǔ)音信號頻譜時(shí),頻率越高相應的頻譜成分越小,高頻部分的頻譜比低頻部分的難求,預加重的目的是對語(yǔ)音信號的高頻部分(大約800Hz以上)加以提升,是信號的頻譜變得平坦,以便于頻譜分析。預加重在語(yǔ)音信號數字化之后進(jìn)行,用一階數字濾波器來(lái)實(shí)現,公式為:
(1)
其中,為預加重系數,它的值接近1,本項目取0.9375。
(2)分幀加窗:語(yǔ)音信號在很短的一個(gè)時(shí)間內可以認為是平穩的,所以我們在對其處理時(shí),先對語(yǔ)音信號分幀,對每幀信號處理就相當于對固定特性的持續語(yǔ)音進(jìn)行處理。一幀語(yǔ)音信號時(shí)長(cháng)約10~30ms,本系統采樣頻率為22050Hz,所以,幀長(cháng)N取256,幀移為128。.分幀后,對每幀信號采取加窗處理,為避免吉布斯效應,本系統采用長(cháng)度為256的漢明窗,其表達式為:
(2)
其中表示該窗的中心坐標。
(3)端點(diǎn)檢測:端點(diǎn)檢測的目的是從包含語(yǔ)音的一段信號中消除無(wú)聲段的噪音和減少處理語(yǔ)音段的時(shí)間,確定出語(yǔ)音的起點(diǎn)以及終點(diǎn)。本系統通過(guò)短時(shí)能量的大小來(lái)區分清音段和濁音段。設第n幀語(yǔ)音信號的短時(shí)能量為
,其計算公式如下:
(3)
清音的能量較小,濁音的能量較大。
在進(jìn)行說(shuō)話(huà)人語(yǔ)音端點(diǎn)檢測時(shí),首先根據背景噪聲確定一個(gè)短時(shí)能量的門(mén)限閾值,由于我們獲取說(shuō)話(huà)人語(yǔ)音信息時(shí)是在安靜環(huán)境下進(jìn)行的的,所以?xún)H根據此門(mén)限來(lái)確定語(yǔ)音的起點(diǎn)和終點(diǎn)也是可行的。但為了避免突發(fā)性的瞬時(shí)噪聲(其短時(shí)能量有時(shí)比較大)的干擾,我們在此基礎上,進(jìn)行了進(jìn)一步的限定,即,一旦檢測到某幀的短時(shí)能量超過(guò)了門(mén)限,我們再繼續檢測接下來(lái)的32(經(jīng)驗值)幀,如果在這32幀里有3/4(經(jīng)驗值)的幀其短時(shí)能量都超過(guò)了門(mén)限,我們才確定最初檢測的幀為語(yǔ)音起點(diǎn),否則繼續下一幀的檢測。實(shí)驗仿真證明,這種方法相比于單純通過(guò)門(mén)限值判斷能更好地確定語(yǔ)音的起始點(diǎn)和終點(diǎn)。
2.2 特征提取、訓練、識別
2.2.1 特征提取
語(yǔ)音信號的特征提取是說(shuō)話(huà)人識別的關(guān)鍵問(wèn)題。對一幀語(yǔ)音信號進(jìn)行某種變換以后產(chǎn)生的相應矢量,如線(xiàn)性預測系數、LPC倒譜系數、線(xiàn)譜對參數、共振峰率、短時(shí)譜等。綜合考慮性能和硬件實(shí)現復雜度,在本系統中我們選擇語(yǔ)音信號的短時(shí)譜作為其特征參數。首先我們對分幀加窗后的語(yǔ)音信號進(jìn)行短時(shí)傅里葉變換,得到每幀語(yǔ)音信號頻譜的幅值分布,再根據這些頻譜幅值分布提取每一幀的特征矢量。
設加窗后的第n幀語(yǔ)音信號記為,其短時(shí)傅里葉變換表示為:
(4)
在本系統,我們用DFT來(lái)等價(jià)短時(shí)傅里葉變換。對所求得的幀信號的頻譜幅值分布進(jìn)行分析:每4個(gè)樣本點(diǎn)求一次最大幅值,記錄下對應最大幅值的那個(gè)樣本點(diǎn)標號,這樣長(cháng)256的一幀信號可以得到64個(gè)這樣的樣本點(diǎn)。取這64個(gè)樣本點(diǎn)組成的矢量向量為該幀的特征矢量。對輸入語(yǔ)音的所有幀特征矢量求平均,得該輸入語(yǔ)音的幀平均特征矢量,即該語(yǔ)音的特征矢量,記為。
2.2.2 訓練建模
在訓練建模部分,我們建立識別模型,所謂識別模型,是指用什么模型來(lái)描述說(shuō)話(huà)人的語(yǔ)音特征在特征空間的分布。對于說(shuō)話(huà)人識別系統,特征參數被提取出來(lái)后,需要用識別模型為說(shuō)話(huà)人建模,并對特征進(jìn)行分類(lèi),以確定屬于哪一個(gè)說(shuō)話(huà)人。目前常用的識別模型有,最小距離模型,矢量量化模型,隱馬爾可夫模型,高斯混合模型。綜合考慮下,本系統采用最小距離模型對說(shuō)話(huà)人語(yǔ)音進(jìn)行訓練。
本系統實(shí)驗時(shí)說(shuō)話(huà)人訓練次數取為10,首先對每次訓練的輸入語(yǔ)音求特征矢量(
),再對10次訓練產(chǎn)生的特征矢量求平均得到的平均特征矢量
,將此平均特征矢量作為說(shuō)話(huà)人訓練所得的模型特征矢量。
2.2.3 識別
說(shuō)話(huà)人識別包括說(shuō)話(huà)人辨別和說(shuō)話(huà)人確認,說(shuō)話(huà)人辨別是從多個(gè)說(shuō)話(huà)人語(yǔ)音中辨認出某個(gè)人的那一段語(yǔ)音信息,而說(shuō)話(huà)人確認是確定某段語(yǔ)音信息是不是某人所說(shuō)。
我們用測試數據與訓練數據的平均特征矢量之間的均方差作為一種距離度量。在說(shuō)話(huà)人確認中,我們設定一個(gè)判決閾值,如果測試者數據與訓練數據的距離小于此閾值,我們就認為確認到了原說(shuō)話(huà)人;在說(shuō)話(huà)人辨認中,我們把與測試說(shuō)話(huà)人距離最小的說(shuō)話(huà)人作為目標說(shuō)話(huà)人。
二、Matlab仿真結果
我們通過(guò)Windows自帶的錄音機得到聲音數字信號,采樣頻率為22050Hz,單聲道。說(shuō)話(huà)人數為2,在訓練階段,每個(gè)說(shuō)話(huà)人說(shuō)10次‘芝麻開(kāi)門(mén)’。
圖2 說(shuō)話(huà)人zx的測試語(yǔ)音‘zx316’的相關(guān)圖
圖3 語(yǔ)音信號‘zx316’第一幀的短時(shí)傅里葉頻譜幅值分布
圖4 語(yǔ)音信號‘bb13’第一幀的短時(shí)傅里葉頻譜幅值分布
測試語(yǔ)音‘zx316’第一幀的特征向量:
1 8 12 16 19 23 27 31 33 38 43 46 50 53 57 64 65 72 73 80 81 88 91 96 97 103 106 111 113 117 122 125 132 136 140 141 147 152 153 160 161 167 169 176 177 183 186 190 193 198 202 208 209 215 220 221 227 231 235 239 241 245 249 256
測試語(yǔ)音‘bb13’第一幀的特征向量:
1 7 12 16 17 21 26 29 34 37 44 47 49 56 58 61 65 70 73 80 81 85 92 93 98 104 105 110 115 117 121 128 130 136 138 143 145 150 154 157 162 166 169 176 177 181 188 191 193 200 202 205 211 213 220 221 228 232 233 239 242 245 249 256
測試語(yǔ)音‘zx316’平均特征向量avtzv1:
2.8056 6.6157 10.5185 14.3009 18.6667 22.5972 26.1296 30.2361 34.6435 38.7407 42.1389 46.4444 50.4907 54.1296 58.6250 62.9583 66.1296 70.7546 74.2824 78.0000 82.1759 86.5324 90.3472 94.4583 98.4352 102.5926 106.3102 110.3009 114.4722 117.9537 122.1065 126.3889 130.5139 134.8333 138.8056 142.4167 146.6852 150.9120 154.2685 158.4537 162.5926 166.6204 170.3241 174.8426 178.8333 182.7963 186.4815 190.8796 194.2222 198.3935 203.2130 206.5648 210.2824 214.7963 218.1852 222.0787 226.6944 231.3287 234.9676 238.6435 242.8565 246.7037 250.3102 253.9491
測試語(yǔ)音‘bb013’平均特征向量avtz2:
2.6385 7.3991 10.3756 14.8357 18.7324 22.0423 26.1455 30.1643 34.5493 38.0423 42.7746 46.9014 49.6432 54.0751 58.5305 62.5493 66.7324 70.8216 75.1502 78.0376 81.9718 86.4695 90.6432 93.7700 99.2347 101.9390 106.6291 110.4883 113.9296 118.6854 122.0329 126.2817 130.5211 134.7418 138.3897 143.1972 146.7371 150.3615 155.1080 158.0376 163.1080 166.3991 170.8920 175.2441 179.2300 181.8075 185.8404 189.8826 194.5915 198.5587 202.5446 206.9061 210.4413 214.3568 218.5915 222.6197 226.2629 230.9108 235.0939 238.4648 241.8732 246.7606 249.9249 253.8216
十次訓練后,說(shuō)話(huà)人zx的模型特征向量zxtzv:
2.6470 6.3738 10.4790 14.1162 18.7036 22.6037 26.2209 29.9523 34.3714 38.8523 42.3689 46.4702 50.5910 54.0536 58.4656 62.8491 66.2164 70.5120 74.2916 78.2231 82.2290 86.6381 90.4263 94.4608 98.5462 102.5562 106.3308 110.3999 114.2824 118.1380 122.1408 126.2868 130.6763 134.8471 138.7515 142.6162 146.6641 150.7192 154.2886 158.3545 162.5407 166.5522 170.2916 174.8380 178.7560 182.8976 186.5329 190.8797 194.2625 198.4912 203.1178 206.6151 210.4543 214.7273 218.0488 222.2090 226.7668 230.8650 234.7660 238.3485 242.7473 246.7412 250.4028 253.8851
訓練所得說(shuō)話(huà)人zx的確認閾值為zxp:
0.0403
十次訓練后,說(shuō)話(huà)人bb的模型特征向量bbtzv:
2.5516 7.3047 10.2896 15.0233 18.7163 21.7753 25.8263 30.4965 34.4767 38.2047 42.6746 46.2591 49.9754 54.4766 58.5582 62.7232 66.4625 71.0343 74.8362 78.0749 82.2228 86.1855 90.2439 94.4314 98.5723 102.5504 106.2111 110.1579 114.2530 118.2325 122.2810 126.2972 130.5383 134.6598 138.7651 142.7511 146.8711 150.7495 154.4465 158.1874 162.6890 166.6006 170.9542 174.7016 179.1256 182.1497 186.1302 190.4031 194.2276 198.4698 202.4609 206.8553 210.8231 214.4258 218.5462 222.5539 226.4384 231.2354 235.0389 238.5223 241.7803 246.7281 249.9968 253.8746
訓練所得說(shuō)話(huà)人bb的確認閾值為bbp:
0.0940
說(shuō)話(huà)人確認時(shí):
- 計算測試語(yǔ)音語(yǔ)音1(zx036)的特征向量avtzv1與說(shuō)話(huà)人zx的模型特征向量zxtzv的距離,為0.0196,小于說(shuō)話(huà)人zx的確認閾值為zxp(0.0403),所以確認測試語(yǔ)音1為zx所說(shuō);計算測試語(yǔ)音2(bb13)的特征向量avtzv2與說(shuō)話(huà)人zx的模型特征向量zxtzv的距離,為0.2310,大于說(shuō)話(huà)人zx的確認閾值為zxp(0.0403),所以確認測試語(yǔ)音2不是zx所說(shuō)。
- 計算測試語(yǔ)音語(yǔ)音1(zx036)的特征向量avtzv1與說(shuō)話(huà)人bb的模型特征向量bbtzv的距離,為0.1292,大于說(shuō)話(huà)人bb的確認閾值為bbp(0.0940),所以確認測試語(yǔ)音1不是bb所說(shuō);計算測試語(yǔ)音2(bb13)的特征向量avtzv2與說(shuō)話(huà)人bb的模型特征向量bbtzv的距離,為0.0932,小于說(shuō)話(huà)人bb的確認閾值為bbp(0.0940),所以確認測試語(yǔ)音2是bb所說(shuō)。
說(shuō)話(huà)人辨認:
- 計算測試語(yǔ)音語(yǔ)音1(zx036)的特征向量avtzv1與說(shuō)話(huà)人zx的模型特征向量zxtzv的距離,為0.0196;計算測試語(yǔ)音語(yǔ)音1(zx036)的特征向量avtzv1與說(shuō)話(huà)人bb的模型特征向量bbtzv的距離,為0.1292。所以,將測試語(yǔ)音1辨認為zx所說(shuō)。
- 計算測試語(yǔ)音2(bb13)的特征向量avtzv2與說(shuō)話(huà)人zx的模型特征向量zxtzv的距離,為0.2310;計算測試語(yǔ)音2(bb13)的特征向量avtzv2與說(shuō)話(huà)人bb的模型特征向量bbtzv的距離,為0.0932。所以,將測試語(yǔ)音1辨認為bb所說(shuō)。
三、 Matlab仿真程序:
1. 說(shuō)話(huà)人確認主函數
%%####=============說(shuō)話(huà)人確認主函數(最小距離)==============####%%
clc;clear;
%============1 流程說(shuō)明========%
%將測試語(yǔ)音與訓練所得模板逐個(gè)進(jìn)行確認,先確定出要確認的說(shuō)話(huà)人的模板的訓練判決閾值,
%再求出每個(gè)測試語(yǔ)音的平均特征向量與此說(shuō)話(huà)人模板特征向量的距離,如果距離小于閾值,
%則確認此測試語(yǔ)音為該說(shuō)話(huà)人所說(shuō),否則不是。
%==========2 符號說(shuō)明===========%
% N:說(shuō)話(huà)人數;K: 特征矢量的長(cháng)度;
% TZV:N*K階的訓練特征矢量矩陣,第nn行表示第nn個(gè)說(shuō)話(huà)人的模型特征矢量;
% DTH: N長(cháng)的訓練判決門(mén)限向量,第nn個(gè)元素代表第nn個(gè)說(shuō)話(huà)人的訓練判決門(mén)限;
% S1: 說(shuō)話(huà)人1的語(yǔ)音信號;S2:說(shuō)話(huà)人2的語(yǔ)音信號;......;SN: 說(shuō)話(huà)人N的語(yǔ)音信號
%=========3 主程序=======%
%===根據訓練數據,求出各個(gè)說(shuō)話(huà)人的訓練特征矢量和訓練判決門(mén)限===%
N=2;
TIMES=10;%訓練次數為10
load A1 A1; %A1為說(shuō)話(huà)人zx的十次訓練語(yǔ)音組成的cell
load A2 A2; %A2為說(shuō)話(huà)人bb的十次訓練語(yǔ)音組成的cell
%.......%
[mtzh1,p1]=xunlian(A1,TIMES);%調用訓練子函數,得說(shuō)話(huà)人的模型特征矢量和模型判決門(mén)限
TZV(1,:)=mtzh1;
DTH(1)=p1;
[mtzh2,p2]=xunlian(A2,TIMES);
TZV(2,:)=mtzh2;
DTH(2)=p2;
%.......%
K=length(mtzh1);
%===說(shuō)話(huà)人說(shuō)話(huà),輪流進(jìn)行確認===%
%==確認說(shuō)話(huà)人1==%
nn=1;
S1=wavread(f:speakerzx3zx316);%%說(shuō)話(huà)人x說(shuō)話(huà)后語(yǔ)音信息被存儲,用函數讀出該語(yǔ)音信號
decisionf(S1,TZV,DTH,nn,K) %確認說(shuō)話(huà)人x是否為說(shuō)話(huà)人1,是輸出‘yes’,不是輸出‘no’
S2=wavread(f:speakerbb1bb13);%%說(shuō)話(huà)人y說(shuō)話(huà)后語(yǔ)音信息被存儲,用函數讀出該語(yǔ)音信號
decisionf(S2,TZV,DTH,nn,K) %確認說(shuō)話(huà)人y是否為說(shuō)話(huà)人1,是輸出‘yes’,不是輸出‘no’
%......%
%==確認說(shuō)話(huà)人2==%
nn=2;
S1=wavread(f:speakerzx3zx316);%%說(shuō)話(huà)人x說(shuō)話(huà)后語(yǔ)音信息被存儲,用函數讀出該語(yǔ)音信號
decisionf(S1,TZV,DTH,nn,K) %確認說(shuō)話(huà)人x是否為說(shuō)話(huà)人2,是輸出‘yes’,不是輸出‘no’
S2=wavread(f:speakerbb1bb13);%%說(shuō)話(huà)人2說(shuō)話(huà)后語(yǔ)音信息被存儲,用函數讀出該語(yǔ)音信號
decisionf(S2,TZV,DTH,nn,K) %確認說(shuō)話(huà)人y是否為說(shuō)話(huà)人2,是輸出‘yes’,不是輸出‘no’
%......%
%=====......=====%
2.說(shuō)話(huà)人辨認主函數
%%####=============說(shuō)話(huà)人辨別主函數(最小距離)==============####%%
clc;clear;
%============1 流程說(shuō)明========%
%對要進(jìn)行辨認的測試說(shuō)話(huà)人提取平均特征向量,和訓練庫中的每個(gè)模板特征矢量進(jìn)行距離比較,我們把與測試說(shuō)話(huà)人具有最小距離的說(shuō)話(huà)人作為目標說(shuō)話(huà)人。
%==========2 符號說(shuō)明===========%
% N:說(shuō)話(huà)人數;K: 特征矢量的長(cháng)度;
% TZV:N*K階的訓練特征矢量矩陣,第nn行表示第nn個(gè)說(shuō)話(huà)人的模型特征矢量;
% DTH: N長(cháng)的訓練判決門(mén)限向量,第nn個(gè)元素代表第nn個(gè)說(shuō)話(huà)人的訓練判決門(mén)限;
% S1: 說(shuō)話(huà)人1的語(yǔ)音信號;S2:說(shuō)話(huà)人2的語(yǔ)音信號;......;SN: 說(shuō)話(huà)人N的語(yǔ)音信號
%=========3 主程序=======%
%===根據訓練數據,求出各個(gè)說(shuō)話(huà)人的訓練特征矢量和訓練判決門(mén)限===%
N=2;
load A1 A1;
load A2 A2;
TIMES=10;%訓練次數為10
[mtzh1,p1]=xunlian(A1,TIMES);%調用訓練函數,得說(shuō)話(huà)人的模型特征矢量和模型判決門(mén)限
TZV(1,:)=mtzh1;
[mtzh2,p2]=xunlian(A2,TIMES);
TZV(2,:)=mtzh2;
K=length(mtzh1);
%===說(shuō)話(huà)人說(shuō)話(huà),進(jìn)行辨認===%
%==辨認說(shuō)話(huà)人1==%
S1=wavread(f:speakerzx3zx316);%%說(shuō)話(huà)人1說(shuō)話(huà)后語(yǔ)音信息被存儲,用函數讀出該語(yǔ)音信號
identify(S1,TZV,N,K)
%==辨認說(shuō)話(huà)人2==%
S2=wavread(f:speakerbb1bb13);%%說(shuō)話(huà)人2說(shuō)話(huà)后語(yǔ)音信息被存儲,用函數讀出該語(yǔ)音信號
identify(S2,TZV,N,K)
3 .子函數1——輸入訓練語(yǔ)音數據,輸出訓練所得模式訓練特征矢量及判決閾值
function [mtzh,p]=xunlian(A,TIMES)
%===輸入為訓練次數TIMES和每次的訓練語(yǔ)音信號的合集A;輸出為訓練所得模型特征矢量及模型判決門(mén)限===%
for tt=1:TIMES %10指每個(gè)說(shuō)話(huà)人的訓練次數
avertzvector(tt,:)=tzhvf(A{tt});
end
mtzh=sum(avertzvector)/TIMES;
%%==========確定判決門(mén)限dehood1=======%%
for ts=1:TIMES
chavec=mtzh-avertzvector(ts,:);
wucha(ts)=chavec*chavec/length(mtzh);
end
p=max(wucha);
4. 子函數2——特征特取子函數
輸入語(yǔ)音信號,輸出特征矢量
%===提取輸入語(yǔ)音信息的特征矢量===%
function avertzvector=tzhvf(x1)
lent1=length(x1);
%%=======預加重更新x1=======%%
u=0.9375;
for num=2:lent1
x1(num-1)=x1(num)-u*x1(num-1);
end
%%=======將語(yǔ)音信號進(jìn)行分幀得y1,加窗得winy1=======%%
framelen=256;%幀長(cháng)
shift=128;%幀移
numframe=ceil(lent1/shift)-1;%%幀數
for numw=1:framelen
hw(numw)=0.54-0.46*cos(2*pi*(numw-1)/(framelen-1));%%漢明窗
end
for num1=1:numframe
a=(num1-1)*framelen/2+1;
b=(num1-1)*framelen/2+framelen;
if b=lent1
y1(num1,:)=x1(a:b);
else
y1(num1,:)=[(x1(a:lent1)),zeros(1,b-lent1)];
end
winy1(num1,:)=y1(num1,:).*hw;%%分幀加窗后的數據
end
%%=========求信號的短時(shí)能量e1==========%%
e1=sum(winy1.^2,2);%%sum(x,2)表示將矩陣x橫向相加,得到每行的和,為一個(gè)列向量
%%========利用短時(shí)能量進(jìn)行端點(diǎn)檢測得到起始幀號startnum和結束幀號endnum==========%%
menxian=9e-04;
duliang=32;
for startnum=1:length(e1)
if e1(startnum)>menxian
indc=find(e1(startnum+1:startnum+duliang)>menxian);
if length(indc)/duliang>=3/4
break;
end
end
end
for endnum=length(e1):-1:1
if e1(endnum)>menxian
indc=find(e1(endnum-duliang:endnum-1)>menxian);
if length(indc)/duliang>=3/4
break;
end
end
end
data1=winy1(startnum:endnum,:);%%data為去除無(wú)聲段的語(yǔ)音數據(分幀加窗后的)
%%===========短時(shí)傅里葉變換=============%%
newnumframe=endnum-startnum+1;
for num2=1:newnumframe
STFTdata1(num2,:)=abs(fft(data1(num2,:),framelen));
%SFTwindata1(num2,:)=abs(windata1(num2,:)*exp(-1j*2*pi/framelen*(0:255)*(0:255)));
end
%%=======對每幀求特征向量=========%%
jiange=4;%每四個(gè)點(diǎn)找一次頻譜幅度最大值
for k=1:newnumframe
for kk=0:framelen/jiange-1
aa=jiange*kk+1;
bb=jiange*kk+jiange;
[maximum,ind]=max(STFTdata1(k,aa:bb));
tzvector(k,kk+1)=ind+jiange*kk;%%特征向量
end
end
avertzvector=sum(tzvector)/newnumframe;%語(yǔ)音幀平均特征矢量
5. 子函數3——說(shuō)話(huà)人確認子函數
輸入測試語(yǔ)音,輸出確認結果
function decisionf(S,TZV,DTH,nn,K)
%判決子函數,輸入說(shuō)話(huà)人語(yǔ)音S,模板特征向量矩陣TZV,模板判決門(mén)限DTH,說(shuō)話(huà)人數N,特征向量長(cháng)度K;輸出判決結果
avtzvS=tzhvf(S);%%調用子函數tzhvf提取該語(yǔ)音信息的特征矢量
if (TZV(nn,:)-avtzvS)*(TZV(nn,:)-avtzvS)/K=DTH(nn)
disp(Yes.);
else
disp(No.);
end
6.子函數4——說(shuō)話(huà)人辨認子函數
輸入測試語(yǔ)音,輸出辨認結果
function identify(S,TZV,N,K)
%判決子函數,輸入說(shuō)話(huà)人語(yǔ)音S,模板特征向量矩陣TZV,模板判決門(mén)限DTH,說(shuō)話(huà)人數N,特征向量長(cháng)度K;輸出判決結果
avtzvS=tzhvf(S);%%調用子函數tzhvf提取該語(yǔ)音信息的特征矢量
for nn=1:N
distance(nn)=(TZV(nn,:)-avtzvS)*(TZV(nn,:)-avtzvS)/K;
end
[~,snum]=min(distance);
fprintf(The speaker is %dn,snum);
評論