當前位置:首頁 » 編程語言 » c語言mfcc語音識別
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言mfcc語音識別

發布時間: 2023-03-30 10:09:06

① mfcc簡介

MFCC:Mel頻率倒譜系數的縮寫。Mel頻率是基於人耳聽覺特性提出來的,它與Hz頻率成非線性對應關系。Mel頻率倒譜系數(MFCC)則是利用它們之間的這種關系,計算得到的Hz頻譜特徵,MFCC已經廣泛地應用在語音識別領域。由於Mel頻率與Hz頻率之間非線性的對應關系,使得MFCC隨著頻率的提高,其計算精度隨之下降。因此,在應用中常常只使用低頻MFCC,而丟棄中高頻MFCC

mfcc提取流程/mfcc

MFCC參數的提取包括以下幾個步驟:

 預濾波:CODEC前端帶寬為300-3400Hz的 抗混疊濾波器 。

 A/D變換:8kHz的采樣頻率,12bit的線性 量化精度 。

 預加重:通過一個一階有限激勵響應高通濾波器,使信號的頻譜變得平坦,不易受到有限字長效應的影響。

 分幀:根據語音的短時平穩特性,語音可以以幀為單位進行處理,實驗中選取的語頌圓高音幀長為32ms,幀疊為16ms。

 加窗:採用哈明窗對一幀語音加窗,以減小 吉布斯效應 的影響。

 快速傅立葉變換(Fast Fourier Transformation, FFT):將時域信號變換成為信號的功率譜。

 三角窗濾波:用一組Mel頻標上線性分布的三角窗濾波器(共24個三角窗濾波器),對信號的功率腔正譜濾波,每一個三角窗濾波器覆蓋的范圍都近似於人耳的一個臨界帶寬,以此來模擬人耳的 掩蔽效應 。

 求對數:三角窗濾波器組的輸出求取對數,可以得到近似於同態變換的結果。

 離散餘弦變換(Discrete Cosine Transformation, DCT):去除各維信號之間的相關性,將信號映射到低維空間。

 譜加權:由於倒譜的低階參數易受說話人特性、信道特性等的影響,而高階參數的分辨能力比較低,所以需要進行譜加權,抑制其低階和高階參數。

 倒譜均值減(Cepstrum Mean Subtraction, CMS):CMS可以有效地減小語音輸入信道對特徵參數的影響。

野尺 差分參數:大量實驗表明,在語音特徵中加入表徵語音動態特性的差分參數,能夠提高系統的識別性能。在本系統中,我們也用到了MFCC參數的一階差分參數和 二階差分 參數。

 短時能量:語音的短時能量也是重要的特徵參數,本系統中我們採用了語音的短時歸一化對數能量及其一階差分、二階差分參數。

② 求助語音識別代碼的注釋,要每一句都寫明意思,謝謝

這個是完整的代碼,我自己的賬號發不了這么長,希望好心人幫忙注釋啊,非常感謝!!!

(1)端點檢測部分(vad):
function [x1,x2] = vad(x)

%語音信號x幅度歸一化到[-1,1]
x = double(x);
x = x / max(abs(x));

%常數設置
FrameLen = 240; %幀長度為240
FrameInc = 80; %幀移為80
amp1 = 10; %短時能量高門限10
amp2 = 2; %短時能量低門限為2
zcr1 = 10; %短時過零率高門限為旁前帆10
zcr2 = 5; %短時過零率低門限為5
maxsilence =3;%靜音時間門限3*10ms= 30ms
minlen= 15;%最小語音時間長度15*10ms = 150ms
status= 0; %
count= 0; %語音時間累計
silence = 0; %靜音時間累計

%計算過零率
tmp1= enframe(x(1:end-1), FrameLen, FrameInc);
tmp2= enframe(x(2:end), FrameLen, FrameInc);
signs =(tmp1.*tmp2)<0;%符號數組,用於存儲相鄰兩個采樣點符號是否相同,即是否穿越0電平
diffs = (tmp1-tmp2)>0.02;%度量相鄰兩個采樣點之間距離,如果大於門限0.02(經驗值),則1,否則0
zcr = sum(signs.*diffs,2);%過零率

%計算短時能量
amp =sum(abs(enframe(filter([1 -0.9375], 1, x), FrameLen, FrameInc)), 2);

%調整能量門限
amp1 = min(amp1,max(amp)/4);
amp2 = min(amp2,max(amp)/8);

%開始端點檢測
x1 = 0;
x2 = 0;
for n=1:length(zcr)
goto = 0;
switch status
case {0,1}% 0 =靜音, 1 =可能開始
if amp(n) > amp1%確信進入語音段
x1 = max(n-count-1,1);
status= 2;
silence = 0;
count= count + 1;
elseif amp(n) > amp2 || ... %可能處於語音段
zcr(n) > zcr2
status = 1;
count= count + 1;
else%靜音狀態
status= 0;
count= 0;
end
case 2,% 2 =語音段
if amp(n) > amp2 || ...%保持在語音段
zcr(n) > zcr2
count = count + 1;
else%語音將結束
silence = silence+1;
if silence < maxsilence %靜音還不夠長,尚未結束
count= count + 1;
elseif count < minlen%語音長度太短,認為是雜訊
status= 0;
silence = 0;
count= 0;
else%語音結束悔胡
status= 3;
end
end
case 3,
break;
end
end

count = count-silence/2;
x2 = x1 + count -1;

subplot(311)
plot(x)
axis([1 length(x) -1 1])
xlabel('語音信號');
line([x1*FrameIncx1*FrameInc ],[-1,1],'Color','red');
line([x2*FrameIncx2*FrameInc ],[-1,1],'Color','red');

subplot(312)
plot(amp);
axis([1 length(amp) 0max(amp)])
xlabel('短時能量');
line([x1,x1],[min(amp),max(amp)],'Color','red');
line([x2,x2],[min(amp),max(amp)],'運雹Color','red');

subplot(313)
plot(zcr);
axis([1 length(zcr) 0max(zcr)])
xlabel('過零率');
line([x1,x1],[min(zcr),max(zcr)],'Color','red');
line([x2,x2],[min(zcr),max(zcr)],'Color','red');

(2)MFCC部分:
function ccc = mfcc(x)
%歸一化mel濾波器組系數
bank=melbankm(24,256,8000,0,0.5,'m');%24濾波器個數,8000采樣頻率
bank=full(bank);
bank=bank/max(bank(:));

% DCT系數,12*24
for k=1:12
n=0:23;
dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24));
end

%歸一化倒譜提升窗口
w = 1 + 6 * sin(pi *(1:12) ./ 12);
w = w/max(w);

%預加重濾波器
xx=double(x);
xx=filter([1-0.9375],1,xx);

%語音信號分幀,xx是輸入語音信號;256是幀長;80是幀移
xx=enframe(xx,256,80);

%計算每幀的MFCC參數
for i=1:size(xx,1)
y = xx(i,:);
s = y' .* hamming(256);%加漢明窗
t = abs(fft(s));%fft變換
t = t.^2;
c1=dctcoef * log(bank * t(1:129));
c2 = c1.*w';
m(i,:)=c2';
end

%差分系數
dtm = zeros(size(m));
for i=3:size(m,1)-2
dtm(i,:) = -2*m(i-2,:) - m(i-1,:) + m(i+1,:)+ 2*m(i+2,:);
end
dtm = dtm / 3;

%合並mfcc參數和一階差分mfcc參數
ccc = [m dtm];
%去除首尾兩幀,因為這兩幀的一階差分參數為0
ccc =ccc(3:size(m,1)-2,:);

(3)dtw計算部分:
function dist = dtw2(test, ref)
global x y_min y_max
global t r
global D d
global m n

t = test;
r = ref;
n = size(t,1);
m = size(r,1);

d = zeros(m,1);
D =ones(m,1) *realmax;
D(1) = 0;

%如果兩個模板長度相差過多,匹配失敗
if (2*m-n<3) || (2*n-m<2)
dist =realmax;
return
end

%計算匹配區域
xa = round((2*m-n)/3);
xb = round((2*n-m)*2/3);

if xb>xa
%xb>xa,按下面三個區域匹配
%1:xa
%xa+1:xb
%xb+1:N
for x =1:xa
y_max= 2*x;
y_min= round(0.5*x);
warp
end
for x =(xa+1):xb
y_max= round(0.5*(x-n)+m);
y_min= round(0.5*x);
warp
end
for x =(xb+1):n
y_max= round(0.5*(x-n)+m);
y_min= round(2*(x-n)+m);
warp
end
elseif xa>xb
%xa>xb,按下面三個區域匹配
%0:xb
%xb+1:xa
%xa+1:N
for x =1:xb
y_max= 2*x;
y_min= round(0.5*x);
warp
end
for x =(xb+1):xa
y_max= 2*x;
y_min= round(2*(x-n)+m);
warp
end
for x =(xa+1):n
y_max= round(0.5*(x-n)+m);
y_min= round(2*(x-n)+m);
warp
end
elseif xa==xb
%xa=xb,按下面兩個區域匹配
%0:xa
%xa+1:N
for x =1:xa
y_max= 2*x;
y_min= round(0.5*x);
warp
end
for x =(xa+1):n
y_max= round(0.5*(x-n)+m);
y_min= round(2*(x-n)+m);
warp
end
end

%返回匹配分數
dist = D(m);

function warp
global x y_min y_max
global t r
global D d
global m n

d = D;
for y = y_min:y_max
D1 = D(y);
if y>1
D2= D(y-1);
else
D2 =realmax;
end
if y>2
D3= D(y-2);
else
D3 = realmax;
end
d(y) =sum((t(x,:)-r(y,:)).^2) + min([D1,D2,D3]);
end

D = d;

(4)測試函數testdtw部分;
disp('正在計算參考模板的參數...')
for i=1:10
fname = sprintf('G:\\石東東\\語音\\%da.wav',i-1);
x = wavread(fname);
[x1 x2] = vad(x);
m = mfcc(x);
m = m(x1-2:x2-2,:);
ref(i).mfcc = m;
end

disp('正在計算測試模板的參數...')
for i=1:10
fname = sprintf('G:\\石東東\\語音\\%db.wav',i-1);
x = wavread(fname);
[x1 x2] = vad(x);
m = mfcc(x);
m = m(x1-2:x2-2,:);
test(i).mfcc = m;
end

disp('正在進行模板匹配...')
dist = zeros(10,10);
for i=1:10
for j=1:10
dist(i,j) = dtw2(test(i).mfcc, ref(j).mfcc);
end
end

disp('正在計算匹配結果...')
for i=1:10
[d,j] = min(dist(i,:));
fprintf('測試模板%d的識別結果為:%d\n', i-1, j-1);
end

③ MFCC、FBank、LPC總結

幾乎照搬 語音特徵參數MFCC提取過程詳解
參考CSDN 語音信號處理之(四)梅爾頻率倒譜系數(MFCC)

1.定義
MFCCs(Mel Frequency Cepstral Coefficents):是在Mel標度頻率域提取出來的倒譜參數,是一種在自動語音和說話人識別中廣泛使用的特徵。Mel標度描述了人耳頻率的非線性特性,它與頻率的關系可用下式近似表示:

2.流程圖

3.預加重
預加重處理其實是將語音信號通過一個高通濾波器:
的取值介於0.9-1.0之間,通常取0.97。

4.分幀
語音信號在宏觀上是不平穩的,在微觀上是平穩的(傅里葉變換要求輸入的信號的平穩的),具有短時平穩性(10---30ms內可以認為語音信號近似不變),因此我們要把語音信號分為一些短段來進行處理,每一個短段稱為一幀(CHUNK)。
幀定義為:N個采樣點集合成一個觀測單位。
通常情況下N的值為256或512,涵蓋的時間約為20~30ms左右。為了避免相鄰兩幀的變化過大,因此會讓兩相鄰幀之間有一段重疊區域,此重疊區域包含了M個取樣點,通常M的值約為N的1/2或1/3。通常語音識別所採用語音信號的采樣頻率為8KHz或16KHz,以8KHz來說,若幀長度為256個采樣點,則段歷對應的時間長度是256/8000×1000=32ms。
上面的說法是用采樣點來描述的,也有直接用幀長進行描述的,比如:幀長20ms,幀移10ms。

5.加窗
將每一幀乘以漢明窗,以增加幀左端和右端的連續性。

之後我們會對漢明窗中的數據進行FFT,它假設一個窗內的信號是代表一個周期的信號(也就是說窗的左端和右端應該大致能連在一起)。而通常一小段音頻數據沒有明顯的周期性,加上漢明窗後,數據形狀就有點周期的感覺了。
漢明窗的公式如下:

通常情況下, 取0.46。

6.FFT
FFT是快速傅里葉變換的縮寫。
由於信號在時域上的變換通常很難看出信號的特性,所以通常將它轉換為頻域上的能量分布來觀察,不同的能量分布,就能代表不同語音的特性。所以在乘上漢明窗後,每幀還必須再經過快速傅里葉變換以得到在頻譜上的能量分布。對分幀加窗後的各幀信號進行快速傅里葉變換得到各幀的頻譜。並對語音信號的頻譜 取模平方 得到埋卜語音信號的 功率譜 。設語音信號的DFT為:

式中x(n)為輸入的語音信號,N表示傅里葉變換的點數。

7.三角帶通濾波器
將能量譜通過一組Mel尺度的三角形濾波器組,定義一個有M個濾波器的濾波器組(濾波器的個數和臨界 帶的個握液搜數相近),採用的濾波器為三角濾波器,中心頻率為f(m),m=1,2,...,M。M通常取22-26。各f(m)之間的間隔隨著m值的減小而縮小,隨著m值的增大而增寬,如圖所示:

8.每個濾波器組輸出
計算每個濾波器組輸出的對數能量為:

9.經離散餘弦變換(DCT)得到MFCC系數:

10.對數能量
此外,一幀的音量(即能量),也是語音的重要特徵,而且非常容易計算。因此,通常再加上一幀的對數能量(定義:一幀內信號的平方和,再取以10為底的對數值,再乘以10)使得每一幀基本的語音特徵就多了一維,包括一個對數能量和剩下的倒頻譜參數。
因此,MFCC的維度常用的是13(12+1)加上一階差分和二階差分,一共39。

11.動態差分參數的提取(包括一階差分和二階差分)
標準的倒譜參數MFCC只反映了語音參數的靜態特性,語音的動態特性可以用這些靜態特徵的差分譜來描述。實驗證明:把動、靜態特徵結合起來才能有效提高系統的識別性能。差分參數的計算可以採用下面的公式:

參考 語音識別(五)——Mel-Frequency Analysis, FBank, 語音識別的評價指標, 聲學模型進階

Filter bank和MFCC的計算步驟基本一致,只是沒有做IDFT而已。
FBank與MFCC對比:
1.計算量:MFCC是在FBank的基礎上進行的,所以MFCC的計算量更大
2.特徵區分度:FBank特徵相關性較高(相鄰濾波器組有重疊),MFCC具有更好的判別度,這也是在大多數語音識別論文中用的是MFCC,而不是FBank的原因
3.使用對角協方差矩陣的GMM由於忽略了不同特徵維度的相關性,MFCC更適合用來做特徵。
4.DNN/CNN可以更好的利用這些相關性,使用fbank特徵可以更多地降低WER。

參考知乎的答案: 語音識別,語譜圖對比MFCC、Fbank等特徵,在識別方面有哪些優勢?
DNN做聲學模型時,一般用filterbank feature,不用mfcc,因為fbank信息更多 (mfcc是由mel fbank有損變換得到的)。mfcc一般是GMM做聲學模型時用的,因為通常GMM假設是diagonal協方差矩陣,而cepstral coefficient更符合這種假設。linear spectrogram裡面冗餘信息太多了,維度也高,所以一般也不用。

LPC:Linear Prediction Coefficient線性預測系數。
對語音信號進行線性預測分析的基本思想是:一個語音的采樣能夠用過去若干個語音采樣的線性組合來逼近,通過線性預測到的采樣在最小均方誤差意義上逼近實際語音采樣,可以求取一組唯一的預測系數。預測系數就是線性組合中所用的加權系數,這種線性預測分析最早是用於語音編碼中。

④ 語音特徵參數MFCC理解

舉個例子,我本科時的學號是15020140011,可以作為我在大學的一個特徵值。但是這個學號有什麼具體含義嗎?如果我沒記錯的話,15表示入學年份是派逗2015年,14表示我在本系(1專業)第4個小班,後面的11代表班裡的編號。但是這個學號是十仿羨指分有效的,它是我在大學里唯一的標識,機器只要通過這個學號可以識別我,識別率100%。

MFCC同樣的道理,它的13個系數(也許還有13個一階差分和13個二階差分)都是通過離散餘弦變換(DCT)而來,並取前13個系數。

DCT的作用,為了獲得頻譜的倒譜,倒譜的低頻分量就是頻譜的包絡,倒譜的高頻分量就是頻譜的細節,這些都是語音識別上經過科學驗證十分有效的語音物理信息。但語音識別是對機器來說的,所以我們必須對物理信息進行某種「編碼」,得到的就是MFCC13維特徵向量,你是否理解它不重要,只要機器能夠識別就行了。

綜上所述,我認為MFCC的物理含義就是—— 在語音識別領域,將語音物理信息(頻譜包絡和細節)進行編碼運算得到的一組特徵向量。

MFCC的物理含義, 簡單地說可以理解為語言信號的能量在不同頻率范圍的分布 。如果把計算出的系數的低位部分(一般是前12個)作反傅立葉變換(IFFT),就可以得到上圖中虛線表示的信號的頻譜包絡,也就是表示聲帶特徵的那一部分低頻信息。

要理解為什麼可以這么做,我們先看看倒譜的定義:一種信號的傅里葉變換譜經對數運算後再進行的傅里葉反變換(IFFT)。 (IFFT其實就是對頻譜再作一次FFT)

下面兩幅圖很好地解釋了這個過程,語音信號的頻譜可以看作是低頻的包絡和高頻的細節相加,在得到倒譜系數後,備配我們只需要取低位的系數便可以得到包絡信息。(這里的x[k]即為倒譜系數)

注意整個過程中我們並沒有明確計算 e(t) 和 h(t) ,而是通過直接對語音信號x(t)作倒譜分析,再提取低位的倒譜系數,就可以獲取我們想要的聲道特徵。

有意思的是,對數頻譜作傅里葉反變換後的域被稱為quefrency domain(對應頻域frequency domain),quefrency domain和時域time domain類似但不完全一樣。提取低位系數的操作稱為low-time liftering(對應濾波操作filtering)。同樣地,我們可以通過high-time liftering來獲取激勵特徵。

當然在MFCC的實際計算中我們並沒有作傅里葉反變換,而是先將頻譜通過一組三角濾波器,再作離散餘弦變換(DCT)得到MFCC系數。但其物理意義是一樣的,即表示 信號頻譜的能量在不同頻率區間的分布 。每一個濾波器的作用就是得到對應頻率區間的頻譜能量,如果我們有26個三角濾波器,就會得到26個MFCC系數,這時候再取低位的系數就可以代表聲道的特徵。

⑤ mfcc特徵參數提取後怎麼實現語音識別

1、用audioread('');函數埋消讀取電腦音頻文件參數音頻文件路徑:
[sampledata,FS] = audioread('F:1.mp3');
sampledata保存音頻信號彎叢知數據FS音頻采率MP3格式采率般鄭彎44100;

2、判斷音頻數據否雙聲道雙聲道則保留聲道數據用calsample.m文件函數完功能文件內容:

function sample = calsample(sampledata,FS)
temp_sample = resample(sampledata,1,FS/11025);
[m,n] = size(temp_sample);
if (n == 2)
sample = temp_sample(:,1);
else
sample = temp_sample;
end
end

⑥ 求語音識別的源代碼,要求是用C#或C語言編寫,能夠識別一些基本的漢語發音

首先你要引用 DotNetSpeech
然後
創建SpeechRecognitionEngine 對象
下面的代碼可以讓系統獲取語音並且識別

SRE = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("zh-CN"));//中文
SRE.LoadGrammar(new DictationGrammar());//所有語言
SRE.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(SRE_SpeechRecognized);//系統接受後的事件
SRE.SetInputToDefaultAudioDevice();//設置默認輸入設備

微軟MSDN裡面有詳細的介紹,望採納。

⑦ mfcc特徵提取是什麼

就是把音頻信號中具有辨識性的成分提取出來,然後把其他的亂七八糟的信息扔掉,例如背景雜訊、情緒等等。

MFCCs(Mel Frequency Cepstral Coefficents)是一種在自動語音和說話人識別中廣泛使用的特徵。它是在1980年由Davis和Mermelstein搞出來的。從那時起,在語音識別領域,MFCCs在人工特徵方面可謂是鶴立雞群,一枝獨秀。

特點:

Mel頻率是基於人耳聽覺特性提出來的,它與Hz頻率成非線性對應關系。Mel頻率倒譜系數(MFCC)則是利用它們之間的這種關系,計算得到的Hz頻譜特徵,MFCC已經廣泛地應用在語音識別領域。

由於則祥Mel頻率與Hz頻率之間非線性的對應關系,使得MFCC隨著頻率的提高,其計算精度隨之下襲盯態降。因此,在應用中常常只使拍源用低頻MFCC,而丟棄中高頻MFCC。

⑧ mfcc怎麼使用

天哪,這脊燃么多年了還沒人來回櫻輪虛答呀?我的做法肯定是錯的,所以也在查。我是把每個桐陸樣本截取同樣的行數,然後都reshape()成一行。。。。。

⑨ 用C語言進行語音識別

普通要做語音的FFT分析,然後根據一些模型做分析,可以分別找出某些頻譜特徵語音的成分,從而判斷是否有某種聲音(比如某人的說話聲);
但要做到把多個不同的聲音分開,設計這樣的濾波器比較困難
做到將說話聲識別成文字就更難了,要用到市場上成熟的演算法(有可能不是免費的),而且識別率比較低。