基于FPGA的說(shuō)話人識(shí)別系統(tǒng),包含原理圖、源代碼
項(xiàng)目實(shí)施背景及可行性分析:
隨著網(wǎng)絡(luò)信息化技術(shù)的迅猛發(fā)展,身份驗(yàn)證的數(shù)字化、隱性化、便捷化顯得越來(lái)越重要。語(yǔ)言作為人類(lèi)的自然屬性之一,說(shuō)話人語(yǔ)言具有各自的生物特征,這使得通過(guò)語(yǔ)音分析進(jìn)行說(shuō)話人識(shí)別(Speaker Recognition, RS)成為可能。人的語(yǔ)音可以非常自然的產(chǎn)生,訓(xùn)練和識(shí)別時(shí)并不需要特別的輸入設(shè)備,諸如個(gè)人電腦普遍配置的麥克風(fēng)和到處都有的電話都可以作為輸入設(shè)備,因此采用說(shuō)話人語(yǔ)音進(jìn)行說(shuō)話人識(shí)別和其他傳統(tǒng)的生物識(shí)別技術(shù)相比,具有更為簡(jiǎn)便、準(zhǔn)確、經(jīng)濟(jì)及可擴(kuò)展性良好等眾多優(yōu)勢(shì)。
說(shuō)話人識(shí)別的研究始于20世紀(jì)60年代,如今在特征提取、模型匹配、環(huán)境適應(yīng)性等方面的研究已臻于成熟,各種算法也趨于穩(wěn)定,說(shuō)話人識(shí)別技術(shù)也正逐步進(jìn)入到實(shí)用化階段。因此,我們根據(jù)已有的特征提取算法基于FPGA工具搭建說(shuō)話人識(shí)別系統(tǒng)是可行的。
項(xiàng)目目前進(jìn)度:
系統(tǒng)具體方案及模型已搭建成功,并采用最小距離算法對(duì)系統(tǒng)進(jìn)行說(shuō)話人確認(rèn)和說(shuō)話人辨認(rèn)的matlab仿真。 仿真結(jié)果顯示,識(shí)別成功。
項(xiàng)目實(shí)施方案:
1 項(xiàng)目基本框圖:
圖1 說(shuō)話人識(shí)別基本框圖
圖1是一個(gè)典型的說(shuō)話人識(shí)別框圖,包括訓(xùn)練和識(shí)別兩個(gè)部分,訓(xùn)練又分為訓(xùn)練語(yǔ)音預(yù)處理、特征提取、訓(xùn)練建模、獲取模型參數(shù)庫(kù)四個(gè)過(guò)程,識(shí)別部分分為測(cè)試語(yǔ)音預(yù)處理、特征提取、模式匹配、判決輸出四個(gè)過(guò)程。識(shí)別部分的模式匹配模塊是將測(cè)試語(yǔ)音的特征矢量同模型庫(kù)里的特征矢量進(jìn)行距離匹配。
2 具體步驟
2.1 預(yù)處理
無(wú)論是訓(xùn)練語(yǔ)音信號(hào)還是測(cè)試語(yǔ)音信號(hào)在進(jìn)行特征提取之前都要進(jìn)行預(yù)處理。預(yù)處理包括預(yù)加重、分幀加窗、端點(diǎn)檢測(cè)等。
(1)預(yù)加重:正常人的語(yǔ)音頻率范圍一般為40Hz~4000Hz,在求語(yǔ)音信號(hào)頻譜時(shí),頻率越高相應(yīng)的頻譜成分越小,高頻部分的頻譜比低頻部分的難求,預(yù)加重的目的是對(duì)語(yǔ)音信號(hào)的高頻部分(大約800Hz以上)加以提升,是信號(hào)的頻譜變得平坦,以便于頻譜分析。預(yù)加重在語(yǔ)音信號(hào)數(shù)字化之后進(jìn)行,用一階數(shù)字濾波器來(lái)實(shí)現(xiàn),公式為:
(1)
其中,為預(yù)加重系數(shù),它的值接近1,本項(xiàng)目取0.9375。
(2)分幀加窗:語(yǔ)音信號(hào)在很短的一個(gè)時(shí)間內(nèi)可以認(rèn)為是平穩(wěn)的,所以我們?cè)趯?duì)其處理時(shí),先對(duì)語(yǔ)音信號(hào)分幀,對(duì)每幀信號(hào)處理就相當(dāng)于對(duì)固定特性的持續(xù)語(yǔ)音進(jìn)行處理。一幀語(yǔ)音信號(hào)時(shí)長(zhǎng)約10~30ms,本系統(tǒng)采樣頻率為22050Hz,所以,幀長(zhǎng)N取256,幀移為128。.分幀后,對(duì)每幀信號(hào)采取加窗處理,為避免吉布斯效應(yīng),本系統(tǒng)采用長(zhǎng)度為256的漢明窗,其表達(dá)式為:
(2)
其中表示該窗的中心坐標(biāo)。
(3)端點(diǎn)檢測(cè):端點(diǎn)檢測(cè)的目的是從包含語(yǔ)音的一段信號(hào)中消除無(wú)聲段的噪音和減少處理語(yǔ)音段的時(shí)間,確定出語(yǔ)音的起點(diǎn)以及終點(diǎn)。本系統(tǒng)通過(guò)短時(shí)能量的大小來(lái)區(qū)分清音段和濁音段。設(shè)第n幀語(yǔ)音信號(hào)的短時(shí)能量為,其計(jì)算公式如下:
(3)
清音的能量較小,濁音的能量較大。
在進(jìn)行說(shuō)話人語(yǔ)音端點(diǎn)檢測(cè)時(shí),首先根據(jù)背景噪聲確定一個(gè)短時(shí)能量的門(mén)限閾值,由于我們獲取說(shuō)話人語(yǔ)音信息時(shí)是在安靜環(huán)境下進(jìn)行的的,所以僅根據(jù)此門(mén)限來(lái)確定語(yǔ)音的起點(diǎn)和終點(diǎn)也是可行的。但為了避免突發(fā)性的瞬時(shí)噪聲(其短時(shí)能量有時(shí)比較大)的干擾,我們?cè)诖嘶A(chǔ)上,進(jìn)行了進(jìn)一步的限定,即,一旦檢測(cè)到某幀的短時(shí)能量超過(guò)了門(mén)限,我們?cè)倮^續(xù)檢測(cè)接下來(lái)的32(經(jīng)驗(yàn)值)幀,如果在這32幀里有3/4(經(jīng)驗(yàn)值)的幀其短時(shí)能量都超過(guò)了門(mén)限,我們才確定最初檢測(cè)的幀為語(yǔ)音起點(diǎn),否則繼續(xù)下一幀的檢測(cè)。實(shí)驗(yàn)仿真證明,這種方法相比于單純通過(guò)門(mén)限值判斷能更好地確定語(yǔ)音的起始點(diǎn)和終點(diǎn)。
2.2 特征提取、訓(xùn)練、識(shí)別
2.2.1 特征提取
語(yǔ)音信號(hào)的特征提取是說(shuō)話人識(shí)別的關(guān)鍵問(wèn)題。對(duì)一幀語(yǔ)音信號(hào)進(jìn)行某種變換以后產(chǎn)生的相應(yīng)矢量,如線性預(yù)測(cè)系數(shù)、LPC倒譜系數(shù)、線譜對(duì)參數(shù)、共振峰率、短時(shí)譜等。綜合考慮性能和硬件實(shí)現(xiàn)復(fù)雜度,在本系統(tǒng)中我們選擇語(yǔ)音信號(hào)的短時(shí)譜作為其特征參數(shù)。首先我們對(duì)分幀加窗后的語(yǔ)音信號(hào)進(jìn)行短時(shí)傅里葉變換,得到每幀語(yǔ)音信號(hào)頻譜的幅值分布,再根據(jù)這些頻譜幅值分布提取每一幀的特征矢量。
設(shè)加窗后的第n幀語(yǔ)音信號(hào)記為,其短時(shí)傅里葉變換表示為:
(4)
在本系統(tǒng),我們用DFT來(lái)等價(jià)短時(shí)傅里葉變換。對(duì)所求得的幀信號(hào)的頻譜幅值分布進(jìn)行分析:每4個(gè)樣本點(diǎn)求一次最大幅值,記錄下對(duì)應(yīng)最大幅值的那個(gè)樣本點(diǎn)標(biāo)號(hào),這樣長(zhǎng)256的一幀信號(hào)可以得到64個(gè)這樣的樣本點(diǎn)。取這64個(gè)樣本點(diǎn)組成的矢量向量為該幀的特征矢量。對(duì)輸入語(yǔ)音的所有幀特征矢量求平均,得該輸入語(yǔ)音的幀平均特征矢量,即該語(yǔ)音的特征矢量,記為。
2.2.2 訓(xùn)練建模
在訓(xùn)練建模部分,我們建立識(shí)別模型,所謂識(shí)別模型,是指用什么模型來(lái)描述說(shuō)話人的語(yǔ)音特征在特征空間的分布。對(duì)于說(shuō)話人識(shí)別系統(tǒng),特征參數(shù)被提取出來(lái)后,需要用識(shí)別模型為說(shuō)話人建模,并對(duì)特征進(jìn)行分類(lèi),以確定屬于哪一個(gè)說(shuō)話人。目前常用的識(shí)別模型有,最小距離模型,矢量量化模型,隱馬爾可夫模型,高斯混合模型。綜合考慮下,本系統(tǒng)采用最小距離模型對(duì)說(shuō)話人語(yǔ)音進(jìn)行訓(xùn)練。
本系統(tǒng)實(shí)驗(yàn)時(shí)說(shuō)話人訓(xùn)練次數(shù)取為10,首先對(duì)每次訓(xùn)練的輸入語(yǔ)音求特征矢量(),再對(duì)10次訓(xùn)練產(chǎn)生的特征矢量求平均得到的平均特征矢量,將此平均特征矢量作為說(shuō)話人訓(xùn)練所得的模型特征矢量。
2.2.3 識(shí)別
說(shuō)話人識(shí)別包括說(shuō)話人辨別和說(shuō)話人確認(rèn),說(shuō)話人辨別是從多個(gè)說(shuō)話人語(yǔ)音中辨認(rèn)出某個(gè)人的那一段語(yǔ)音信息,而說(shuō)話人確認(rèn)是確定某段語(yǔ)音信息是不是某人所說(shuō)。
我們用測(cè)試數(shù)據(jù)與訓(xùn)練數(shù)據(jù)的平均特征矢量之間的均方差作為一種距離度量。在說(shuō)話人確認(rèn)中,我們?cè)O(shè)定一個(gè)判決閾值,如果測(cè)試者數(shù)據(jù)與訓(xùn)練數(shù)據(jù)的距離小于此閾值,我們就認(rèn)為確認(rèn)到了原說(shuō)話人;在說(shuō)話人辨認(rèn)中,我們把與測(cè)試說(shuō)話人距離最小的說(shuō)話人作為目標(biāo)說(shuō)話人。
二、Matlab仿真結(jié)果
我們通過(guò)Windows自帶的錄音機(jī)得到聲音數(shù)字信號(hào),采樣頻率為22050Hz,單聲道。說(shuō)話人數(shù)為2,在訓(xùn)練階段,每個(gè)說(shuō)話人說(shuō)10次‘芝麻開(kāi)門(mén)’。
圖2 說(shuō)話人zx的測(cè)試語(yǔ)音‘zx316’的相關(guān)圖
圖3 語(yǔ)音信號(hào)‘zx316’第一幀的短時(shí)傅里葉頻譜幅值分布
圖4 語(yǔ)音信號(hào)‘bb13’第一幀的短時(shí)傅里葉頻譜幅值分布
測(cè)試語(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
測(cè)試語(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
測(cè)試語(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
測(cè)試語(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
十次訓(xùn)練后,說(shuō)話人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
訓(xùn)練所得說(shuō)話人zx的確認(rèn)閾值為zxp:
0.0403
十次訓(xùn)練后,說(shuō)話人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
訓(xùn)練所得說(shuō)話人bb的確認(rèn)閾值為bbp:
0.0940
說(shuō)話人確認(rèn)時(shí):
- 計(jì)算測(cè)試語(yǔ)音語(yǔ)音1(zx036)的特征向量avtzv1與說(shuō)話人zx的模型特征向量zxtzv的距離,為0.0196,小于說(shuō)話人zx的確認(rèn)閾值為zxp(0.0403),所以確認(rèn)測(cè)試語(yǔ)音1為zx所說(shuō);計(jì)算測(cè)試語(yǔ)音2(bb13)的特征向量avtzv2與說(shuō)話人zx的模型特征向量zxtzv的距離,為0.2310,大于說(shuō)話人zx的確認(rèn)閾值為zxp(0.0403),所以確認(rèn)測(cè)試語(yǔ)音2不是zx所說(shuō)。
- 計(jì)算測(cè)試語(yǔ)音語(yǔ)音1(zx036)的特征向量avtzv1與說(shuō)話人bb的模型特征向量bbtzv的距離,為0.1292,大于說(shuō)話人bb的確認(rèn)閾值為bbp(0.0940),所以確認(rèn)測(cè)試語(yǔ)音1不是bb所說(shuō);計(jì)算測(cè)試語(yǔ)音2(bb13)的特征向量avtzv2與說(shuō)話人bb的模型特征向量bbtzv的距離,為0.0932,小于說(shuō)話人bb的確認(rèn)閾值為bbp(0.0940),所以確認(rèn)測(cè)試語(yǔ)音2是bb所說(shuō)。
說(shuō)話人辨認(rèn):
- 計(jì)算測(cè)試語(yǔ)音語(yǔ)音1(zx036)的特征向量avtzv1與說(shuō)話人zx的模型特征向量zxtzv的距離,為0.0196;計(jì)算測(cè)試語(yǔ)音語(yǔ)音1(zx036)的特征向量avtzv1與說(shuō)話人bb的模型特征向量bbtzv的距離,為0.1292。所以,將測(cè)試語(yǔ)音1辨認(rèn)為zx所說(shuō)。
- 計(jì)算測(cè)試語(yǔ)音2(bb13)的特征向量avtzv2與說(shuō)話人zx的模型特征向量zxtzv的距離,為0.2310;計(jì)算測(cè)試語(yǔ)音2(bb13)的特征向量avtzv2與說(shuō)話人bb的模型特征向量bbtzv的距離,為0.0932。所以,將測(cè)試語(yǔ)音1辨認(rèn)為bb所說(shuō)。
三、 Matlab仿真程序:
1. 說(shuō)話人確認(rèn)主函數(shù)
%%####=============說(shuō)話人確認(rèn)主函數(shù)(最小距離)==============####%%
clc;clear;
%============1 流程說(shuō)明========%
%將測(cè)試語(yǔ)音與訓(xùn)練所得模板逐個(gè)進(jìn)行確認(rèn),先確定出要確認(rèn)的說(shuō)話人的模板的訓(xùn)練判決閾值,
%再求出每個(gè)測(cè)試語(yǔ)音的平均特征向量與此說(shuō)話人模板特征向量的距離,如果距離小于閾值,
%則確認(rèn)此測(cè)試語(yǔ)音為該說(shuō)話人所說(shuō),否則不是。
%==========2 符號(hào)說(shuō)明===========%
% N:說(shuō)話人數(shù);K: 特征矢量的長(zhǎng)度;
% TZV:N*K階的訓(xùn)練特征矢量矩陣,第nn行表示第nn個(gè)說(shuō)話人的模型特征矢量;
% DTH: N長(zhǎng)的訓(xùn)練判決門(mén)限向量,第nn個(gè)元素代表第nn個(gè)說(shuō)話人的訓(xùn)練判決門(mén)限;
% S1: 說(shuō)話人1的語(yǔ)音信號(hào);S2:說(shuō)話人2的語(yǔ)音信號(hào);......;SN: 說(shuō)話人N的語(yǔ)音信號(hào)
%=========3 主程序=======%
%===根據(jù)訓(xùn)練數(shù)據(jù),求出各個(gè)說(shuō)話人的訓(xùn)練特征矢量和訓(xùn)練判決門(mén)限===%
N=2;
TIMES=10;%訓(xùn)練次數(shù)為10
load A1 A1; %A1為說(shuō)話人zx的十次訓(xùn)練語(yǔ)音組成的cell
load A2 A2; %A2為說(shuō)話人bb的十次訓(xùn)練語(yǔ)音組成的cell
%.......%
[mtzh1,p1]=xunlian(A1,TIMES);%調(diào)用訓(xùn)練子函數(shù),得說(shuō)話人的模型特征矢量和模型判決門(mén)限
TZV(1,:)=mtzh1;
DTH(1)=p1;
[mtzh2,p2]=xunlian(A2,TIMES);
TZV(2,:)=mtzh2;
DTH(2)=p2;
%.......%
K=length(mtzh1);
%===說(shuō)話人說(shuō)話,輪流進(jìn)行確認(rèn)===%
%==確認(rèn)說(shuō)話人1==%
nn=1;
S1=wavread(f:speakerzx3zx316);%%說(shuō)話人x說(shuō)話后語(yǔ)音信息被存儲(chǔ),用函數(shù)讀出該語(yǔ)音信號(hào)
decisionf(S1,TZV,DTH,nn,K) %確認(rèn)說(shuō)話人x是否為說(shuō)話人1,是輸出‘yes’,不是輸出‘no’
S2=wavread(f:speakerbb1bb13);%%說(shuō)話人y說(shuō)話后語(yǔ)音信息被存儲(chǔ),用函數(shù)讀出該語(yǔ)音信號(hào)
decisionf(S2,TZV,DTH,nn,K) %確認(rèn)說(shuō)話人y是否為說(shuō)話人1,是輸出‘yes’,不是輸出‘no’
%......%
%==確認(rèn)說(shuō)話人2==%
nn=2;
S1=wavread(f:speakerzx3zx316);%%說(shuō)話人x說(shuō)話后語(yǔ)音信息被存儲(chǔ),用函數(shù)讀出該語(yǔ)音信號(hào)
decisionf(S1,TZV,DTH,nn,K) %確認(rèn)說(shuō)話人x是否為說(shuō)話人2,是輸出‘yes’,不是輸出‘no’
S2=wavread(f:speakerbb1bb13);%%說(shuō)話人2說(shuō)話后語(yǔ)音信息被存儲(chǔ),用函數(shù)讀出該語(yǔ)音信號(hào)
decisionf(S2,TZV,DTH,nn,K) %確認(rèn)說(shuō)話人y是否為說(shuō)話人2,是輸出‘yes’,不是輸出‘no’
%......%
%=====......=====%
2.說(shuō)話人辨認(rèn)主函數(shù)
%%####=============說(shuō)話人辨別主函數(shù)(最小距離)==============####%%
clc;clear;
%============1 流程說(shuō)明========%
%對(duì)要進(jìn)行辨認(rèn)的測(cè)試說(shuō)話人提取平均特征向量,和訓(xùn)練庫(kù)中的每個(gè)模板特征矢量進(jìn)行距離比較,我們把與測(cè)試說(shuō)話人具有最小距離的說(shuō)話人作為目標(biāo)說(shuō)話人。
%==========2 符號(hào)說(shuō)明===========%
% N:說(shuō)話人數(shù);K: 特征矢量的長(zhǎng)度;
% TZV:N*K階的訓(xùn)練特征矢量矩陣,第nn行表示第nn個(gè)說(shuō)話人的模型特征矢量;
% DTH: N長(zhǎng)的訓(xùn)練判決門(mén)限向量,第nn個(gè)元素代表第nn個(gè)說(shuō)話人的訓(xùn)練判決門(mén)限;
% S1: 說(shuō)話人1的語(yǔ)音信號(hào);S2:說(shuō)話人2的語(yǔ)音信號(hào);......;SN: 說(shuō)話人N的語(yǔ)音信號(hào)
%=========3 主程序=======%
%===根據(jù)訓(xùn)練數(shù)據(jù),求出各個(gè)說(shuō)話人的訓(xùn)練特征矢量和訓(xùn)練判決門(mén)限===%
N=2;
load A1 A1;
load A2 A2;
TIMES=10;%訓(xùn)練次數(shù)為10
[mtzh1,p1]=xunlian(A1,TIMES);%調(diào)用訓(xùn)練函數(shù),得說(shuō)話人的模型特征矢量和模型判決門(mén)限
TZV(1,:)=mtzh1;
[mtzh2,p2]=xunlian(A2,TIMES);
TZV(2,:)=mtzh2;
K=length(mtzh1);
%===說(shuō)話人說(shuō)話,進(jìn)行辨認(rèn)===%
%==辨認(rèn)說(shuō)話人1==%
S1=wavread(f:speakerzx3zx316);%%說(shuō)話人1說(shuō)話后語(yǔ)音信息被存儲(chǔ),用函數(shù)讀出該語(yǔ)音信號(hào)
identify(S1,TZV,N,K)
%==辨認(rèn)說(shuō)話人2==%
S2=wavread(f:speakerbb1bb13);%%說(shuō)話人2說(shuō)話后語(yǔ)音信息被存儲(chǔ),用函數(shù)讀出該語(yǔ)音信號(hào)
identify(S2,TZV,N,K)
3 .子函數(shù)1——輸入訓(xùn)練語(yǔ)音數(shù)據(jù),輸出訓(xùn)練所得模式訓(xùn)練特征矢量及判決閾值
function [mtzh,p]=xunlian(A,TIMES)
%===輸入為訓(xùn)練次數(shù)TIMES和每次的訓(xùn)練語(yǔ)音信號(hào)的合集A;輸出為訓(xùn)練所得模型特征矢量及模型判決門(mén)限===%
for tt=1:TIMES %10指每個(gè)說(shuō)話人的訓(xùn)練次數(shù)
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. 子函數(shù)2——特征特取子函數(shù)
輸入語(yǔ)音信號(hào),輸出特征矢量
%===提取輸入語(yǔ)音信息的特征矢量===%
function avertzvector=tzhvf(x1)
lent1=length(x1);
%%=======預(yù)加重更新x1=======%%
u=0.9375;
for num=2:lent1
x1(num-1)=x1(num)-u*x1(num-1);
end
%%=======將語(yǔ)音信號(hào)進(jìn)行分幀得y1,加窗得winy1=======%%
framelen=256;%幀長(zhǎng)
shift=128;%幀移
numframe=ceil(lent1/shift)-1;%%幀數(shù)
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;%%分幀加窗后的數(shù)據(jù)
end
%%=========求信號(hào)的短時(shí)能量e1==========%%
e1=sum(winy1.^2,2);%%sum(x,2)表示將矩陣x橫向相加,得到每行的和,為一個(gè)列向量
%%========利用短時(shí)能量進(jìn)行端點(diǎn)檢測(cè)得到起始幀號(hào)startnum和結(jié)束幀號(hào)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ù)據(jù)(分幀加窗后的)
%%===========短時(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
%%=======對(duì)每幀求特征向量=========%%
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. 子函數(shù)3——說(shuō)話人確認(rèn)子函數(shù)
輸入測(cè)試語(yǔ)音,輸出確認(rèn)結(jié)果
function decisionf(S,TZV,DTH,nn,K)
%判決子函數(shù),輸入說(shuō)話人語(yǔ)音S,模板特征向量矩陣TZV,模板判決門(mén)限D(zhuǎn)TH,說(shuō)話人數(shù)N,特征向量長(zhǎng)度K;輸出判決結(jié)果
avtzvS=tzhvf(S);%%調(diào)用子函數(shù)tzhvf提取該語(yǔ)音信息的特征矢量
if (TZV(nn,:)-avtzvS)*(TZV(nn,:)-avtzvS)/K=DTH(nn)
disp(Yes.);
else
disp(No.);
end
6.子函數(shù)4——說(shuō)話人辨認(rèn)子函數(shù)
輸入測(cè)試語(yǔ)音,輸出辨認(rèn)結(jié)果
function identify(S,TZV,N,K)
%判決子函數(shù),輸入說(shuō)話人語(yǔ)音S,模板特征向量矩陣TZV,模板判決門(mén)限D(zhuǎn)TH,說(shuō)話人數(shù)N,特征向量長(zhǎng)度K;輸出判決結(jié)果
avtzvS=tzhvf(S);%%調(diào)用子函數(shù)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);
評(píng)論