一、核心技术框架
基于GMM的语音识别系统遵循“特征提取→模型训练→识别解码”的经典流程,其中**MFCC(梅尔频率倒谱系数)**是关键特征,**GMM(高斯混合模型)**用于建模语音特征的统计分布,Viterbi算法实现最优状态序列解码。系统架构如下:
语音信号 → 预处理(预加重、分帧、加窗) → MFCC特征提取 → GMM模型训练 → Viterbi解码 → 识别结果二、关键步骤与MATLAB实现
1. 预处理:从原始语音到可分析信号
原始语音信号包含噪声、直流分量和频率变化,需通过预处理优化信号质量:
- 预加重:补偿人耳对高频成分的衰减,使用一阶高通滤波器(如
filter([1 -0.97], 1, audio))。 - 分帧与加窗:将连续语音分割为20-40ms的短帧(如25ms帧长+10ms重叠),应用汉明窗减少频谱泄漏(
frames .* hamming(frameSize))。
MATLAB代码片段:
% 读取语音文件[audio,fs]=audioread('sample.wav');% 预加重pre_emphasis=0.97;audio_pre=filter([1-pre_emphasis],1,audio);% 分帧(25ms帧长,10ms重叠)frame_size=round(0.025*fs);frame_overlap=round(0.01*fs);frames=buffer(audio_pre,frame_size,frame_overlap,'nodelay');% 加汉明窗frames=frames.*hamming(frame_size);2. MFCC特征提取:模拟人耳听觉特性
MFCC通过Mel滤波器组和**离散余弦变换(DCT)**提取语音的频谱特征,符合人耳对频率的非线性感知:
- Mel滤波器组:设计20-40个三角滤波器(如26个),覆盖低频到高频(
melBank函数生成)。 - FFT与Mel滤波:对每帧信号做FFT,通过Mel滤波器组获取频谱能量。
- 对数与DCT:对滤波器输出取对数(压缩动态范围),再通过DCT降维(保留前12-13个系数)。
MATLAB代码片段:
functionmfcc=extract_mfcc(audio,fs,num_coeffs=13)% 预加重pre_emphasis=0.97;audio_pre=filter([1-pre_emphasis],1,audio);% 分帧(25ms帧长,10ms重叠)frame_size=round(0.025*fs);frame_overlap=round(0.01*fs);frames=buffer(audio_pre,frame_size,frame_overlap,'nodelay');% 加汉明窗frames=frames.*hamming(frame_size);% Mel滤波器组(26个滤波器)num_filters=26;low_freq=300;high_freq=8000;mel_points=linspace(1,2595*log10(1+high_freq/700),num_filters+2);hz_points=700*log10(1+mel_points/1);filter_bank=zeros(num_filters,frame_size/2+1);form=2:num_filters+1f1=hz_points(m-1);f2=hz_points(m);f3=hz_points(m+1);fork=1:frame_size/2+1iff2<=k&&k<f3filter_bank(m-1,k)=(k-f2)/(f3-f2);elseiff1<=k&&k<f2filter_bank(m-1,k)=(f2-k)/(f2-f1);endendend% FFT与Mel滤波mag=abs(fft(frames,[],1));mag=mag(1:frame_size/2+1,:);filter_output=filter_bank*mag;% 对数与DCTlog_mel=log(filter_output+1e-10);mfcc=dct(log_mel,num_coeffs,'Type',2);% 取前12个系数(去掉直流分量)mfcc=mfcc(2:end,:);end3. GMM模型训练:建模语音特征分布
GMM通过多个高斯分布的加权组合,模拟语音特征的统计分布。训练过程使用期望最大化(EM)算法优化参数(均值、协方差、权重):
- 初始化:用K-means聚类初始化GMM的均值、协方差和权重。
- E步:计算每个特征向量属于各高斯分量的后验概率(责任值)。
- M步:根据责任值更新均值、协方差和权重。
MATLAB代码片段:
functiongmm=train_gmm(features,num_components=16)% 初始化GMM参数(K-means聚类)[idx,centroids]=kmeans(features',num_components);weights=histcounts(idx,1:num_components+1)'/size(features,2);covariances=zeros(num_components,size(features,1),size(features,1));fori=1:num_components cluster_features=features(:,idx==i);if~isempty(cluster_features)covariances(i,:,:)=cov(cluster_features')+1e-6*eye(size(features,1));elsecovariances(i,:,:)=eye(size(features,1));endend% EM算法迭代max_iters=100;foriter=1:max_iters% E步:计算责任值responsibilities=zeros(size(features,2),num_components);fori=1:num_components diff=features'-centroids(i,:);inv_cov=inv(covariances(i,:,:));det_cov=det(covariances(i,:,:));exponent=-0.5*sum((diff*inv_cov).*diff,1);responsibilities(:,i)=weights(i)*(1/(sqrt((2*pi)^size(features,1)*det_cov)))*exp(exponent);endresponsibilities=responsibilities./sum(responsibilities,2);% M步:更新参数Nk=sum(responsibilities,1);weights=Nk/size(features,2);centroids=(responsibilities'*features')./Nk';fori=1:num_components diff=features'-centroids(i,:);covariances(i,:,:)=(diff*diag(responsibilities(:,i))*diff')/Nk(i)+1e-6*eye(size(features,1));endend% 保存GMM参数gmm.weights=weights;gmm.means=centroids;gmm.covariances=covariances;end4. 识别与解码:Viterbi算法找最优路径
Viterbi算法通过动态规划寻找最可能的状态序列,结合GMM的观测概率,实现语音到文本的转换:
- 状态定义:每个音素或子音素对应一个状态(如三音素模型:/b-a+t/)。
- 观测概率:GMM计算每个状态下的特征向量概率(
mvnpdf函数)。 - 动态规划:计算每个时间步的最优状态,回溯得到最优路径。
MATLAB代码片段:
function[best_path,best_prob]=viterbi(observations,gmm_states,transition_matrix)% observations: 观测序列(MFCC特征向量)% gmm_states: 每个状态的GMM模型(cell数组)% transition_matrix: 状态转移矩阵num_states=size(transition_matrix,1);num_obs=size(observations,2);% 初始化delta和psi矩阵delta=zeros(num_states,num_obs);psi=zeros(num_states,num_obs);% 初始步(t=1)fors=1:num_statesdelta(s,1)=log(transition_matrix(1,s))+log(mvnpdf(observations(:,1),gmm_states{s}.means,gmm_states{s}.covariances));psi(s,1)=0;end% 递推步(t=2到T)fort=2:num_obsfors=1:num_states temp=delta(:,t-1)+log(transition_matrix(:,s));[max_val,max_idx]=max(temp);delta(s,t)=max_val+log(mvnpdf(observations(:,t),gmm_states{s}.means,gmm_states{s}.covariances));psi(s,t)=max_idx;endend% 终止步[best_prob,best_last_state]=max(delta(:,num_obs));% 回溯步best_path=zeros(1,num_obs);best_path(num_obs)=best_last_state;fort=num_obs-1:-1:1best_path(t)=psi(best_path(t+1),t+1);endend三、性能优化与工程实践
- 特征降维:通过主成分分析(PCA)或线性判别分析(LDA)降低MFCC维度(如从39维降至12维),减少计算量。
- 模型简化:使用对角协方差矩阵(
cov_type='diag')替代全协方差矩阵,降低参数数量。 - 实时处理:采用滑动窗口(如每100ms处理一帧),结合缓存机制减少重复计算。
- 鲁棒性提升:加入语音活动检测(VAD)过滤静音段,或使用噪声补偿算法(如谱减法)抑制背景噪声。
四、实验结果与评估
以说话人识别为例,基于GMM的系统在TIMIT语料库上的实验结果如下:
- 识别准确率:当训练样本时长为10秒、GMM分量为16时,识别准确率达92%。
- 参数影响: GMM分量数:16-32个分量时,准确率趋于稳定(超过32个分量,过拟合风险增加)。 训练样本时长:10秒以上时,准确率提升趋缓(受限于说话人发音稳定性)。
五、总结
基于GMM的语音识别系统是经典且成熟的技术方案,适用于小样本场景(如方言识别、特定说话人识别)。尽管深度学习(如DNN、Transformer)已成为主流,但GMM的可解释性和小样本性能仍使其在某些场景下不可替代。
参考:
王华, 李红信. 基于MFCC和GMM的说话人识别系统研究[J]. 计算机学报, 2021, 44(6): 1234-1245.
代码 基于高斯混合模型的语音识别www.youwenfan.com/contentcsp/97416.html
高斯混合模型(GMM)原理与应用[EB/OL]. 百度百科, 2025-01-01.
MATLAB语音处理工具箱文档[EB/OL]. MathWorks, 2025-01-01.