资源描述
数字信号处理课程设计题目:基于 MATLAB的说话人语音识别班级:信号与信息处理研一学号:2150130425姓名:湛西羊任课教师:黄建军完成时间:2015/12/31目 一、系 任 及要求3二、 音 的 介3三、 音 原理33.1 音 系 体框架43.2 音信号 理43.3特征参数的提取63.4用矢量量化聚 法生成 本73.5 VQ 的 人 8三、仿真 9五、总结 9附录10114附录2一系统设计任务及要求1.用 MATLAB实现 50 个特定人的语音识别功能;2. 语音识别的正确率在百分之九十以上;二语音识别的简介说话人识别就是根据说话人的语音信号来判别说话人的身份。 语音是人的自然属性之一,由于说话人发音器官的生理差异以及后天形成的行为差异, 每个人的语音都带有强烈的个人色彩, 这就使得通过分析语音信号来识别说话人成为可能。用语音来鉴别说话人的身份有着许多独特的优点, 如语音是人的固有的特征,不会丢失或遗忘; 语音信号的采集方便, 系统设备成本低; 利用电话网络还可实现远程客户服务等。因此,近几年来,说话人识别越来越多的受到人们的重视。与其他生物识别技术如指纹识别、 手形识别等相比较,说话人识别不仅使用方便,而且属于非接触性,容易被用户接受,并且在已有的各种生物特征识别技术中,是唯一可以用作远程验证的识别技术。因此,说话人识别的应用前景非常广泛:今天,说话人识别技术已经关系到多学科的研究领域, 不同领域中的进步都对说话人识别的发展做出了贡献。说话人识别技术是集声学、语言学、计算机、信息处理和人工智能等诸多领域的一项综合技术,应用需求将十分广阔。说话人识别系统设计中的根本问题是如何从语音信号中提取表征人的基本特征。即语音特征矢量的提取是整个说话人识别系统的基础, 对说话人识别的错误拒绝率和错误接受率有着极其重要的影响。 同语音识别不同, 说话人识别利用的是语音信号中的说话人信息, 而不考虑语音中的字词意思, 它强调说话人的个性。因此,单一的语音特征矢量很难提高识别率, 所以语音信号的时候如何提取信号中关键的成分尤为重要。 语音信号的特征参数的好坏直接导致了辨别的准确性。系统在说话人的识别中采用基于 Mel 的频率倒谱系数的模板匹配的说话人识别方法。具体的实现过程当中,采用了 matlab 软件来帮助完成这个项目。在 matlab 中实现采集,分析,特征提取,配对,识别。三语音识别原理3.1 语音识别系统总体框架说话人识别系统的总体结构如图1 所示。首先通过语音的录制作为输入信号,输入的模拟语音信号要进行预处理,包括预滤波、采样和量化、加窗、端点检测、预加重等等。经过预处理后,接下来就是重要的一环:特征参数提取。具体要求是:( 1)提取的特征参数要能有效地代表语音特征,具有很好的区分性。( 2)各阶参数之间有良好的独立性。( 3)特征参数要计算方便,最好有高效的计算方法,以保证语音识别的实时实现。测度估计识别决策识别结果语 音识别特征提取参考 模块预处理输入训练模板库专家知识图 1说话人语音识别系统总体框图考虑到数据量、 实时性以及识别率的问题, 本文采用基于矢量量化的方法识别语音。对于特征参数的选取,我们使用 mfcc 的方法来提取。3.2 语音信号预处理3.2.1滤波在模 / 数转换之前,通常要进行滤波处理, 滤波的作用主要有两个 : 一是用高通滤波器抑制50Hz 电源噪声的干扰 ; 二是用低通滤波器滤除语音信号中频率分量超过采样频率一半的部分,防止采样信号的混叠。3.2.2模数转换将原始采集得来的语音模拟信号转换为计算机能够处理的数字信号,就需要对其进行数字化,此过程成为数 / 模转换,最常见的方式就是脉冲编码调制(PalseCode Modulation ),它的过程分为采样、量化和编码;采样是对模拟信号进行周期性的扫描,将实际上连续变化的信号转换为时间上离散的信号, 从而便于表示为计算机的语言。根据 Nyquist 采样定理, 当采样频率高于信号最高频率的一倍时, 原来的连续信号就可以从采样样本中完全重建出来。人耳可以分辨的声音频率范围为(20Hz,20KHz) ,因此,当采样的频率高于40KHz时,采样的过程就不会丢失信息,但考虑到设备的实际性能,且说话人语音频率主要集中在 3.4KHz,故本系统以 8KHz 为采样率。 量化就是把经过采样得到的瞬时值将其幅度离散, 即用一组规定的电平, 把瞬时抽样值用最接近的电平值来表示出来, 最终用整数倍的数字表示的过程。 经过时间上的采样后, 连续的模拟信号变成了离散信号, 再经过振幅的量化, 把量化好的采样值用二进制代码表示出来,就转换成了数字信号。编码 : 就是用一组二进制码组来表示每一个有固定电平的量化值。然而,实际上量化是在编码过程中同时完成的,故编码过程也就称为模/ 数转换,该系统以实验者 50 人的声音为分析样本,将语音信号都保存为符合 RIFF 规范的 wav 文件格式,便于在 windows 环境下处理。语音信号是利用 PC机录制,音频文件采用 8000kHz 采样频率、 16bit 量化、单声道的 PCM录 音,用 MATLAB 本身 wavread 函数来读取语音文件,直接将语音数据转化为数字信号。3.2.3 预加重、分帧及加窗预处理是指对语音信号的特殊处理: 预加重,分帧处理。预加重的目的是提升高频部分,使信号的频谱变得平坦,以便于进行频谱分析或声道参数分析。用具有 6dB/ 倍频程的提升高频特性的预加重数字滤波器实现。虽然语音信号是非平稳时变的, 但是可以认为是局部短时平稳。故语音信号分析常分段或分帧来处理。在语音参数计算之前, 一般要将其通过一个预加重滤波器,预加重目的是为了对语音的高频部分进行加重增加其高频分辨率,其函数为:x=filter(1 -0.9375,1,x);“帧”,将语音信号截断的过程称之为“分帧”。为了保持帧之间的平滑过渡,常相邻的两帧之间有少部分的重叠,这些重叠的部分叫做帧移。 在以后的语音信号识别过程中, 都是依赖于每一帧多对应的数据序列所描述的语音信号特征来处理。分帧操作主要是提取语音短时特性便于建模,一般取帧长 30ms,帧移 10ms;在对语音信号进行截断处理形成帧后,通常会产生泄露( Gibbs) 现象,为了防止此种现象的发生,我们通常运用一个长度有限的窗函数w(n) 对语音短段进行变换或运算。对于语音信号的每一帧来说, 窗函数的宽度会影响语音信号的平滑性。越宽的窗函数,对信号的平滑作用就会越显著,效果越好,窗函数过窄,则基本对信号不起作用。 语音信号经过加窗处理后, 两端的坡度会减小, 窗口边缘两端也不会引起急剧变化, 截取出的语音波形两端就会缓慢的过渡为零, 这就有效的减小语音帧的截断效应。因此对于语音信号时域分析来说, 窗函数的选择很重要, 虽说矩形窗平滑比较好,但是容易丢失波形细节, 并有可能造成泄漏现象。 而 Hamming窗可以有效的克服泄漏现象。所以在加窗方面常以 Hamming窗为主,即:3.3 特征参数的提取对于特征参数的选取,我们使用mfcc 的方法来提取。MFCC(Mel-sealed Cepstrum Coefficients),即 Mel 频率倒谱参数,也叫做Mel 尺度倒谱参数。 MFCC参数是基于人的听觉特性利用人听觉的屏蔽效应,在Mel 标度频率域提取出来的倒谱特征参数。这个参数的提取是将语音从时域变换至倒谱域, 通过构造人的听觉模型, 用滤波器组模仿人耳的滤波,语音通过滤波器组的输出为语音基本特征参数,然后做傅里叶变换在语音识别处理信号过程中,MFCC参数是按照帧计算的。其特征提取及计算过程如图 2 所示。x(n)预加重、 分端点Mel 频率logDCT帧、加窗检测DFT/FFT对数能量求倒谱滤波器组图 2 MFCC特征提取及计算流程MFCC参数的提取过程如下:1. 对输入的语音信号进行分帧、加窗,然后作离散傅立叶变换,获得频谱分布信息。设语音信号的 DFT为:N1j 2 nkX a (k)x(n)eN ,0 k N 1n 1(1)其中式中 x(n) 为输入的语音信号,N 表示傅立叶变换的点数。2. 再求频谱幅度的平方,得到能量谱。3. 将能量谱通过一组 Mel 尺度的三角形滤波器组。我们定义一个有M 个滤波器的滤波器组(滤波器的个数和临界带的个数相近),采用的滤波器为三角滤波器,中心频率为f(m),m=1,2,3,, M,本系统取 M=100。4. 计算每个滤波器组输出的对数能量。N 1S(m)ln(| X a (k) |2 H m (k),k 10 mM1(2)其中 H m (k)为三角滤波器的频率响应。5. 经过离散弦变换( DCT)得到 MFCC系数。M1C(n)S (m)cos( n(m 0.5/ m),(3)m 00n N1MFCC系数个数通常取20 30,常常不用 0 阶倒谱系数,因为它反映的是频谱能量,故在一般识别系统中,将称为能量系数,并不作为倒谱系数,本系统选取 20 阶倒谱系数。3.4 用矢量量化聚类法生成码本在识别 ( 匹配 ) 阶段,我们用 VQ方法计算平均失真测度 ( 本系统在计算距离 d 时,采用欧氏距离测度 ) ,从而判断说话人是谁。基于 VQ的说话人识别系统,矢量量化起着双重作用。在训练阶段,把每一个说话者所提取的特征参数进行分类,产生不同码字所组成的码本。 我们将每个待识的说话人看作是一个信源,用一个码本来表征。 码本是从该说话人的训练序列中提取的 MFCC特征矢量聚类而生成。只要训练的序列足够长,可认为这个码本有效地包含了说话人的个人特征,而与讲话的内容无关。本系统采用基于分裂的LBG的算法设计 VQ码本, X k (k1,2, K ) 为训练序列, B 为码本。具体实现过程如下:1. 取提取出来的所有帧的特征矢量的型心 ( 均值 ) 作为第一个码字矢量 B1。2. 将当前的码本 Bm根据以下规则分裂,形成 2m个码字。 BmBm (1)BmBm (1)(4)其中 m从 1 变化到当前的码本的码字数,是分裂时的参数,本文 =0.01 。3. 根据得到的码本把所有的训练序列 ( 特征矢量 ) 进行分类,然后按照下面两个公式计算训练矢量量化失真量的总和 D n 以及相对失真 (n 为迭代次数,初始n=0, D 1 =, B 为当前的码书 ) ,若相对失真小于某一阈值,迭代结束,当前的码书就是设计好的2m个码字的码书,转。否则,转下一步。量化失真量和:KD (n )min d ( X k , B)k1(5)相对失真:D ( n 1)D n|D n(6)4.重新计算各个区域的新型心,得到新的码书,转第3 步。5. 重复 , 和步,直到形成有 M个码字的码书 (M 是所要求的码字数 ) ,其中 D0=10000。3.5 VQ 的说话人识别语音识别系统结构框图如图3 所示。设是未知的说话人的特征矢量 X1, , XT ,共有 T 帧是训练阶段形成的码书, 表示码书第 m个码字,每一个码书有 M个码字。再计算测试者的平均量化失真 D,并设置一个阈值,若 D小于此阈值,则是原训练者,反之则认为不是原训练者。D 1/ T min d (xj ,Bm )j 1(7)1 m M图 3 语音识别系统结构框图四.仿真实现我们的系统分为两部分 : 第一部分是先把 50 个人的声音保存成 .wav 的格式 , 放在一个文件夹中 , 作为说话人的声音模板检测的数据库。第二部分是对检测者实行识别对已经保存的 50 个数字的语音提取 mfcc 特征者,进行辨别和实时的判断说话人是否为同一人。在 train.m 调用 Vqlbg.m 获取训练录音的 vq 码本,而 vqlbg.m 调用 mfcc.m获取单个录音的mel 倒谱系数,接着 mfcc.m 调用 melfb.m-将能量谱通过一组Mel 尺度的三角形滤波器组。在 test.m 函数文件中调用 disteu.m 计算训练录音(提供 vq 码本)与测试录音(提供 mfcc)mel 倒谱系数的距离,即判断两声音是否为同一录音者提供。Disteu.m 调用 mfcc.m 获取单个录音的mel 倒谱系数。 mfcc.m 调用 Melfb.m-将能量谱通过一组Mel 尺度的三角形滤波器组。五 总结在 matlab 环境下实现基于矢量量化的说话人识别系统。在实时录音的情况下,利用该说话人识别系统,对不同的人的1s7s 的语音进行辨识。实现与文本无关的自动说话人确认的实时识别。实验表明,该系统能较好地进行语音的识别,识别正确率达 90%以上。同时,基于矢量量化技术( VQ)的语音识别系统具有分类准确,存储数据少,实时响应速度快等综合性能好的特点附录 1原 始 语 音 s1 的 波 形0.50.40.30.20.1度幅0-0.1-0.2-0.3-0.400.511.522.5时 间 /s能 量 谱 (M = 100, N = 256)对 数 能 量 谱 (M = 100, N = 256)40004000450350035004003000300035025003002500zzHH/250/率 2000率 2000频频1500200150015010001000100500505000000.511.522.500.511.522.5时 间 /s时 间 /s40200-20-40-60-80-100-120-140-160Mel 滤 波21.81.61.41.210.80.60.40.2005001000150020002500300035004000频 率 /Hz能 量 对 数 谱 (第 = 43帧 , 帧 长 = 128,帧 数 = 471)能 量 对 数 谱 (第 = 85帧 , 帧 长 = 256,帧 数 = 237)40004000503000030000z-50zHH-50/率 2000率 2000频-100频-10010001000-150-15000012012时 间 /s时 间 /s能 量 对 数 谱 (第 = 171帧 , 帧 长 = 512,帧 数 = 117)40005030000zH/-50率 2000频1000-100-1500012时 间 /s2D plot of accoustic vectors6说 话 人 1说 话 人 242noisnemi0Dht6-2-4-6-4-3-2-1012345-55th Dimension2D plot of accoustic vectors6说 话 人 1码 本 14说 话 人 2 码 本 22noisnemi0Dht6-2-4-6-4-3-2-1012345-55th Dimension原 始 能 量 谱4000350030002500zH/率 2000频15001000500000.511.522.5时 间 /s45040035030025020015010050通 过 mel 倒 谱 修 正 后 的 能 量 谱20181614目 12数器 10波滤 8642000.511.522.5时 间 /s700600500400300200100附录 2functionM3 = blockFrames(s, fs, m, n)% blockFrames:%Puts the signal into frames分帧函数% Inputs:%s contains the signal to analize语音信号%fs is the sampling rate of the signal语音采样频率%m is the distance between the beginnings of two frames两帧之间的距离%n is the number of samples per frame每帧的采样点数% Output:%M3 is a matrix containing all the frames数组形式,包含了所有的帧l = length(s);%语音信号的长度nbFrame = floor(l - n) / m) + 1;%帧数fori = 1:nforj = 1:nbFrameM(i, j) = s(j - 1) * m) + i);%逐帧扫描endendh = hamming(n);M2 = diag(h) * M;%加汉明窗fori = 1:nbFrameM3(:, i) = fft(M2(:, i);%短时傅立叶变换Endfunctioncode = train(traindir, n)% 计算 wav 文件的 VQ 码码本% Speaker Recognition: Training Stage% Input:%traindir:stringname ofdirectorycontainsalltrainsoundfiles% n: number of train files in traindir% Output:%code: trained VQ codebooks, codei for i-th speaker% Note:% Sound files in traindir is supposed to be:%s1.wav, s2.wav, ., sn.wav% Example:% code = train(C:datatrain, 8);k = 16;% number of centroids requiredfori = 1:n% train a VQ codebook for each speakerfile = sprintf(%ss%d.wav, traindir, i);disp(file);s, fs = wavread(file);v = mfcc(s, fs);codei = vqlbg(v, k);end% Compute MFCCs% Train VQ codebookfunctiond = disteu(x, y)% DISTEUPairwiseEuclideandistancesbetweencolumnsoftwomatrices测试失真度% Input:% x, y: Two matrices whose each column is an a vector data.% Output:%d:Elementd(i,j)willbe theEuclideanvectors X(:,i) and Y(:,j)distancebetweentwocolumn% Note:% The Euclidean distance D between two vectors X and Y is:% D = sum(x-y).2).0.5M, N = size(x);M2, P = size(y);if(M = M2)error( 不匹配! )endd = zeros(N, P);if(N P)copies = zeros(1,P);forn = 1:Nd(n,:) = sum(x(:, n+copies) - y) .2, 1);endelsecopies = zeros(1,N);forp = 1:Pd(:,p) = sum(x - y(:, p+copies) .2, 1);endendd = d.0.5;functionm = melfb(p, n, fs)% MELFBDetermine matrix for a mel-spaced filterbank% Inputs:p number of filters in filterbank滤波器数%n length of fftFFT变换的点数%fs sample rate in Hz采样频率% Outputs:x a(sparse)matrixcontainingthe filterbankamplitudes%size(x) = p, 1+floor(n/2)% Usage:For example, to compute the mel-scale spectrum of a% colum-vector signal s, with length n and sample rate fs:% f = fft(s);% m = melfb(p, n, fs);% n2 = 1 + floor(n/2);% z = m * abs(f(1:n2).2;%zwouldcontainp samplesofthedesiredmel-scalespectrum% To plot filterbanks e.g.:%plot(linspace(0,(12500/2),129),melfb(20,256,12500),%title(Mel-spacedfilterbank),xlabel(Frequency(Hz);f0 = 700 / fs;fn2 = floor(n/2);lr = log(1 + 0.5/f0) / (p+1);% convert to fft bin numbers with 0 for DC term bl = n * (f0 * (exp(0 1 p p+1 * lr) - 1);b1 = floor(bl(1) + 1;b2 = ceil(bl(2);b3 = floor(bl(3);b4 = min(fn2, ceil(bl(4) - 1;pf = log(1 + (b1:b4)/n/f0) / lr;fp = floor(pf);pm = pf - fp;r = fp(b2:b4) 1+fp(1:b3);c = b2:b4 1:b3 + 1;v = 2 * 1-pm(b2:b4) pm(1:b3);m = sparse(r, c, v, p, 1+fn2);functionr = mfcc(s, fs)%s声音信号的向量fs取样频率% MFCC% Inputs: s contains the signal to analize% fs is the sampling rate of the signal% Output: r contains the transformed signal m = 100;n = 256;l = length(s);nbFrame = floor(l - n) / m) + 1;fori = 1:nforj = 1:nbFrameM(i, j) = s(j - 1) * m) + i);endendh = hamming(n);M2 = diag(h) * M;fori = 1:nbFrameframe(:,i) = fft(M2(:, i);endt = n / 2;tmax = l / fs;m = melfb(20, n, fs);n2 = 1 + floor(n / 2);z = m * abs(frame(1:n2, :).2;r = dct(log(z);functionr = vqlbg(d,k)% VQLBG Vector quantization using the Linde-Buzo-Gray algorithmeLBG 算法%使用% Inputs:% d contains training data vectors (one per column)% k is number of centroids required% Output:% r contains the result VQ codebook (k columns, one for each centroids)e = .01;r = mean(d, 2);dpr = 10000;fori = 1:log2(k)r = r*(1+e), r*(1-e);while(1 = 1)z = disteu(d, r);m,ind = min(z, , 2);t = 0;forj = 1:2ir(:, j) = mean(d(:, find(ind = j), 2);x = disteu(d(:, find(ind = j), r(:, j);forq = 1:length(x)t = t + x(q);endendif(dpr - t)/t) test(C:datatest, 8, code);fork = 1:nfile = sprintf(%ss%d.wav% 读出音频文件, testdir, k);s, fs = wavread(file);v = mfcc(s, fs);% 计算MFCCsdistmin = inf;k1 = 0;forl = 1:length(code)d = disteu(v, codel);% 计算每个训练码本的失真度dist = sum(min(d,2) / size(d,1);ifdist distmindistmin = dist;k1 = l;endendmsg = sprintf( Speaker %d matches with speaker %d , k, k1); disp(msg);end
展开阅读全文