《matlab大作业语音合成.docx》由会员分享,可在线阅读,更多相关《matlab大作业语音合成.docx(34页珍藏版)》请在第一文库网上搜索。
1、清华大学电子工程系mt1b安弟抠语音合成综合实验班级:无99姓名:姜舒扬学号:2009011970实验日期:2011/7/29交报告日期:2011/7/29一、语音预测模型(1)参数分析给定e(n)=s(n)-as(n-1)-a2s(n-2)假设e(n)是输入信号,s(n)是输出信号,上述滤波器的传递函数是什么?如果a=1.3789,a2=-0.9506,上述合成模型的共振峰频率是多少?用zp1ane,freqz,impz分别绘出零极点图,频率响应和单位样值响应。用fi1ter绘出单位样值响应,比较和impz的是否相同。为了求得传递函数,我们需要使用tfO函数,其中b=1,a=1z-a1z-a
2、2,其中a=1.3789,32=-0.9506,可得传递函数如下:Transferfunction:11-1.379z-1+0.9506z-2Samp1ingtime:unspecified因而可得函数传递函数的一般表达式为:H(Z)=J1-az1其代码如下:a1=1.3789;a2=-0.9506;a=1,-a1,-a2;b=1;sys=tf(bzaz-1zVariab1e,z-1,)由于题中给出的为二阶差分方程,因此有一对共挽极点,可知一对共规极点Wf月在时域冲激响应中的贡献为AP,中s(,?+9),并且有C=2,可得freq=999.9447因此共挽峰频率为999.9447HZo下面分别
3、列出零极点图、频率响应和单位样值响应。(1)零极点图:Rea1Part(2)频率响应(3)单位样值响应Impu1seResponse其中单位样值响应中,上面一个图为impz得到的响应,下面为fi1ter得到的响应。可见两者是完全相同的。因而单位样值响应就是单位样值信号经过数字滤波器得到的响应。其代码如下:c1eara11;c1osea11;c1c;a1=1.3789a2=-0.950;a=1,-a1,-a2);b=1;r,p,k=residuez(b,a);omega=abs(ang1e(p(1);T=18000;freq=omegaT2pifigure(1);zp1ane(bza);figu
4、re(2);freqz(b,a);n=O:50,;e=(n=0);figure(3);subp1ot(2,1,1);impz(b,a,50);subp1ot(2z1,2);y=fi1ter(bza,e);stem(n,y);(2)理解speechproc.m基本流程阅读SPeeChPrOC.m程序,理解基本流程。程序中已经完成了语音分帧、加窗、线性预测和基音周期提取等功能。注意:不要求掌握线性预测和基音周期提取的算法原理。通过程序和注释我们可以知道整个程序的流程为:定义常数;滤波器常数初始化;依次处理每帧语音(包括计算预测系数、得到激励信号、重建语音、基音周期、合成激励的能量、合成语音、变速不
5、变调语音和变调不变速语音);保存所有文件;相关函数的实现。(3)观察零极点图运行该程序到27帧时停住,用(1)中的方法观察零极点图利用ZPIaneO函数可以得到,代码如下:ifn=27%(3)在此位置写程序,观察预测系统的零极点图zp1ane(1,A);end(4)计算激励信号在循环中添加程序:对每帧语音信号s(n)和预测模型系数佃,用E1ter计算激励信号e(n)。注意:在系数变化的情况下连续滤波,需维持滤波器的状态不变,要利用fi1ter的Zi和Zf参数。这里要利用zi_pre,利用Z1Pre作为初始状态得到最终状态,本次循环得到的最终状态最为术次循环的初始状态,并且把每次循环得到的激励保
6、存下来。代码如下:s_f=s(n-1)*F1+1:n*F1);%本帧语音,下面就要对它做处理%(4)在此位置写程序,用fi1ter函数s_f计算激励,注意保持滤波器状态exc_f,zi_pre=f1iter(A,1,s_fzzi_pre);exc(n-1)*F1+1:n*F1)=exc_f;%将你计算得到的激励写在这里(5)重建语音完善SPeeChProc.m程序,在循环中添加程序:用你计算得到的激励信号e(n)和预测模型系数ai,用fi1ter计算重建语音Sqn)。同样要注意维持滤波器的状态不变。与第四题的解法相同,这里由激励得到语音,并且要利用ziec,利用ziec作为初始状态得到最终状态
7、,本次循环得到的最终状态最为下灰循环的初始决态,并且把每次循环得到的重建语音保存下来。代码如下:%(5)在此位置写程序,用fi1ter函数和exc重建语音,注意保持滤波器状态rec_f,zi_rec=fi1ter(1,A,exc_fzzi_rec);s_rec(n-1)*F1+1:n*F1)=rec_f;带将你计算存到的屈建语音写在这里(6)对比信号在循环结束后添加程序:用SOUnd试听(6)中的e(n)信号,比较和s(n)以及s?n)信号有何区别。对比画出三个信号,选择一小段,看看有何区别。用soundO试听三个信号,发现重建语音与原语音比较相近,不过少了些“吱吱”的噪声,但是exc噪声相差
8、非常大,与前两者相差非常大。下面是三个信号的波形对比:一、三个信号的前段二、三个信号的中段三、三个信号的后段X104四、整个信号O5O600080IoooO1200014000-2O2000由波形可以知道,exc激励信号的波形与原语音和重建语音相差非常大,但是其大致起伏与后两者基本相同,但是非常不规则,这就是我们听到有噪声的原因。在前段波形中,激励和原始信号开始一段皆为0,但是生成信号并不为O.这是由于循环从第3帧开始的。在中段波形中,不论从振幅还是波形变化初始都是原始语音与重建语音想象,激励要与前两者相差很多。在后端波形中,三者比较接近,只是激励的振幅要小一点。从整体波形来看,三者的波形的总
9、体变化趋势相同,但是激励信号的细微变化趋势与另外两者还是不相同的。其代码如下:%(6)在此位置写程序,听一听s,exc和s_rec有何区别,解释这种区别Isound(excz8000);pause(2);sound(s,8000);pause(2);sound(s_rec,8000);pause(2);figure;subp1ot(3,1,1);p1ot(100:400,exc(100:400);subp1ot(3z1z2);p1ot(100:400,s(100:400);subp1ot(3,1,3);p1ot(100:400),s_rec(100:400);figure;subp1ot(3z
10、1z1);p1ot(6000:6300,exc(6000:6300);subp1ot(3,1,2);p1ot(6000:6300,s(6000:6300);subp1ot(3,1,3);p1ot(6000:6300,s_rec(6000:6300);figure;subp1ot(3z1,1);p1ot(12000:12300,exc(12000:12300);subp1ot(3,1z2);p1ot(12000:12300zs(12000:12300);subp1ot(3z1z3);p1ot(12000:12300zs_rec(12000:12300);figure;subp1ot(3,1,1)
11、;p1ot(exc);subp1ot(3,1z2);p1ot(s);subp1ot(3,1,3);p1ot(s_rec);二、语音合成模型(7)生成基音序列生成一个8kHz抽样的持续1秒钟的数字信号,该信号是一个频率为200Hz的单位样值“串”,即NS-Ix(n)=次TN)i=0考虑该信号的N和NS分别为何值?用sound试听这个声音信号。再生成一个300Hz的单位样值“串”并试听,有何区别?事实上,这个信号将是后面要用到的以基音为周期的人工激励信号e(n)o对于200HZ的单位样值“串”,可知NS=200,N=8000NS=20,而对于300HZ的单位样值“串”,可知NS=300,N=rou
12、nd(8000/NS)=27。用SoUnd试听两者后发现300H在的信号会更加刺耳一些。其代码如下:200Hz的单位样值“串”c1eara11/c1osea11;c1c;T=8000;t=0:T-1;NS1=200;N1=round(TNS1);e1=(mod(t,N1)=0);sound(e1,8000);300Hz的单位样值“串”c1eara11;c1osea11;c1c;T=8000;t=0:T-1;NS2=300;N2=round(TNS2);e2=(mod(t,N2)=0);sound(e2z8000);(8)生成时变基音序列真实语音信号的基音周期总是随着时间变化的。我们首先将信号分
13、成若干个10毫秒长的段,假设每个段内基音周期固定不变,但段和段之间则不同,具体为PT=80+5mod(m;50)其中PT表示基音周期,m表示段序号。生成1秒钟的上述信号并试听。(提示:用循环逐段实现,控制相邻两个脉冲的间隔为其中某个脉冲所在段的PT值。)我们知道每个段的长度为80,但是其周期比80大,可知每个段内只有一个脉冲,甚至有些段内由于周期太长出现没有脉冲的情况,在处理相邻两个脉冲的间隔时用前一个脉冲的周期,这样从第1个脉冲开始不断的插入后面的脉冲,直到不能插入脉冲为止。生成的波形如下:10.90.80.70.6Io50.40.30.20.10.10.20.30.40.50.60.70.
14、80.91time/s相应的代码如下:信号函数functiony=signa1()T=8000;F1=80;y=zeros(T,1);y(D=1;index=1;index=index+F1+5*mod(cei1(index/F1),50);whi1e(index=T)y(index)=1;index=index+F1+5*mod(cei1(index/F1),50);endreturn画出波形c1eara11;c1osea11;c1c;y=signa1();t=1:8000/8000;p1ot(t,y);x1abe1(,time/s,);y1abe1(,signa1,);sound(y,8000);(9)人工激励产生语音用fi1ter将(8)中的激励信号e(n)输入到(1)的系统中计算输出s(n),试听和e(n)有何区别。输出的S(n)和e(n)波形如下:通过波形可以直到e(n)通过系统以后,有了一些音色,同时声音也更加圆滑,并且包络也不再是简单的冲击而是先直线上升而后指数下降。另外,听起来,e(n)是“依依”的声音,s(n)是“啊啊”的声音。其代码如下:c1eara11;c1osea11;c1c;a1=1.3789;a2=-0.9506;a=1/-a1-a2;b=1;e=signa1(