数字信号

1.语音识别概述
语音识别是试图使机器能“听懂”人类语音的技术。语音识别的作用是将语音转换成等价的书面信息,也就是让计算机听懂人说话。作为一门交叉学科,语音识别又是以语音为研究对象,是语音信号处理的一个重要研究方向,是模式识别的一个分支,涉及到计算机、信号处理、生理学、语言学、神经心理学、人工智能等诸多领域,甚至还涉及到人的体态语言(如人在说话时的表情、手势等行为动作可帮助对方理解),其最终目标是实现人与机器进行自然语言通信
1.1 国外研究历史及现状
语音识别的研究工作可以追溯到20世纪50年代。1952年AT&T贝尔实验室的Audry系统,是第一个可以识别十个英文数字的语音识别系统。20世纪60年代末、70年代初出现了语音识别方面的几种基本思想,其中的重要成果是提出了信号线性预测编码(LPC)技术和动态时间规整(DTW)技术,有效地解决了语音信号的特征提取和不等长语音匹配问题;同时提出了矢量量化(VQ)和隐马尔可夫模型(HMM)理论。20世80年代语音识别研究进一步走向深入:其显著特征是HMM模型和人工神经网络(ANN)在语音识别中的成功应用。90年代,在计算机技术、电信应用等领域飞速发展的带动下,迫切要求语音识别系统从实验室走向实用。最具代表性的是IBM的ViaVoice和Dragon公司的Dragon Dictate系统。这些系统具有说话人自适应能力,新用户不需要对全部词汇进行训练,便可在使用中不断提高识别率。
1.2  国内研究历史及现状
我国在语音识别研究上也投入了很大的精力,国内中科院的自动化所、声学所以及清华大学等科研机构和高校都在从事语音识别领域的研究和开发。国家863智能计算机专家组为语音识别技术研究专门立项,我国语音识别技术的研究水平已经基本上与国外同步。
2.  语音识别的流程
根据对输出观测值概率的不同描述,HMM(隐式马尔可夫链)可分为离散HMM(DHMM)和连续HMM(CHMM),两者相似,不同的是CHMM使用连续概率密度函数计算状态概率。而DHMM则使用的是离散的矢量量化(vector quantization,VQ)计算状态概率。在基于DHMM的非特定人语音识别过程中语音信号先被分成若干音框(帧),每个音框用一个特征向量参数表示,然后将语音特征参数向量的时间序列矢量化,此时每一个音框的语音信号变成VQ码本,用码本训练HMM,最后测试识别率。
3.  语音信号分析方法分类时域特征
直接从时域信号计算得到,反应了语音信号时域波形的特征。如短时平均能量、短时平均过零率、共振峰、基音周期等。
频域及倒谱域特征由时域信号进行频谱变换得到,反映语音信号的频域特性
包括傅里叶频谱、倒谱以及利用了语音信号的时序信息的时频谱。听觉特征指不直接对声道模型进行研究,而是从人类听觉系统对语音的感知特性来刻画语音信号的特征。
4.  短时分析技术
语音信号是非平稳时变信号语音信号的特性是随时间而变化的幸运的是具有短时平稳性短时间范围内其特性基本保持不变(缓慢变换),即短时相对平稳——准平稳过程短时分析技术即在对语音信号进行分析时,将语音信号分为一段一段,利用平稳信号的分析方法对每一分段进行处理每一分段成为一“帧”:一般10~30ms为一帧短时分析的不足对语音识别,应采用HMM来分析,以处理语音信号的瞬变和非平稳特性
5.  基于Mel频率的倒谱MFCC
生理支持
根据人类听觉系统的特性,人耳分辨声音频率的过程犹如一种取对数的功能,基于此,出现了Mel频率的倒谱系数(MFCC)MFCC: Mel-Frequency Cepstrum Coefficients.
语音识别MFCC参数提取:
金钱的魔力教学设计在语音识别(Speech Recognition)和语者辨识(Speaker Recognition)方面,最常用到的语音特征就是[梅尔倒频谱系数](Mel-scale Frequency Cepstral Coefficients,简称MFCC),此参数考虑到人耳对不同频率的感受程度,因此特别适合用在语音识别。下面简单的介绍一下求解MFCC的过程。
5.1  音框化(Frame blocking)
先将N个取样点集合成一个观测单位,称为音框(Frame),通常N的值256或512,涵盖的时间约为20~30ms 左右。为了避免相邻两音框的变化过大,所以我们会让两相邻因框之间有一段重迭区域,此重迭区域包含了M个取样点,通常M的值约是 N 的一半或 1/3。通常语音识别所用的音频的取样频率为8 KHz或16 KHz,8KHz 来说,若音框长度为256 个取样点,则对应的时间长度是 256/8000*1000 = 32 ms。
5.2  汉明窗(Hamming window)
将每一个音框乘上汉明窗,以增加音框左端和右端的连续性(请见下一个步骤的说明)。假设音框化的讯号为S(n),n = 0,…N-1。那么乘上汉明窗后为S'(n) = S(n)*W(n),此W(n) 形式如下
5.3  快速傅利叶转换(Fast Fourier Transform, or FFT)
由于讯号在时域(Time domain)上的变化通常很难看出讯号的特性,所以通常将它转换成频域(Fre
quency domain)上的能量分布来观察,不同的能量分布,就能代表不同语音的特性。所以在乘上汉明窗后,每个音框还必需再经过 FFT以得到在频谱上的能量分布。 hq130
乘上汉明窗的主要目的,是要加强音框左端和右端的连续性,这是因为在进行 FFT时,都是假设一个音框内的讯号是代表一个周期性讯号,如果这个周期性不存在,FFT 会为了要符合左右端不连续的变化,而产生一些不存在原讯号的能量分布,造成分析上的误差。当
然,如果我们在取音框时,能够使音框中的讯号就已经包含基本周期的整数倍,这时候的音框左右端就会是连续的,那就可以不需要乘上汉明窗了。但是在实作上,由于基本周期的计算会需要额外的时间,而且也容易算错,因此我们都用汉明窗来达到类似的效果。
5.4  三角带通滤波器组(Triangular Bandpass Filters)
将能量频谱能量乘以一组 20个三角带通滤波器,求得每一个滤波器输出的对数能量(Log Energy)。必须注意的是:这20个三角带通滤波器在梅尔频率(Mel Frequency)上是平均分布的,而梅尔频率和一般频率 f 的关系式如下:
Mel(F)= 2595 * log
梅尔频率代表一般人耳对于频率的感受度,由此也可以看出人耳对于频率 f 的感受是呈对数变化的:
在低频部分,人耳感受是比较敏锐 。在高频部分,人耳的感受就会越来越粗糙 。
三角带通滤波器有两个主要目的:
对频谱进行平滑化,并消除谐波的作用,突显原先语音的共振峰。因此一段语音的音调或音高,是不会呈现在 MFCC 参数内,所以,用 MFCC 为特征的语音识别系统,并不会受到输入语音的音调不同而有所影响。
将傅立叶转换结果经三角带通滤波器组进行滤波。
表示第 个频带的三角带通滤波器
其中 是第 个频带的中心,这 个三角形带通滤波器在美尔(Mel-frequency)上是平均分配的。
下面方程式求每一个滤波器输出的对数能量
5.5  离散余弦转换(Discrete cosine transform, or DCT)
将滤波器输出的能量作离散余弦(Discrete Cosine Transform, DCT)计算梅尔频率倒频谱系数(Mel-frequency Cepstral Coefficients, MFCC)
离散余弦计算公式:
其中 大致取12左右。
5.6  对数能量(Log energy)
一个音框的音量(即能量),也是语音的重要特征,而且非常容易计算。因此我们通常再加上一个音框的对数能量(定义为一个音框内讯号的平方和,再取以 10 为底的对数值,再乘以 10),使得每一个音框基本的语音特征就有 13 维,包含了 1 个对数能量和 12 个倒频谱参数。(若要加入其他语音特征以测试辨识率,也可以在此阶段加入,这些常用的其他语音特征,包含音高、过零率、共振峰等。)
5.7  差量倒频谱参数(Delta cepstrum)
虽然已经求出 13 个特征参数,然而在实际应用于语音识别时,我们通常会再加上差量倒频谱参数,以显示倒频谱参数对时间的变化。它的意义为倒频谱参数相对于时间的斜率,也就是代表倒频谱参数在时间上的动态变化,公式如下:
这里 M 的值一般是取 2 ,t代表音框的数目,cm(t)指第t框的倒谱参数。 因此,如果加上差量运算,就会产生 26 维的特征向量;如果
再加上差差量运算,就会产生 39 维的特征向量。一般我们在 PC 上进行的语音识别,就是使用 39 维的特征向量。
6.  矢量量化,矢量量化的关键问题是如何获取VQ码本,本文采用聚类算法-LBG算法。
7.  用MATLAB实时采集信号程序
首先将录音放到程序中的路径下,运行即可。运行结果如下:
语音库语者 1 与语者 1 匹配成功
语音库语者 2 与语者 2 匹配成功
语音库语者 3 与语者 2 匹配成功
语音库语者 4 与语者 4 匹配成功
语音库语者 5 与语者 5 匹配成功
语音库语者 6 与语者 6 匹配成功
语音库语者 7 与语者 7 匹配成功
语音库语者 8 与语者 8 匹配成功
语音库语者 9 与语者 9 匹配成功
8.  结论:
运行结果表明该说话人识别系统的识别能力是比较理想的,识别率为88%,语音库3识别不成功的原因主要有两个,一方面3的录音本身噪音相对大些,导致系统很难识别,另一方面,识别系统的算法还不是很理想,导致识别准确率不是100%。
程序如下:
function speaker_rec
%%%%
code = train('D:\tools\work\',9);
test('D:\tools\work\',9, code);
%************************************************************************
function code = train(traindir, n)
%% 训练语音库里的声音样本,为每个人建立一个VQ码本
%% code=train(train,n)
%% 训练前,应将语音库中的语音文件用1:n的数字标记
% Input:
%  traindir :样本语音库的路径
%  n  :样本语音库中语音文件的个数
%
% Output:
%  code : trained VQ codebooks, code{i} for i-th speaker
k = 16;                          %VQ算法的最大迭代次数
for i = 1:n               
file = sprintf('%s%d.wav', traindir, i)  ;     
[s, fs] = wavread(file);
s=s(1:30000,1);
index = find(s == 0);              %避免除0
s(index) = 1e-17;
童年的发现教案v = MFCC(s, fs);                % Compute MFCC's
code{i} = vqlbg(v, k);            % Train VQ codebook
end
%*************************************************************************
function test(testdir, n, code)
%用于对测试语音库中的文件进行测试
%建库的时候应该给语音文件按阿拉伯数字进行编码,以方便程序读取
% Input:
% testdir :测试语库的路径
%      n :测试语音库中语音文件的个数
%      code : codebooks of all trained speakers
for k = 1:n                        % 读取测试库中的文件
file = sprintf('%s%d.wav', testdir, k);
[s, fs] = wavread(file);     
s=s(30000:60000,1);          %读取文件中的样本点,改变数值即可获取语音资料中的不同段
index = find(s == 0);          %避免除0
s(index) = 1e-17;
v =MFCC(s, fs);            % Compute MFCC's
distmin = inf;
k1 = 0;
for l = 1:length(code)      % each trained codebook, compute distortion
d = disteu(v, code{l}); % 测试语音与码本进行逐一匹配(计算欧氏距离)
dist = sum(min(d,[],2)) / size(d,1);
if dist < distmin
distmin = dist;
k1 = l;
end     
end
msg = sprintf('语音库语者 %d 与语者 %d 匹配成功', k, k1);
disp(msg);
end
%*************************************************************************
function d = disteu(x, y)
%%计算两个矩阵列之间的欧氏距离
% DISTEU Pairwise Euclidean distances between columns of two matrices
%
% Input:
%      x, y:  Two matrices whose each column is an a vector data.
%
% Output:
%      d:      Element d(i,j) will be the Euclidean distance between two
%              column vectors X(:,i) and Y(:,j)
%
% Note:
%      The Euclidean distance D between two vectors X and Y is:
%      D = sum((x-y).^2).^0.5
[M, N] = size(x);
[M2, P] = size(y);
if (M ~= M2)
error('Matrix dimensions do not match.')
end
d = zeros(N, P);
if (N < P)
copies = zeros(1,P);
for n = 1:N
d(n,:) = sum((x(:, n+copies) - y) .^2, 1);
end
else
copies = zeros(1,N);
for p = 1:P
d(:,p) = sum((x - y(:, p+copies)) .^2, 1)';
end
end
d = d.^0.5;
%*************************************************************************
function r = vqlbg(d,k)
%%采用LBG算法获取VQ码本
%%该算法程序来源:程序员联合开发网
% VQLBG Vector quantization using the Linde-Buzo-Gray algorithme
%
% Inputs: d contains training data vectors (one per column)
% k:算法最大的迭代次数
%
% Output: r contains the result VQ codebook (k columns, one for each centroids)
e = .01;
r = mean(d, 2);
dpr = 10000;
for i = 1:log2(k)
r = [r*(1+e), r*(1-e)];
while (i == 1)
z = disteu(d, r);
[m,ind] = min(z, [], 2);
t = 0;
for j = 1:2^i
r(:, j) = mean(d(:, find(ind == j)), 2);        %mean为MathWorks的库函数
x = disteu(d(:, find(ind == j)), r(:, j));
for q = 1:length(x)
t = t + x(q);
end
end
if (((dpr - t)/t) < e)
break;
else
dpr = t;
end
end
end
%**************************************************************************
%MFCC.m
%本文件用于计算MFCC倒谱系数(共可获得26维参数)
%输入:    s为用声卡采集的信号
%输出:  C为计算出的倒谱系数
function  C=MFCC(s,FS)
%************************************************************************
%将信号先音框化后加汉明窗(n为音框宽  m为音框距)
m = 100;
n = 256;
人机交互论文l = length(s);
nbFrame = floor((l - n) / m) + 1;
for i = 1:n
for j = 1:nbFrame
M(i, j) = s(((j - 1) * m) + i);
end
end
h = hamming(n);
M2 = diag(h) * M;
for i = 1:nbFrame
frame(:,i) = fft(M2(:, i));            %得各个音框的频谱
end
%************************************************
**************************
%% 用在melf频带上均布的三角带通滤波器组对频谱能量进行滤波
%将HZ转换美尔坐标
melf=2595*log10(1+FS/2/700);
melf_width=melf/21;
i=[0:21];
tem_melf=melf_width*i;
f_tem=(10.^(tem_melf/2595)-1)*700;
%  f_tem=round(f_tem);                  %划分频率段 f_tem(2:21)即为20个中心频率
for i=2:21
fm(i)=f_tem(i);                    %fm为第m个频带的中心
end
fm(22)=FS/2;
fm(1)=0;
bm=zeros(20,n/2+1);
j=1:n/2;
k(2:n/2+1)=FS/2/(n/2)*j;
for i=2:21
for j=1:n/2+1
if k(j)<fm(i-1)
bm1(j)=0;
else if fm(i-1)<=k(j) & k(j)<=fm(i)
bm1(j)=(k(j)-fm(i-1))/(fm(i)-fm(i-1)); 
else if fm(i)<k(j) & k(j)<=fm(i+1)
bm1(j)=(fm(i+1)-k(j))/(fm(i+1)-fm(i));
else     
bm1(j)=0;
end
end
end
end
bm(i-1,:)=bm1;
end
n2 = 1 + floor(n / 2);
z = bm * abs(frame(1:n2, :)).^2;
c = dct(log(z));                  %c为倒谱系数
c=c(1:12,:);                    %取前12维倒谱系数
%**************************************************************************
%%计算音框的对数能量
tem_frame=frame(1:n2,:);
for i=1:nbFrame
tem_frame(:,i)=tem_frame(:,i).^2;
sum_frame(i)=sum(tem_frame(:,i));
end
c_energy=10*log10(sum_frame);              %c_energy为第十三维参数
c13=zeros(12,nbFrame);
c13(:,1:nbFrame)=c(:,1:nbFrame);
c13(13,:)=c_energy;                          %c13为十三维参数
%**************************************************************************
%%计算差量倒谱系数
%%计算一阶差分
M=2;
tao=1:M;
文件传输协议
tem=tao.^2;
tem=sum(tem)*2;
c26_tem=zeros(13,nbFrame+4);
c26=zeros(26,nbFrame);
tem1=zeros(13,2);ibm as400
tem2=zeros(13,nbFrame);
c26_tem(:,3:nbFrame+2)=c13(:,1:nbFrame);
for i=1:nbFrame
for j=1:2
tem1(:,j)=(c26_tem(:,i+2+j)-c26_tem(:,i+2-j))*j/tem;
end
tem2(:,i)=tem1(:,1)+tem1(:,2);
end
c26(14:26,:)=tem2(1:13,:);                %c26为一阶差分后的26维参数
c26(1:13,:)=c13(1:13,:);
C=c26;
%**************************************************************************

本文发布于:2024-09-21 16:39:18,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/592613.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:语音   识别   信号   频谱
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议