当前位置:首页 » 编程语言 » 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分析,然后根据一些模型做分析,可以分别找出某些频谱特征语音的成分,从而判断是否有某种声音(比如某人的说话声);
但要做到把多个不同的声音分开,设计这样的滤波器比较困难
做到将说话声识别成文字就更难了,要用到市场上成熟的算法(有可能不是免费的),而且识别率比较低。