MATLAB语音识别系统[声纹识别]
一、 語音識別的簡單介紹
基于VQ的說話人識別系統,矢量量化起著雙重作用。在訓練階段,把每一個說話者所提取的特征參數進行分類,產生不同碼字所組成的碼本。在識別(匹配)階段,我們用VQ方法計算平均失真測度(本系統在計算距離d時,采用歐氏距離測度),從而判斷說話人是誰。
語音識別系統結構框圖如圖1所示。
圖1 語音識別系統結構框圖語者識別的概念
語者識別就是根據說話人的語音信號來判別說話人的身份。語音是人的自然屬性之一,由于說話人發音器官的生理差異以及后天形成的行為差異,每個人的語音都帶有強烈的個人色彩,這就使得通過分析語音信號來識別說話人成為可能。用語音來鑒別說話人的身份有著許多獨特的優點,如語音是人的固有的特征,不會丟失或遺忘;語音信號的采集方便,系統設備成本低;利用電話網絡還可實現遠程客戶服務等。因此,近幾年來,說話人識別越來越多的受到人們的重視。與其他生物識別技術如指紋識別、手形識別等相比較,說話人識別不僅使用方便,而且屬于非接觸性,容易被用戶接受,并且在已有的各種生物特征識別技術中,是唯一可以用作遠程驗證的識別技術。因此,說話人識別的應用前景非常廣泛:今天,說話人識別技術已經關系到多學科的研究領域,不同領域中的進步都對說話人識別的發展做出了貢獻。說話人識別技術是集聲學、語言學、計算機、信息處理和人工智能等諸多領域的一項綜合技術,應用需求將十分廣闊。在吃力語音信號的時候如何提取信號中關鍵的成分尤為重要。語音信號的特征參數的好壞直接導致了辨別的準確性。
特征參數的提取
對于特征參數的選取,我們使用mfcc的方法來提取。MFCC參數是基于人的聽覺特性利用人聽覺的屏蔽效應,在Mel標度頻率域提取出來的倒譜特征參數。
MFCC參數的提取過程如下:
1. 對輸入的語音信號進行分幀、加窗,然后作離散傅立葉變換,獲得頻譜分布信息。
設語音信號的DFT為:
(1)
其中式中x(n)為輸入的語音信號,N表示傅立葉變換的點數。
2. 再求頻譜幅度的平方,得到能量譜。
3. 將能量譜通過一組Mel尺度的三角形濾波器組。
我們定義一個有M個濾波器的濾波器組(濾波器的個數和臨界帶的個數相近),采用的濾波器為三角濾波器,中心頻率為f(m),m=1,2,3,···,M
本系統取M=100。
4. 計算每個濾波器組輸出的對數能量。
(2)
其中
為三角濾波器的頻率響應。
5. 經過離散弦變換(DCT)得到MFCC系數。
MFCC系數個數通常取20—30,常常不用0階倒譜系數,因為它反映的是頻譜能量,故在一般識別系統中,將稱為能量系數,并不作為倒譜系數,本系統選取20階倒譜系數。
用矢量量化聚類法生成碼本
我們將每個待識的說話人看作是一個信源,用一個碼本來表征。碼本是從該說話人的訓練序列中提取的MFCC特征矢量聚類而生成。只要訓練的序列足夠長,可認為這個碼本有效地包含了說話人的個人特征,而與講話的內容無關。
本系統采用基于分裂的LBG的算法設計VQ碼本,
為訓練序列,B為碼本。
具體實現過程如下:
1. 取提取出來的所有幀的特征矢量的型心(均值)作為第一個碼字矢量B1。
2. 將當前的碼本Bm根據以下規則分裂,形成2m個碼字。
(4)
其中m從1變化到當前的碼本的碼字數,ε是分裂時的參數,本文ε=。
3. 根據得到的碼本把所有的訓練序列(特征矢量)進行分類,然后按照下面兩個公式計算訓練矢量量化失真量的總和
以及相對失真(n為迭代次數,初始n=0,
=∞,B為當前的碼書),若相對失真小于某一閾值ε,迭代結束,當前的碼書就是設計好的2m個碼字的碼書,轉5。否則,轉下一步。
量化失真量和:
(5)
相對失真:
(6)
4. 重新計算各個區域的新型心,得到新的碼書,轉3。
5. 重復2 ,3 和4步,直到形成有M個碼字的碼書(M是所要求的碼字數),其中D0=10000。
VQ的說話人識別
設是未知的說話人的特征矢量
,共有T幀是訓練階段形成的碼書,表示碼書第m個碼字,每一個碼書有M個碼字。再計算測試者的平均量化失真D,并設置一個閾值,若D小于此閾值,則是原訓練者,反之則認為不是原訓練者。
二 算法程序分析
在具體的實現過程當中,采用了matlab軟件來幫助完成這個項目。在matlab中主要由采集,分析,特征提取,比對幾個重要部分。以下為在實際的操作中,具體用到得函數關系和作用一一列舉在下面。 函數關系 主要有兩類函數文件和 在調用獲取訓練錄音的vq碼本,而調用獲取單個錄音的mel倒譜系數,接著調用將能量譜通過一組Mel尺度的三角形濾波器組。 在函數文件中調用計算訓練錄音(提供vq碼本)與測試錄音(提供mfcc)mel倒譜系數的距離,即判斷兩聲音是否為同一錄音者提供。調用獲取單個錄音的mel倒譜系數。調用將能量譜通過一組Mel尺度的三角形濾波器組。 具體代碼說明 函數mffc: function r = mfcc(s, fs) --- m = 100; n = 256; l = length(s); nbFrame = floor((l - n) / m) + 1; %沿-∞方向取整 for i = 1:n for j = 1:nbFrame M(i, j) = s(((j - 1) * m) + i); %對矩陣M賦值 end end h = hamming(n); %加 hamming 窗,以增加音框左端和右端的連續性 M2 = diag(h) * M; for i = 1:nbFrame frame(:,i) = fft(M2(:, i)); %對信號進行快速傅里葉變換FFT end t = n / 2; tmax = l / fs; m = melfb(20, n, fs); %將上述線性頻譜通過Mel 頻率濾波器組得到Mel 頻譜,下面在將其轉化成對數頻譜 n2 = 1 + floor(n / 2); z = m * abs(frame(1:n2, :)).^2; r = dct(log(z)); %將上述對數頻譜,經過離散余弦變換(DCT)變換到倒譜域,即可得到Mel 倒譜系數(MFCC參數) 函數disteu ---計算測試者和模板碼本的距離 function d = disteu(x, y)[M, N] = size(x); %音頻x賦值給【M,N】 [M2, P] = size(y); %音頻y賦值給【M2,P】 if (M ~= M2)error('不匹配!') %兩個音頻時間長度不相等 end d = zeros(N, P); if (N < P)%在兩個音頻時間長度相等的前提下copies = zeros(1,P);for n = 1:Nd(n,:) = sum((x(:, n+copies) - y) .^2, 1);end elsecopies = zeros(1,N);for p = 1:Pd(:,p) = sum((x - y(:, p+copies)) .^2, 1)';end%%成對歐氏距離的兩個矩陣的列之間的距離 end d = d.^; 函數vqlbg ---該函數利用矢量量化提取了音頻的vq碼本 function r = vqlbg(d,k) e = .01; r = mean(d, 2); dpr = 10000; for i = 1:log2(k)r = [r*(1+e), r*(1-e)];while (1 == 1)z = disteu(d, r);[m,ind] = min(z, [], 2);t = 0;for j = 1:2^ir(:, j) = mean(d(:, find(ind == j)), 2);x = disteu(d(:, find(ind == j)), r(:, j));for q = 1:length(x)t = t + x(q);endendif (((dpr - t)/t) < e)break;elsedpr = t;endend end 函數test function finalmsg = test(testdir, n, code)for k = 1:n % read test sound file of each speakerfile = sprintf('%ss%', testdir, k);[s, fs] = wavread(file); v = mfcc(s, fs); % 得到測試人語音的mel倒譜系數 distmin = 4; %閾值設置處% 就判斷一次,因為模板里面只有一個文件d = disteu(v, code{1}); %計算得到模板和要判斷的聲音之間的“距離”dist = sum(min(d,[],2)) / size(d,1); %變換得到一個距離的量%測試閾值數量級msgc = sprintf('與模板語音信號的差值為:%10f ', dist);disp(msgc); %此人匹配 if dist <= distmin %一個閾值,小于閾值,則就是這個人。msg = sprintf('第%d位說話者與模板語音信號匹配,符合要求!\n', k); finalmsg = '此位說話者符合要求!'; %界面顯示語句,可隨意設定 disp(msg); end %此人不匹配 if dist > distmin msg = sprintf('第%d位說話者與模板語音信號不匹配,不符合要求!\n', k);finalmsg = '此位說話者不符合要求!'; %界面顯示語句,可隨意設定disp(msg); end end函數testDB 這個函數實際上是對數據庫一個查詢,根據測試者的聲音,找相應的文件,并且給出是誰的提示 function testmsg = testDB(testdir, n, code) nameList={'1','2','3','4','5','6','7','8','9' }; %這個是我們要識別的9個數 for k = 1:n % 數據庫中每一個說話人的特征file = sprintf('%ss%', testdir, k); %找出文件的路徑[s, fs] = wavread(file); v = mfcc(s, fs); % 對找到的文件取mfcc變換distmin = inf;k1 = 0;for l = 1:length(code) d = disteu(v, code{l}); dist = sum(min(d,[],2)) / size(d,1);if dist < distmindistmin = dist;%%這里和test函數里面一樣 但多了一個具體語者的識別k1 = l;end endmsg=nameList{k1}msgbox(msg); end函數train ---該函數就是對音頻進行訓練,也就是提取特征參數 function code = train(traindir, n)k = 16; % number of centroids required for i = 1:n % 對數據庫中的代碼形成碼本file = sprintf('%ss%', traindir, i); disp(file);[s, fs] = wavread(file);v = mfcc(s, fs); % 計算 MFCC's 提取特征特征,返回值是Mel倒譜系數,是一個log的dct得到的code{i} = vqlbg(v, k); % 訓練VQ碼本 通過矢量量化,得到原說話人的VQ碼本 end函數melfb ---確定矩陣的濾波器 function m = melfb(p, n, fs)f0 = 700 / fs; fn2 = floor(n/2); lr = log(1 + f0) / (p+1); % convert to fft bin numbers with 0 for DC term bl = n * (f0 * (exp([0 1 p p+1] * lr) - 1)); 直接轉換為FFT的數字模型 b1 = floor(bl(1)) + 1; b2 = ceil(bl(2)); b3 = floor(bl(3)); b4 = min(fn2, ceil(bl(4))) - 1; pf = log(1 + (b1:b4)/n/f0) / lr; fp = floor(pf); pm = pf - fp;r = [fp(b2:b4) 1+fp(1:b3)]; c = [b2:b4 1:b3] + 1; v = 2 * [1-pm(b2:b4) pm(1:b3)]; m = sparse(r, c, v, p, 1+fn2);總結
以上是生活随笔為你收集整理的MATLAB语音识别系统[声纹识别]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用notepad运行python程
- 下一篇: 人生苦短,我用python——当我在玩p