基于MATLAB实现语音信号MFCC特征提取(附完整代码)
该文本介绍了语音识别技术的核心概念,重点讲述了Mel频率倒谱系数(MFCC)及其在语音识别中的应用。MFCC是一种用于自动语音识别和说话人识别的方法,通过预加重信号、分帧、加窗、快速傅里叶变换(FFT)、梅尔滤波器组、对数压缩和离散余弦变换(DCT)等步骤提取语音信号的特征。文本详细解释了这些步骤的作用,包括信号分析、频率变换、倒谱表示、滤波器组设计、对数压缩和特征提取,突出了MFCC在语音识别中的重要性及其如何模拟人类听觉系统。此外,还提供了MATLAB代码示例,展示了如何读取音频文件、预加重、分帧、加窗、FFT、梅尔滤波器组、对数压缩和DCT变换等关键步骤。
1 概述
你是否想过,你的智能手机是如何理解语音指令的?或者,Alexa和Siri等语音助手如何处理您的命令?这种卓越能力的机制归功于Mel频率倒谱系数(MFCC)这一方法。语音识别技术使机器能够理解人类语音,将口语转换为计算机可操作的格式。这项技术对于开发交互式和响应式AI至关重要,例如声控助手、自动化服务系统以及实时翻译服务。
1.1 什么是MFCC?
MFCC全称为Mel频域倒谱系数,它在语音识别和说话人识别方面发挥重要作用。本质上,它是一种用于描述语音信号短期功率谱特性的数学工具,能够帮助计算机更高效地理解和处理人类语音。将您的语音比作独一无二的指纹,MFCC的作用类似于通过独特代码识别语音的关键特征,使计算机能够分辨不同的单词和声音。在需要将语音转换为文本的语音识别应用中,MFCC编码方案尤为重要。
1.2 Mel 频率倒谱系数 (MFCC) 的作用
MFCC 是人类说话时声带的数学表示。该过程包括几个步骤,以提取人类语音的基本特征。以下是 MFCC 如何帮助理解语音:信号分解:语音信号复杂,由频率和振幅变化组成。MFCC 可以将其分解为更简单的成分,这些成分描述了声波随时间变化的速率和特性。频率转换:人类的听觉系统对频率的感知更为不敏感,因此 MFCC 使用 mel 音阶进行转换,使低频变化比高频变化更易捕捉。倒谱表示:经过 mel 转换后,信号被转换为倒谱时域表示,这种表示能将信号的周期性变化与缓慢变化区分开来,专注于后者,后者包含了语音识别所需的关键信息。
1.3 用于音频分析的 Mel-Scale
梅尔音阶是一种专为模拟人类声音感知机制而设计的音频处理方法,特别关注人类在区分音高差异方面的生理机制。人类听觉系统在感知低频变化时相较于高频变化表现出更高的敏感度。通过在低于1000Hz的频率范围内采用线性间隔,在高于1000Hz的频率范围内采用对数间隔来解决这一问题。这种缩放方式使得梅尔音阶能够更贴近人类听觉系统的非线性特性:
线性频段:在低于1000Hz的频率范围内,人类耳朵能够感知到音高的细微变化。梅尔音阶通过线性间隔这些频率来反映这种灵敏度,这意味着频率的变化直接对应于音阶上的比例变化。
对数频段:在高于1000Hz的频率范围内,人类耳朵对于频率变化的敏感度显著降低。梅尔音阶通过对数间隔将听起来相似的频率更紧密地组合在一起。这种对数性质意味着,随着频率的增加,需要更大的变化才能在音高上实现类似的感知差异。
这种双重设计方法不仅有助于提升语音处理和音乐分析等领域的技术效果,还能够在捕捉人类实际聆听方式的细微差别方面取得显著的提升。
1.4 如何计算 MFCC?
通过从 DCT 输出中提取前几个系数,我们获得了 MFCCs,这些特征能够有效地描述语音信号的时域特性。要计算得到 Mel 频率 Cepstral 系数,我们按照以下步骤操作:
1)预加重处理:通过放大信号中较高的频率成分,以平衡频谱能量。
2)分帧:将信号分割成小的重叠帧。
3)窗口化:对每个帧应用汉明窗函数,以平滑帧的边界。
4)FFT 转换:对每个帧进行快速傅里叶变换,将其转换为频域表示。
5)Mel 滤波器组:应用根据 Mel 尺度间隔设置的重叠三角形滤波器组。
6)对数处理:对滤波器组输出取对数,以模拟人耳对声音强度的感知特性。
7)DCT 变换:对对数 Mel 频谱进行离散余弦变换,最终获得 Mel 频率 Cepstral 系数。
2.1 读取语音信号
close all
clear all
clc
%1读取音频文件
info =audioinfo('test.wav');%获取音频文件的信息
[audio,Fs] = audioread('test.wav');%读取音频文件
sound(audio,Fs);%播放音频文件
audiolength = length(audio);%获取音频文件的数据长度
t =audiolength;
x=audio;
%
figure(1),
plot(x(1:t));
xlabel('Time');
ylabel('Audio Signal');
title('原始音频文件信号幅度图');

2.2 预加重
预增强技术是一种在声音信号处理领域,尤其是语音识别应用中,用于增强语音高频成分的技术。这是必要的,因为人类声带的生理特性以及声音传播特性导致语音信号在高频段能量衰减。通过预增强高频成分:可以优化语音清晰度:加强高频部分的细节(如共振峰和辅音)以提高辨识度。这有助于提升信号质量:优化后续处理阶段(如特征提取):提高信噪比:突出语音特征。预增强技术通过保留和强化关键语音特征,为后续处理提供了更好的基础。
%2 预加重
% 预加重y=x(i)-0.97*x(i-1)
for i=2:t
x1(i)=x(i)-0.97*x(i-1);
end
%y=y';%对y取转置
figure(2),
subplot(2,1,1),
plot(x(1:t));
xlabel('Time');
ylabel('Audio Signal');
title('原始音频文件信号幅度图');
subplot(2,1,2),
plot(x1(1:t));
xlabel('Time');
ylabel('Audio Signal');
title('预加重音频文件信号幅度图');

2.3 分帧
在语音处理领域中,连续语音流被划分为较短的时间段,简称为帧,通常持续20至40毫秒。这种分割是必需的,因为语音特征(如音高和语气)会随着时间推移而发生变化。通过解析这些短而稳定的片段,我们可以更有效地解析和评估语音的动态特性。此外,帧通常重叠50%,确保不会遗漏任何重要信息,并使区段之间的过渡变得平滑。这种重叠有助于防止不连续性,并确保对语音流进行全面分析。
% 3 分帧
% frame blocking , windowing , fft , mel freq wrapping , cepstrum
x2 = [];
M = 160;
N = 320;%20ms
temp = zeros(N);
for i = 1:floor(length(x1)/M)-1
for j = 1:N
if((i-1)*M+j <= length(x1))
x2(i,j)=x1((i-1)*M+j);
else
x2(i,j) = 0;
end
end
end
figure(3),
imagesc(x2),
title('Speech frame'),
xlabel('Frame number'),
ylabel('Speech samples in frame');

imagesc 是 MATLAB 以及其类似软件(如 Octave)中广泛使用的用于显示图像的函数。该函数特别适用于显示以矩阵形式表示的图像数据,包括灰度图像以及以矩阵形式呈现的彩色图像。
以下是 imagesc 函数的基本用法和解释:
imagesc函数将矩阵X中的数据映射为图像显示在坐标轴上。该函数通过将矩阵元素的值映射到特定颜色范围,生成二维图像。imagesc函数默认会在图像上显示颜色条,标明数据的最小值、最大值及其对应的颜色。用户可以通过调整颜色条的属性来改变颜色映射方式。与surf和contour函数不同,imagesc函数主要用于显示二维矩阵的图像数据。使用imagesc函数时,可以指定额外的参数来调整颜色条的显示和格式。例如,使用imagesc(X)可以显示矩阵X,使用imagesc(X, ___)可以指定其他可选参数,如颜色条显示和格式设置等。
矩阵A被生成为一个100x100的随机灰度图像矩阵。使用imagesc函数显示该矩阵。在这个例子中,A中的每个元素值将映射到一个颜色上,并显示在坐标轴上。颜色条将展示当前的颜色映射方式。
2.4 加窗
为了防止由于每帧突然开始和结束而导致的频谱泄漏现象,应用了一种称为窗口化的处理方法。具体来说,包括以下步骤:首先,窗函数(通常采用汉明窗)被应用于每个帧段,通过这种处理方式,可以实现帧段边缘的平滑过渡,从而减少信号振幅的突然变化,并最大限度地降低帧段边界处的不连续性。

%4 加窗
w = hamming(N);
windowed = zeros(floor(length(x1)/M)-1,N);
% figure(4),
% plot(w),
title('hamming window');
for i = 1:floor(length(x1)/M)-1
temp = x2(i,:);
for j =1:N
windowed(i,:)=w'.*temp;
end
end
figure(4),
imagesc(windowed),
title('Windowed Frame'),
xlabel('Frame Number'),
ylabel('Speech samples in frame');

2.5 FFT
快速傅里叶变换(FFT)是一种高效计算傅里叶变换的方法,通过将时域信号转换为频域,能够有效识别帧内的频率成分。该方法通过快速傅里叶变换实现了对频率成分的高效分析。
Xfft = zeros(N,floor(length(x1)/M)-1);
Xfft = fft(windowed');
magx = abs(Xfft).^2;
for k = 1:N/2+1
psdx(k,:) = magx(k,:);
end
figure(5),
imagesc(psdx),
title('Spectrogram'),
xlabel('Time(frame number)'),
ylabel('Frequency (FFT number)');

2.6 Mel-filterbank
在频域中,信号将被施加一组 Mel 滤波器。频带分离(Frequency Band Separation): 这涉及一组根据 Mel 标度调谐的滤波器,每个滤波器负责特定的频率范围。Mel 滤波器组将 FFT 输出划分为多个频带,并捕获每个频带的能量水平。突出重要频率(Emphasis on Important Frequencies): 通过根据人类听觉感知的重要性来调谐滤波器,Mel 滤波器组能够突出显示对人类听觉具有感知重要性的频率,从而降低数据的复杂性。

2.7 Log Mel-spectrum
人类对响度的感知是对数而非线性的。对数压缩处理:通过采用Mel滤波器组对输出信号取对数处理,实现了信号动态范围的压缩。在此阶段,创建的表示形式更贴近人类感知声音强度的特点。
% 7 Log Mel-spectrum
melcc = mel*psdx(1:N/2+1,:);
figure(7),
imagesc(melcc),
title('Mel spectrum'),
xlabel('Time (frame number)'),
ylabel('(Frequency)Mel number');

2.8 Discrete Cosine Transform (DCT)
最后,将 DCT 应用于对数 Mel 频谱:
滤波器组系数的降相关:DCT 通过减少滤波器组系数之间的冗余,突出每帧中最具代表性的语音特征。
高效的特征表示:经过处理后得到的一组称为 Mel 频率倒谱系数,这种表示方式能够有效提取声音的基本特征,从而便于实现语音识别和说话人识别等任务。
% 8 Discrete Cosine Transform (DCT)
set(gca,'YDir','normal');
ceps = dct(log(melcc));
figure(8),
imagesc(ceps),
title('Mel-frequency Cepstrum coefficients'),
xlabel('Time(frame number)'),ylabel('MFCC');
set(gca,'YDir','normal');

