Matlab基于VQ的语者识别系统(含所有代码)_第1页
Matlab基于VQ的语者识别系统(含所有代码)_第2页
Matlab基于VQ的语者识别系统(含所有代码)_第3页
Matlab基于VQ的语者识别系统(含所有代码)_第4页
Matlab基于VQ的语者识别系统(含所有代码)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 summary abstract: 语者识别即为判断说话的人是不是他的使用者。本组用基于vq的语者识别系统系统模型,通过提取mel 倒谱系数,制作模板码本与测试者相应参数进行对比,根据阈值判断,差别最小的则认为匹配原训练模板,即测试者与训练者为同一人,否则认为不是同一人。通过此过程实现语者识别功能。在功能上分为两大部分,语者判定以及实施辨别。contents 1.introduction .3 1.1 语者识别的概念 .3 1.2 特征参数的提取 .4 1.3 用矢量量化聚类法生成码本.4 1.4vq 的说话人识别.5 2.the program.6 2.1 函数关系 .6 2.2 代码说

2、明 .6 2.2.1 函数 mfcc.6 2.2.2 函数 disteu.6 2.2.3 函数 vqlbg.7 2.2.4 函数 test8 2.2.5 函数 testdb.8 2.2.6 函数 train .9 2.2.7 函数 melfb.9 3.results & discussion .10 4.further work .12 2 1.introduction 关于语者识别:在生物辨识技术中,语者辨识是利用人类最自然的口语表达作为辨识身分的依据。 语者辨识一般分为语者识别及语者确认,前者是要辨识说话者是谁,后者则是判断说话的人是不是他所宣称的使用者,本项目的研究主题是后者。语

3、者确认常被视为一个假说测定问题,利用似然比例测试方法来解:空假说表示说话者为真正的使用者,替代假说表示其为冒充者。我们可以收集特定使用者的语音数据来训练空假说模型,但替代假说牵涉未知的冒充者,较难模型化。针对此点,传统的作法是收集很多人的语音,训练一个通用背景模型,或是几位与目标使用者声音相似的人的语音,训练数个背景模型,再利用取极大值、取极小值、算数平均或几何平均等方法来结合个别的模型分数。基于 vq 的语者识别系统系统模型基于 vq的说话人识别系统,矢量量化起着双重作用。在训练阶段,把每一个说话者所提取的特征参数进行分类,产生不同码字所组成的码本。在识别( 匹配 ) 阶段,我们用vq方法计

4、算平均失真测度 ( 本系统在计算距离d 时,采用欧氏距离测度) ,从而判断说话人是谁。语音识别系统结构框图如图1 所示。图 1 语音识别系统结构框图1.1 语者识别的概念语者识别就是根据说话人的语音信号来判别说话人的身份。语音是人的自然属性之一,由于说话人发音器官的生理差异以及后天形成的行为差异,每个人的语音都带有强烈的个人色彩,这就使得通过分析语音信号来识别说话人成为可能。用语音来鉴别说话人的身份有着许多独特的优点,如语音是人的固有的特征,不会丢失或遗忘;语音信号的采集方便,系统设备成本低;利用电话网络还可实现远程客户服务等。因此,近几年来,说话人识别越来越多的受到人们的重视。与其他生物识别

5、技术如指纹识别、手形识别等相比较,说话人识别不仅使用方便,而且属于非接触性, 容易被用户接受,并且在已有的各种生物特征识别技术中,是唯一可以用作远程验证的识别技术。因此,说话人识别的应用前景非常广泛:今天,说话人识别技术已经关系到多学科的研究领域, 不同领域中的进步都对说话人识别的发展做出了贡献。说话人识别技术是集声学、语言学、计算机、信息处理和人工智能等诸多领域的一项综合技术,应用需求将十分广阔。在吃力语3 音信号的时候如何提取信号中关键的成分尤为重要。语音信号的特征参数的好坏直接导致了辨别的准确性。1.2 特征参数的提取对于特征参数的选取,我们使用mfcc 的方法来提取。mfcc 参数是基

6、于人的听觉特性利用人听觉的屏蔽效应,在mel 标度频率域提取出来的倒谱特征参数。mfcc 参数的提取过程如下:1. 对输入的语音信号进行分帧、加窗,然后作离散傅立叶变换,获得频谱分布信息。设语音信号的dft为:10 ,)()(112nkenxkxnnnnkja(1)其中式中x(n) 为输入的语音信号,n 表示傅立叶变换的点数。2. 再求频谱幅度的平方,得到能量谱。3. 将能量谱通过一组mel尺度的三角形滤波器组。我们定义一个有m个滤波器的滤波器组(滤波器的个数和临界带的个数相近),采用的滤波器为三角滤波器,中心频率为f(m),m=1,2,3, ,m本系统取m=100。4. 计算每个滤波器组输出

7、的对数能量。n 12amk 1s(m)ln(|(k) | h(k),0mm1x(2)其中mh (k)为三角滤波器的频率响应。5. 经过离散弦变换(dct )得到 mfcc 系数。10c(n)()cos(0.5/),(3)01mmsmn mmnn mfcc系数个数通常取20 30,常常不用0 阶倒谱系数, 因为它反映的是频谱能量,故在一般识别系统中,将称为能量系数,并不作为倒谱系数,本系统选取20 阶倒谱系数。1.3 用矢量量化聚类法生成码本我们将每个待识的说话人看作是一个信源,用一个码本来表征。码本是从该说话人的训练序列中提取的mfcc特征矢量聚类而生成。只要训练的序列足够长,可认为这个码本有

8、效地包含了说话人的个人特征,而与讲话的内容无关。本系统采用基于分裂的lbg的算法设计vq码本,(1,2,)kxkk为训练序列,b 为码本。4 具体实现过程如下:1. 取提取出来的所有帧的特征矢量的型心( 均值 )作为第一个码字矢量b1。2. 将当前的码本bm 根据以下规则分裂,形成2m个码字。)1()1(mmmmbbbb(4)其中 m从 1 变化到当前的码本的码字数,是分裂时的参数,本文=0.01 。3. 根据得到的码本把所有的训练序列( 特征矢量 )进行分类,然后按照下面两个公式计算训练矢量量化失真量的总和 nd以及相对失真(n 为迭代次数,初始n=0,1d=, b为当前的码书) ,若相对失

9、真小于某一阈值,迭代结束,当前的码书就是设计好的2m 个码字的码书,转。否则,转下一步。量化失真量和:( )1min(,)knkkdd xb( 5)相对失真:(1)|nnnddd(6) 4. 重新计算各个区域的新型心,得到新的码书,转3。5. 重复, 和步,直到形成有m个码字的码书(m是所要求的码字数) , 其中 d0=10000。1.4 vq 的说话人识别设是未知的说话人的特征矢量1,txx,共有t 帧是训练阶段形成的码书,表示码书第 m个码字,每一个码书有m个码字。再计算测试者的平均量化失真d,并设置一个阈值,若d小于此阈值,则是原训练者,反之则认为不是原训练者。11min/1),(jmm

10、mjtdbxd(7)2.the program 在具体的实现过程当中,采用了matlab软件来帮助完成这个项目。在matlab中主要由采集,分析,特征提取,比对几个重要部分。以下为在实际的操作中,具体用到得函数关系和作用一一列举在下面。5 2.1 函数关系主要有两类函数文件train.m和 test.m 在 train.m调用 vqlbg.m 获取训练录音的vq 码本,而 vqlbg.m 调用 mfcc.m 获取单个录音的mel 倒谱系数,接着mfcc.m 调用 melfb.m-将能量谱通过一组mel 尺度的三角形滤波器组。在 test.m 函数文件中调用disteu.m计算训练录音 (提供

11、vq 码本)与测试录音 (提供 mfcc)mel 倒谱系数的距离,即判断两声音是否为同一录音者提供。disteu.m调用 mfcc.m 获取单个录音的 mel 倒谱系数。 mfcc.m 调用 melfb.m-将能量谱通过一组mel 尺度的三角形滤波器组。2.2 具体代码说明2.2.1函数 mffc: function r = mfcc(s, fs) - 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)

12、* m) + i); %对矩阵 m赋值end end h = hamming(n); %加 hamming 窗,以增加音框左端和右端的连续性m2 = diag(h) * m; for i = 1:nbframe frame(:,i) = fft(m2(:, i); %对信号进行快速傅里叶变换fft end t = n / 2; tmax = l / fs; m = melfb(20, n, fs); %将上述线性频谱通过mel 频率滤波器组得到mel 频谱 , 下面在将其转化成对数频谱n2 = 1 + floor(n / 2); z = m * abs(frame(1:n2, :).2; r

13、= dct(log(z); %将上述对数频谱,经过离散余弦变换(dct) 变换到倒谱域,即可得到mel 倒谱系数 (mfcc参数 ) 2.2.2函数 disteu -计算测试者和模板码本的距离function d = disteu(x, y) m, n = size(x); %音频 x 赋值给【 m ,n】m2, p = size(y); %音频 y 赋值给【 m2,p】if (m = m2) error(不匹配! ) %两个音频时间长度不相等end 6 d = zeros(n, p); if (n p)%在两个音频时间长度相等的前提下 copies = zeros(1,p); for n =

14、 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; 2.2.3函数 vqlbg -该函数利用矢量量化提取了音频的vq 码本function r = vqlbg(d,k) e = .01; r = mean(d, 2); dpr = 10000; for i = 1:log2(k) r = r*(1+e), r*(1-e

15、); while (1 = 1) z = disteu(d, r); m,ind = min(z, , 2); t = 0; for j = 1:2i r(:, j) = mean(d(:, find(ind = j), 2); 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 2.2.4函数 test - function finalmsg = test(testdir, n,

16、 code) for k = 1:n % read test sound file of each speaker 7 file = sprintf(%ss%d.wav, testdir, k); s, fs = wavread(file); v = mfcc(s, fs); % 得到测试人语音的mel 倒谱系数distmin = 4; %阈值设置处 % 就判断一次,因为模板里面只有一个文件 d = disteu(v, code1); %计算得到模板和要判断的声音之间的“距离” dist = sum(min(d,2) / size(d,1); %变换得到一个距离的量 %测试阈值数量级 msgc

17、 = sprintf(与模板语音信号的差值为:%10f , dist); disp(msgc); %此人匹配 if dist distmin msg = sprintf(第%d位说话者与模板语音信号不匹配, 不符合要求 !n, k); finalmsg = 此位说话者不符合要求!; %界面显示语句,可随意设定 disp(msg); end end 2.2.5 函数 testdb 这个函数实际上是对数据库一个查询, 根据测试者的声音, 找相应的文件 , 并且给出是谁的提示function testmsg = testdb(testdir, n, code)namelist=童星程 ,张亦波 ,郭

18、嘉 ,刘满 ,严岔娟 ,赵超 ,孝大宇 ,郝力男 ; %这个是我们组的成员和导师的名单. 以便在识别时给出人民for k = 1:n % 数据库中每一个说话人的特征 file = sprintf(%ss%d.wav, testdir, k); % 找出文件的路径 s, fs = wavread(file); v = mfcc(s, fs); % 对找到的文件取mfcc 变换 distmin = inf; k1 = 0; for l = 1:length(code) 8 d = disteu(v, codel); dist = sum(min(d,2) / size(d,1); if dist

19、distmin distmin = dist;%这里和 test函数里面一样但多了一个具体语者的识别 k1 = l; end end msg=namelistk1 msgbox(msg);end2.2.6 函数 train -该函数就是对音频进行训练,也就是提取特征参数function code = train(traindir, n) k = 16; % number of centroids required for i = 1:n % 对数据库中的代码形成码本 file = sprintf(%ss%d.wav, traindir, i); disp(file); s, fs = wavr

20、ead(file); v = mfcc(s, fs); % 计算 mfccs 提取特征特征,返回值是mel 倒谱系数,是一个 log 的 dct 得到的 codei = vqlbg(v, k); % 训练 vq码本通过矢量量化,得到原说话人的vq码本end 2.2.7 函数 melfb -确定矩阵的滤波器function m = melfb(p, n, fs) 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

21、* (f0 * (exp(0 1 p p+1 * lr) - 1); 直接转换为fft 的数字模型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; 9 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,

22、1+fn2);3.results & discussion 3.1 实验过程我们的功能分为两部分: 对已经保存的语音进行辨别和实时的判断说话人是否为同一个人.在前者的实验过程中, 先把我们小组成员和tutor的声音保存成wav 的格式 , 放在一个文件夹中,作为一个检测的数据库. 然后对检测者实行识别, 系统给出提示是谁. 这一部我们测得的准确率是87.5%. 在第二个功能中, 实时的录取一段说话人的声音作为模板, 提取mfcc 特征参数 , 随后紧接着进行遇着识别, 也就是让其他人再说相同的话, 看是否是原说话者. 本系统唯一的不足之处是没有实现对数据库的跟新, 相信在以后不久的将来

23、会实现的. 实验过程及具体功能如下:先打开 matlab 使 current directory为录音及程序所所在的文件夹再打开文件“ enter .m”,点run 运行,打开enter界面,点击“打开”按钮进入系统。(注:文件包未封装完毕,目前只能通过此方式打开运行。) (如下图figure1)在对数据库中已有的语者进行识别模块: 点击按钮“录音-train” ,在 4 秒内录音训练。4 秒后,可以点击按钮“播放-train” ,播放刚刚录入的声音。录音被自动保存在程序文件夹子文件夹“测试”中,命名为“s1.wav ” 。随后点击”语音库录制模板”, 这一步就是对语音库里的声音提取特征值. 然后再点击”语者判定” , 这一步是把”测试”文件夹中刚录制的声音提取特征值值与数据库中声音的特征值进行对比, 告知谁是语者. 在实时语者识别模块: 10 点击实时录制模板上的“录音-train”按钮 , 是把新语者的声音以wav 格式存放在”实时模板”文件夹中, 接着点击实时录制模板,把新的模板提取特征值。随后点击实时语者识别模板上的“录音 -train”按钮 , 是把语者的声音以wav格式存放在”测试”文件夹中, 再点击 “实时语

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论