基于VQ的特定人孤立词语音识别设计与实验

4星 · 超过85%的资源 需积分: 10 64 下载量 190 浏览量 更新于2024-09-17 6 收藏 136KB DOC 举报
基于VQ的特定人孤立词语音识别是一种先进的语音识别技术,它侧重于识别个体特有的孤立发音单词。这项设计的主要流程涉及预加重、特征提取、模板训练和系统测试。 首先,预加重处理是对输入语音信号进行增强,以提高高频成分,这有助于区分不同说话者的特征。接着,采用Mel频率倒谱系数(MFCC)作为特征参数,这是一种广泛使用的音频特征提取方法,因为它能有效捕捉声音的频谱特性,对语音识别至关重要。 在模板训练阶段,采用了矢量量化技术。矢量量化是一种数据压缩技术,通过将连续的信号空间划分为离散的矢量码book,使得相似的语音样本可以被归类到同一个码书区域,从而实现语音的编码和存储。通过对特定人的模版语音使用适量的量化方法,可以形成该个人的语音模型,这个模型对于识别该人说话具有很高的精度。 识别过程通过系统框图展示,主要包括端点检测、特征提取、量化和识别模型应用。端点检测是关键步骤,使用双阈值策略来准确划分静音、过渡、语音和结束阶段,以便提取出孤立词的边界。然后,对每帧语音进行加窗处理,提取出用于识别的特征矢量,并将其进行量化,转化为便于处理的形式。 实验结果显示,该系统在识别训练过的人的语音时表现出极高的识别率,达到100%,这得益于其针对特定人的个性化模板和精细的特征处理。然而,对于未训练过的人,识别率可能会下降,因为系统依赖于预先学习的模板,对于新的语音样本可能存在误识或拒识的情况。 基于VQ的特定人孤立词语音识别技术在保证识别精度的同时,也面临着扩展到非特定人和多词连续识别的挑战。未来的研究可能需要考虑如何改进模型的泛化能力,以适应更广泛的语音环境。
2011-10-09 上传
hmm算法matlab实现和实例 hmm_em.m function [LL, prior, transmat, obsmat, nrIterations] = ... dhmm_em(data, prior, transmat, obsmat, varargin) % LEARN_DHMM Find the ML/MAP parameters of an HMM with discrete outputs using EM. % [ll_trace, prior, transmat, obsmat, iterNr] = learn_dhmm(data, prior0, transmat0, obsmat0, ...) % % Notation: Q(t) = hidden state, Y(t) = observation % % INPUTS: % data{ex} or data(ex,:) if all sequences have the same length % prior(i) % transmat(i,j) % obsmat(i,o) % % Optional parameters may be passed as 'param_name', param_value pairs. % Parameter names are shown below; default values in [] - if none, argument is mandatory. % % 'max_iter' - max number of EM iterations [10] % 'thresh' - convergence threshold [1e-4] % 'verbose' - if 1, print out loglik at every iteration [1] % 'obs_prior_weight' - weight to apply to uniform dirichlet prior on observation matrix [0] % % To clamp some of the parameters, so learning does not change them: % 'adj_prior' - if 0, do not change prior [1] % 'adj_trans' - if 0, do not change transmat [1] % 'adj_obs' - if 0, do not change obsmat [1] % % Modified by Herbert Jaeger so xi are not computed individually % but only their sum (over time) as xi_summed; this is the only way how they are used % and it saves a lot of memory. [max_iter, thresh, verbose, obs_prior_weight, adj_prior, adj_trans, adj_obs] = ... process_options(varargin, 'max_iter', 10, 'thresh', 1e-4, 'verbose', 1, ... 'obs_prior_weight', 0, 'adj_prior', 1, 'adj_trans', 1, 'adj_obs', 1); previous_loglik = -inf; loglik = 0; converged = 0; num_iter = 1; LL = []; if ~iscell(data) data = num2cell(data, 2); % each row gets its own cell end while (num_iter <= max_iter) & ~converged % E step [loglik, exp_num_trans, exp_num_visits1, exp_num_emit] = ... compute_ess_dhmm(prior, transmat, obsmat, data, obs_prior_weight); % M step if adj_prior prior = normalise(exp_num_visits1); end if adj_trans & ~isempty(exp_num_trans) transmat = mk_stochastic(exp_num_trans); end if adj_obs obsmat = mk_stochastic(exp_num_emit); end