隐马尔科夫模型(Hidden Markov Model, HMM)是语音识别领域的经典统计模型,尤其适用于时序信号与隐含状态序列的关联建模 。在语音识别中,语音信号是观测序列 (如音频帧的声学特征),而对应的音素、单词或句子 是隐含状态序列。HMM通过建模状态转移、观测概率和初始状态,实现对语音信号的时序模式学习,是早期语音识别系统(如IBM ViaVoice、Dragon NaturallySpeaking)的核心技术。
一、HMM在语音识别中的核心作用
1. 声学模型(Acoustic Model)
将语音信号的声学特征(如MFCC、PLP)映射到音素(Phoneme)或子音素(Sub-phoneme)等语言单元。每个音素对应一个HMM,状态数通常为3-5个(如3状态HMM:起始、稳定、结束),状态间转移概率和观测概率(发射概率)通过训练数据学习。
2. 时序建模
语音信号是典型的时序数据(帧长10-30ms,帧移5-10ms),HMM的马尔可夫性(当前状态仅依赖前一状态)天然适合捕捉这种短时相关性,同时通过隐含状态序列描述长时依赖。
3. 解码(Decoding)
给定观测序列(语音特征),通过Viterbi算法寻找最可能的隐含状态序列(音素/单词),实现语音到文本的转换。
二、HMM语音识别的数学框架
1. HMM三要素
- 状态转移概率矩阵 AAA :A=[aij]A = [a_{ij}]A=[aij],表示状态 iii 转移到状态 jjj 的概率,aij=P(qt+1=j∣qt=i)a_{ij} = P(q_{t+1}=j | q_t=i)aij=P(qt+1=j∣qt=i)。
- 观测概率矩阵 BBB :B=[bj(ot)]B = [b_j(o_t)]B=[bj(ot)],表示状态 jjj 生成观测 oto_tot 的概率(如高斯混合模型GMM描述连续特征)。
- 初始状态概率 π\piπ :π=[πi]\pi = [\pi_i]π=[πi],表示初始状态为 iii 的概率,πi=P(q1=i)\pi_i = P(q_1=i)πi=P(q1=i)。
2. 语音识别问题形式化
给定观测序列 O=o1,o2,...,oTO = o_1, o_2, ..., o_TO=o1,o2,...,oT(语音特征),求最可能的状态序列 Q=q1,q2,...,qTQ = q_1, q_2, ..., q_TQ=q1,q2,...,qT(音素/单词),即:
Q∗=argmaxQP(Q∣O)=argmaxQP(O∣Q)P(Q)P(O)Q^* = \arg\max_Q P(Q|O) = \arg\max_Q \frac{P(O|Q)P(Q)}{P(O)}Q∗=argQmaxP(Q∣O)=argQmaxP(O)P(O∣Q)P(Q)
由HMM的贝叶斯公式 和马尔可夫性 ,等价于最大化 P(O∣Q)P(Q)P(O|Q)P(Q)P(O∣Q)P(Q),通过Viterbi算法高效求解。
三、HMM语音识别的代码实现(MATLAB)
以下以孤立词识别 (如数字0-9)为例,基于MATLAB实现HMM语音识别系统,包括数据准备、模型训练、识别测试三部分。
1. 数据准备:语音特征提取
语音信号需预处理为声学特征序列(如MFCC),作为HMM的观测序列。
matlab
function mfcc_features = extract_mfcc(audio_signal, fs)
% 输入:audio_signal-语音信号,fs-采样率
% 输出:mfcc_features-MFCC特征矩阵(帧数×特征维数)
% 1. 预加重(增强高频)
pre_emph = [1, -0.97];
audio_emph = filter(pre_emph, 1, audio_signal);
% 2. 分帧(帧长25ms,帧移10ms)
frame_len = round(0.025 * fs); % 25ms帧长
frame_shift = round(0.01 * fs); % 10ms帧移
frames = buffer(audio_emph, frame_len, frame_len - frame_shift, 'nodelay');
% 3. 加汉明窗
window = hamming(frame_len);
frames = frames .* window;
% 4. 傅里叶变换(FFT)
nfft = 512;
mag_spec = abs(fft(frames, nfft));
% 5. 梅尔滤波器组(26个滤波器)
mel_filters = mel_filter_bank(fs, nfft, 26);
mel_energy = log(mel_filters * mag_spec(1:nfft/2+1, :)); % 取前半频谱
% 6. DCT变换(取前12个系数+能量=13维MFCC)
mfcc = dct(mel_energy);
mfcc_features = mfcc(1:13, :); % 13维MFCC特征
end
function filters = mel_filter_bank(fs, nfft, num_filters)
% 生成梅尔滤波器组
low_freq = 20; high_freq = fs/2;
mel_low = 2595 * log10(1 + low_freq/700);
mel_high = 2595 * log10(1 + high_freq/700);
mel_points = linspace(mel_low, mel_high, num_filters+2);
hz_points = 700 * (10.^(mel_points/2595) - 1);
bin = floor((nfft+1)*hz_points/fs);
filters = zeros(num_filters, nfft/2+1);
for m = 1:num_filters
left = bin(m); center = bin(m+1); right = bin(m+2);
for k = left:center-1
filters(m, k+1) = (k - left)/(center - left);
end
for k = center:right-1
filters(m, k+1) = (right - k)/(right - center);
end
end
end
2. HMM模型训练(Baum-Welch算法)
用Baum-Welch算法(EM算法特例)训练HMM参数(A, B, π),以孤立词"0-9"为例,每个词对应一个HMM模型。
matlab
function hmm_models = train_hmm_models(train_data, num_states, num_mixtures)
% 输入:train_data-训练数据(cell数组,每个元素为一个词的MFCC特征矩阵)
% num_states-每个HMM的状态数(如3)
% num_mixtures-GMM混合高斯分量数(如3)
% 输出:hmm_models-训练好的HMM模型(每个词一个模型)
num_words = length(train_data);
hmm_models = cell(1, num_words);
for word_idx = 1:num_words
% 1. 初始化HMM参数
O = train_data{word_idx}; % 当前词的MFCC特征(特征维数×帧数)
[feat_dim, T] = size(O);
% 初始状态概率π:均匀分布
pi = ones(1, num_states) / num_states;
% 状态转移矩阵A:随机初始化(行和为1)
A = rand(num_states, num_states);
A = A ./ sum(A, 2);
% 观测概率B:GMM模型(每个状态一个GMM)
B = cell(1, num_states);
for s = 1:num_states
% 用K-means初始化GMM参数
[centers, ~] = kmeans(O', num_mixtures); % 聚类中心
weights = ones(1, num_mixtures) / num_mixtures; % 混合权重
covariances = repmat(diag(var(O, 0, 2)), 1, 1, num_mixtures); % 协方差矩阵
B{s} = struct('weights', weights, 'centers', centers', 'covariances', covariances);
end
% 2. Baum-Welch算法迭代训练
max_iter = 20;
for iter = 1:max_iter
[gamma, xi] = forward_backward(O, A, B, pi); % 前向-后向算法
% 更新π, A, B(GMM参数用EM更新)
pi = gamma(:, 1)';
A = squeeze(sum(xi, 3)) ./ sum(gamma(:, 1:end-1), 2);
for s = 1:num_states
B{s} = update_gmm(O, gamma(s, :), num_mixtures); % 更新GMM
end
end
% 3. 保存HMM模型
hmm_models{word_idx} = struct('A', A, 'B', B, 'pi', pi, 'num_states', num_states);
end
end
function [gamma, xi] = forward_backward(O, A, B, pi)
% 前向-后向算法计算gamma和xi
num_states = size(A, 1);
T = size(O, 2);
% 前向概率alpha
alpha = zeros(num_states, T);
alpha(:, 1) = pi' .* compute_gmm_prob(O(:, 1), B);
for t = 2:T
for j = 1:num_states
alpha(j, t) = sum(alpha(:, t-1) .* A(:, j)) * compute_gmm_prob(O(:, t), B{j});
end
end
% 后向概率beta
beta = zeros(num_states, T);
beta(:, T) = 1;
for t = T-1:-1:1
for i = 1:num_states
beta(i, t) = sum(A(i, :) .* compute_gmm_prob(O(:, t+1), B) .* beta(:, t+1));
end
end
% 计算gamma和xi
gamma = alpha .* beta ./ sum(alpha .* beta, 1);
xi = zeros(num_states, num_states, T-1);
for t = 1:T-1
for i = 1:num_states
for j = 1:num_states
xi(i, j, t) = alpha(i, t) * A(i, j) * compute_gmm_prob(O(:, t+1), B{j}) * beta(j, t+1);
end
end
xi(:, :, t) = xi(:, :, t) / sum(xi(:, :, t), 'all');
end
end
3. 语音识别(Viterbi解码)
给定测试语音的MFCC特征,用Viterbi算法计算每个HMM模型的得分,取得分最高的词作为识别结果。
matlab
function recognized_word = recognize_speech(test_feature, hmm_models)
% 输入:test_feature-测试语音的MFCC特征(特征维数×帧数)
% hmm_models-训练好的HMM模型(每个词一个)
% 输出:recognized_word-识别结果(词索引)
num_words = length(hmm_models);
scores = zeros(1, num_words);
for word_idx = 1:num_words
hmm = hmm_models{word_idx};
A = hmm.A; B = hmm.B; pi = hmm.pi;
T = size(test_feature, 2);
num_states = hmm.num_states;
% Viterbi算法
delta = zeros(num_states, T);
psi = zeros(num_states, T); % 回溯指针
% 初始化
delta(:, 1) = pi' .* compute_gmm_prob(test_feature(:, 1), B);
for s = 1:num_states
psi(s, 1) = 0;
end
% 递推
for t = 2:T
for j = 1:num_states
[delta(j, t), psi(j, t)] = max(delta(:, t-1) .* A(:, j) * compute_gmm_prob(test_feature(:, t), B{j}));
end
end
% 终止
[scores(word_idx), ~] = max(delta(:, T));
end
% 取得分最高的词
[~, recognized_word] = max(scores);
end
参考代码 在语音识别领域该代码运用隐马尔科夫模型 www.youwenfan.com/contentcst/135822.html
四、HMM语音识别的优化与现代改进
1. 传统HMM的局限性
- 特征表征能力弱:MFCC是手工设计特征,难以捕捉复杂声学模式。
- 状态建模简单:固定状态数的HMM对长时依赖建模不足。
- 数据稀疏性:小样本下GMM参数估计不准确。
2. 现代改进:DNN-HMM混合模型
- DNN替代GMM :用深度神经网络(DNN)学习观测概率 BBB,输入MFCC特征,输出状态后验概率 P(qt∣ot)P(q_t|o_t)P(qt∣ot),解决GMM的"对角协方差"假设问题。
- 端到端模型:如CTC(Connectionist Temporal Classification)、Transformer,直接建模语音到文本的映射,绕过HMM的中间状态。
3. 代码优化方向
- 特征增强:加入一阶/二阶差分(Δ、ΔΔ)形成39维MFCC。
- 模型压缩:用决策树绑定HMM状态,减少参数冗余。
- 并行计算:用GPU加速Viterbi算法和Baum-Welch训练。
五、总结
HMM是语音识别领域的里程碑模型,通过时序状态建模 和概率解码 ,实现了从语音信号到文本的转换。尽管现代深度学习模型(如DNN、Transformer)已逐步取代传统HMM,但HMM的概率框架 和Viterbi解码仍是许多混合系统(如DNN-HMM)的核心组件。