新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于FPGA的說話人識別系統(tǒng),包含原理圖、源代碼

基于FPGA的說話人識別系統(tǒng),包含原理圖、源代碼

作者: 時間:2017-06-04 來源:網(wǎng)絡(luò) 收藏

本文引用地址:http://www.butianyuan.cn/article/201706/348675.htm

項目實施背景及可行性分析

隨著網(wǎng)絡(luò)信息化技術(shù)的迅猛發(fā)展,身份驗證的數(shù)字化、隱性化、便捷化顯得越來越重要。語言作為人類的自然屬性之一,說話人語言具有各自的生物特征,這使得通過語音分析進行說話人識別(Speaker Recognition, RS)成為可能。人的語音可以非常自然的產(chǎn)生,訓練和識別時并不需要特別的輸入設(shè)備,諸如個人電腦普遍配置的麥克風和到處都有的電話都可以作為輸入設(shè)備,因此采用說話人語音進行說話人識別和其他傳統(tǒng)的生物識別技術(shù)相比,具有更為簡便、準確、經(jīng)濟及可擴展性良好等眾多優(yōu)勢。

說話人識別的研究始于20世紀60年代,如今在特征提取、模型匹配、環(huán)境適應(yīng)性等方面的研究已臻于成熟,各種算法也趨于穩(wěn)定,說話人識別技術(shù)也正逐步進入到實用化階段。因此,我們根據(jù)已有的特征提取算法基于工具搭建說話人識別系統(tǒng)是可行的。

項目目前進度:

系統(tǒng)具體方案及模型已搭建成功,并采用對系統(tǒng)進行說話人確認和說話人辨認的仿真。 仿真結(jié)果顯示,識別成功。

項目實施方案

1 項目基本框圖:

圖1 說話人識別基本框圖

圖1是一個典型的說話人識別框圖,包括訓練和識別兩個部分,訓練又分為訓練語音預處理、特征提取、訓練建模、獲取模型參數(shù)庫四個過程,識別部分分為測試語音預處理、特征提取、模式匹配、判決輸出四個過程。識別部分的模式匹配模塊是將測試語音的特征矢量同模型庫里的特征矢量進行距離匹配。

2 具體步驟

2.1 預處理

無論是訓練語音信號還是測試語音信號在進行特征提取之前都要進行預處理。預處理包括預加重、分幀加窗、端點檢測等。

(1)預加重:正常人的語音頻率范圍一般為40Hz~4000Hz,在求語音信號頻譜時,頻率越高相應(yīng)的頻譜成分越小,高頻部分的頻譜比低頻部分的難求,預加重的目的是對語音信號的高頻部分(大約800Hz以上)加以提升,是信號的頻譜變得平坦,以便于頻譜分析。預加重在語音信號數(shù)字化之后進行,用一階數(shù)字濾波器來實現(xiàn),公式為:

(1)

其中,為預加重系數(shù),它的值接近1,本項目取0.9375。

(2)分幀加窗:語音信號在很短的一個時間內(nèi)可以認為是平穩(wěn)的,所以我們在對其處理時,先對語音信號分幀,對每幀信號處理就相當于對固定特性的持續(xù)語音進行處理。一幀語音信號時長約10~30ms,本系統(tǒng)采樣頻率為22050Hz,所以,幀長N取256,幀移為128。.分幀后,對每幀信號采取加窗處理,為避免吉布斯效應(yīng),本系統(tǒng)采用長度為256的漢明窗,其表達式為:

(2)

其中表示該窗的中心坐標。

(3)端點檢測:端點檢測的目的是從包含語音的一段信號中消除無聲段的噪音和減少處理語音段的時間,確定出語音的起點以及終點。本系統(tǒng)通過短時能量的大小來區(qū)分清音段和濁音段。設(shè)第n幀語音信號的短時能量為,其計算公式如下:

(3)

清音的能量較小,濁音的能量較大。

在進行說話人語音端點檢測時,首先根據(jù)背景噪聲確定一個短時能量的門限閾值,由于我們獲取說話人語音信息時是在安靜環(huán)境下進行的的,所以僅根據(jù)此門限來確定語音的起點和終點也是可行的。但為了避免突發(fā)性的瞬時噪聲(其短時能量有時比較大)的干擾,我們在此基礎(chǔ)上,進行了進一步的限定,即,一旦檢測到某幀的短時能量超過了門限,我們再繼續(xù)檢測接下來的32(經(jīng)驗值)幀,如果在這32幀里有3/4(經(jīng)驗值)的幀其短時能量都超過了門限,我們才確定最初檢測的幀為語音起點,否則繼續(xù)下一幀的檢測。實驗仿真證明,這種方法相比于單純通過門限值判斷能更好地確定語音的起始點和終點。

2.2 特征提取、訓練、識別

2.2.1 特征提取

語音信號的特征提取是說話人識別的關(guān)鍵問題。對一幀語音信號進行某種變換以后產(chǎn)生的相應(yīng)矢量,如線性預測系數(shù)、LPC倒譜系數(shù)、線譜對參數(shù)、共振峰率、短時譜等。綜合考慮性能和硬件實現(xiàn)復雜度,在本系統(tǒng)中我們選擇語音信號的短時譜作為其特征參數(shù)。首先我們對分幀加窗后的語音信號進行短時傅里葉變換,得到每幀語音信號頻譜的幅值分布,再根據(jù)這些頻譜幅值分布提取每一幀的特征矢量。

設(shè)加窗后的第n幀語音信號記為,其短時傅里葉變換表示為:

(4)

在本系統(tǒng),我們用DFT來等價短時傅里葉變換。對所求得的幀信號的頻譜幅值分布進行分析:每4個樣本點求一次最大幅值,記錄下對應(yīng)最大幅值的那個樣本點標號,這樣長256的一幀信號可以得到64個這樣的樣本點。取這64個樣本點組成的矢量向量為該幀的特征矢量。對輸入語音的所有幀特征矢量求平均,得該輸入語音的幀平均特征矢量,即該語音的特征矢量,記為。

2.2.2 訓練建模

在訓練建模部分,我們建立識別模型,所謂識別模型,是指用什么模型來描述說話人的語音特征在特征空間的分布。對于說話人識別系統(tǒng),特征參數(shù)被提取出來后,需要用識別模型為說話人建模,并對特征進行分類,以確定屬于哪一個說話人。目前常用的識別模型有,最小距離模型,矢量量化模型,隱馬爾可夫模型,高斯混合模型。綜合考慮下,本系統(tǒng)采用最小距離模型對說話人語音進行訓練。

本系統(tǒng)實驗時說話人訓練次數(shù)取為10,首先對每次訓練的輸入語音求特征矢量),再對10次訓練產(chǎn)生的特征矢量求平均得到的平均特征矢量,將此平均特征矢量作為說話人訓練所得的模型特征矢量。

2.2.3 識別

說話人識別包括說話人辨別和說話人確認,說話人辨別是從多個說話人語音中辨認出某個人的那一段語音信息,而說話人確認是確定某段語音信息是不是某人所說。

我們用測試數(shù)據(jù)與訓練數(shù)據(jù)的平均特征矢量之間的均方差作為一種距離度量。在說話人確認中,我們設(shè)定一個判決閾值,如果測試者數(shù)據(jù)與訓練數(shù)據(jù)的距離小于此閾值,我們就認為確認到了原說話人;在說話人辨認中,我們把與測試說話人距離最小的說話人作為目標說話人。

二、Matlab仿真結(jié)果

我們通過Windows自帶的錄音機得到聲音數(shù)字信號,采樣頻率為22050Hz,單聲道。說話人數(shù)為2,在訓練階段,每個說話人說10次‘芝麻開門’。

圖2 說話人zx的測試語音‘zx316’的相關(guān)圖

圖3 語音信號‘zx316’第一幀的短時傅里葉頻譜幅值分布

圖4 語音信號‘bb13’第一幀的短時傅里葉頻譜幅值分布

測試語音‘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

測試語音‘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

測試語音‘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

測試語音‘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

十次訓練后,說話人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

訓練所得說話人zx的確認閾值為zxp:

0.0403

十次訓練后,說話人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

訓練所得說話人bb的確認閾值為bbp:

0.0940

說話人確認時:

  1. 計算測試語音語音1(zx036)的特征向量avtzv1與說話人zx的模型特征向量zxtzv的距離,為0.0196,小于說話人zx的確認閾值為zxp(0.0403),所以確認測試語音1為zx所說;計算測試語音2(bb13)的特征向量avtzv2與說話人zx的模型特征向量zxtzv的距離,為0.2310,大于說話人zx的確認閾值為zxp(0.0403),所以確認測試語音2不是zx所說。
  2. 計算測試語音語音1(zx036)的特征向量avtzv1與說話人bb的模型特征向量bbtzv的距離,為0.1292,大于說話人bb的確認閾值為bbp(0.0940),所以確認測試語音1不是bb所說;計算測試語音2(bb13)的特征向量avtzv2與說話人bb的模型特征向量bbtzv的距離,為0.0932,小于說話人bb的確認閾值為bbp(0.0940),所以確認測試語音2是bb所說。

說話人辨認:

  1. 計算測試語音語音1(zx036)的特征向量avtzv1與說話人zx的模型特征向量zxtzv的距離,為0.0196;計算測試語音語音1(zx036)的特征向量avtzv1與說話人bb的模型特征向量bbtzv的距離,為0.1292。所以,將測試語音1辨認為zx所說。
  2. 計算測試語音2(bb13)的特征向量avtzv2與說話人zx的模型特征向量zxtzv的距離,為0.2310;計算測試語音2(bb13)的特征向量avtzv2與說話人bb的模型特征向量bbtzv的距離,為0.0932。所以,將測試語音1辨認為bb所說。

三、 Matlab仿真程序

1. 說話人確認主函數(shù)

%%####=============說話人確認主函數(shù)(最小距離)==============####%%

clc;clear;

%============1 流程說明========%

%將測試語音與訓練所得模板逐個進行確認,先確定出要確認的說話人的模板的訓練判決閾值,

%再求出每個測試語音的平均特征向量與此說話人模板特征向量的距離,如果距離小于閾值,

%則確認此測試語音為該說話人所說,否則不是。

%==========2 符號說明===========%

% N:說話人數(shù);K: 特征矢量的長度;

% TZV:N*K階的訓練特征矢量矩陣,第nn行表示第nn個說話人的模型特征矢量;

% DTH: N長的訓練判決門限向量,第nn個元素代表第nn個說話人的訓練判決門限;

% S1: 說話人1的語音信號;S2:說話人2的語音信號;......;SN: 說話人N的語音信號

%=========3 主程序=======%

%===根據(jù)訓練數(shù)據(jù),求出各個說話人的訓練特征矢量和訓練判決門限===%

N=2;

TIMES=10;%訓練次數(shù)為10

load A1 A1; %A1為說話人zx的十次訓練語音組成的cell

load A2 A2; %A2為說話人bb的十次訓練語音組成的cell

%.......%

[mtzh1,p1]=xunlian(A1,TIMES);%調(diào)用訓練子函數(shù),得說話人的模型特征矢量和模型判決門限

TZV(1,:)=mtzh1;

DTH(1)=p1;

[mtzh2,p2]=xunlian(A2,TIMES);

TZV(2,:)=mtzh2;

DTH(2)=p2;

%.......%

K=length(mtzh1);

%===說話人說話,輪流進行確認===%

%==確認說話人1==%

nn=1;

S1=wavread(f:speakerzx3zx316);%%說話人x說話后語音信息被存儲,用函數(shù)讀出該語音信號

decisionf(S1,TZV,DTH,nn,K) %確認說話人x是否為說話人1,是輸出‘yes’,不是輸出‘no’

S2=wavread(f:speakerbb1bb13);%%說話人y說話后語音信息被存儲,用函數(shù)讀出該語音信號

decisionf(S2,TZV,DTH,nn,K) %確認說話人y是否為說話人1,是輸出‘yes’,不是輸出‘no’

%......%

%==確認說話人2==%

nn=2;

S1=wavread(f:speakerzx3zx316);%%說話人x說話后語音信息被存儲,用函數(shù)讀出該語音信號

decisionf(S1,TZV,DTH,nn,K) %確認說話人x是否為說話人2,是輸出‘yes’,不是輸出‘no’

S2=wavread(f:speakerbb1bb13);%%說話人2說話后語音信息被存儲,用函數(shù)讀出該語音信號

decisionf(S2,TZV,DTH,nn,K) %確認說話人y是否為說話人2,是輸出‘yes’,不是輸出‘no’

%......%

%=====......=====%

2.說話人辨認主函數(shù)

%%####=============說話人辨別主函數(shù)(最小距離)==============####%%

clc;clear;

%============1 流程說明========%

%對要進行辨認的測試說話人提取平均特征向量,和訓練庫中的每個模板特征矢量進行距離比較,我們把與測試說話人具有最小距離的說話人作為目標說話人。

%==========2 符號說明===========%

% N:說話人數(shù);K: 特征矢量的長度;

% TZV:N*K階的訓練特征矢量矩陣,第nn行表示第nn個說話人的模型特征矢量;

% DTH: N長的訓練判決門限向量,第nn個元素代表第nn個說話人的訓練判決門限;

% S1: 說話人1的語音信號;S2:說話人2的語音信號;......;SN: 說話人N的語音信號

%=========3 主程序=======%

%===根據(jù)訓練數(shù)據(jù),求出各個說話人的訓練特征矢量和訓練判決門限===%

N=2;

load A1 A1;

load A2 A2;

TIMES=10;%訓練次數(shù)為10

[mtzh1,p1]=xunlian(A1,TIMES);%調(diào)用訓練函數(shù),得說話人的模型特征矢量和模型判決門限

TZV(1,:)=mtzh1;

[mtzh2,p2]=xunlian(A2,TIMES);

TZV(2,:)=mtzh2;

K=length(mtzh1);

%===說話人說話,進行辨認===%

%==辨認說話人1==%

S1=wavread(f:speakerzx3zx316);%%說話人1說話后語音信息被存儲,用函數(shù)讀出該語音信號

identify(S1,TZV,N,K)

%==辨認說話人2==%

S2=wavread(f:speakerbb1bb13);%%說話人2說話后語音信息被存儲,用函數(shù)讀出該語音信號

identify(S2,TZV,N,K)

3 .子函數(shù)1——輸入訓練語音數(shù)據(jù),輸出訓練所得模式訓練特征矢量及判決閾值

function [mtzh,p]=xunlian(A,TIMES)

%===輸入為訓練次數(shù)TIMES和每次的訓練語音信號的合集A;輸出為訓練所得模型特征矢量及模型判決門限===%

for tt=1:TIMES %10指每個說話人的訓練次數(shù)

avertzvector(tt,:)=tzhvf(A{tt});

end

mtzh=sum(avertzvector)/TIMES;

%%==========確定判決門限dehood1=======%%

for ts=1:TIMES

chavec=mtzh-avertzvector(ts,:);

wucha(ts)=chavec*chavec/length(mtzh);

end

p=max(wucha);

4. 子函數(shù)2——特征特取子函數(shù)

輸入語音信號,輸出特征矢量

%===提取輸入語音信息的特征矢量===%

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

%%=======將語音信號進行分幀得y1,加窗得winy1=======%%

framelen=256;%幀長

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

%%=========求信號的短時能量e1==========%%

e1=sum(winy1.^2,2);%%sum(x,2)表示將矩陣x橫向相加,得到每行的和,為一個列向量

%%========利用短時能量進行端點檢測得到起始幀號startnum和結(jié)束幀號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為去除無聲段的語音數(shù)據(jù)(分幀加窗后的)

%%===========短時傅里葉變換=============%%

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;%每四個點找一次頻譜幅度最大值

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;%語音幀平均特征矢量

5. 子函數(shù)3——說話人確認子函數(shù)

輸入測試語音,輸出確認結(jié)果

function decisionf(S,TZV,DTH,nn,K)

%判決子函數(shù),輸入說話人語音S,模板特征向量矩陣TZV,模板判決門限D(zhuǎn)TH,說話人數(shù)N,特征向量長度K;輸出判決結(jié)果

avtzvS=tzhvf(S);%%調(diào)用子函數(shù)tzhvf提取該語音信息的特征矢量

if (TZV(nn,:)-avtzvS)*(TZV(nn,:)-avtzvS)/K=DTH(nn)

disp(Yes.);

else

disp(No.);

end

6.子函數(shù)4——說話人辨認子函數(shù)

輸入測試語音,輸出辨認結(jié)果

function identify(S,TZV,N,K)

%判決子函數(shù),輸入說話人語音S,模板特征向量矩陣TZV,模板判決門限D(zhuǎn)TH,說話人數(shù)N,特征向量長度K;輸出判決結(jié)果

avtzvS=tzhvf(S);%%調(diào)用子函數(shù)tzhvf提取該語音信息的特征矢量

for nn=1:N

distance(nn)=(TZV(nn,:)-avtzvS)*(TZV(nn,:)-avtzvS)/K;

end

[~,snum]=min(distance);

fprintf(The speaker is %dn,snum);



評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉