《matlab大作业语音合成.docx》由会员分享,可在线阅读,更多相关《matlab大作业语音合成.docx(31页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、清华大学电子工程系matlab实弟抠假设语音合成综合实验班级:无99姓名:姜舒扬学号:2009011970实验日期:2011/7/29交报告日期:2011/7/29的以基音为周期的人工激励信号e(n)o对于200Hz的单位样值“串”,可知NS=200, N=8000/NS=20,而对于300Hzmatlab高级编程与工程应用课程作业之二的单位样值“串”,可知NS=300, N=round (8000/NS) =27。用sound试听两者 后发现300H在的信号会更加刺耳一些。其代码如下:200Hz的单位样值“串”clear all;close all;clc;T=8000;t=0:T-l;NS
2、l=200;Nl=round(T/NS1);el=(mod(t,N1)=0);sound(elz 8000);300Hz的单位样值“串”clear all;close all;clc;T=8000;t=0:T-l;NS2=300;N2=round(T/NS2);e2=(mod(t,N2)=0);sound(e2r 8000);(8)生成时变基音序列真实语音信号的基音周期总是随着时间变化的。我们 首先将信号分成假设干个10毫秒长的段,假设每个段内基音周期固定不变,但 段和段之间那么不同,具体为PT = 80 + 5mod(m; 50)其中PT表示基音周期,m表示段序号。生成1秒钟的上述信号并试听
3、。(提示:用 循环逐段实现,控制相邻两个脉冲的间隔为其中某个脉冲所在段的PT值。)我们知 道每个段的长度为80,但是其周期比80大,可知每个段内只有一个脉冲,甚至有些 段内由于周期太长出现没有脉冲的情况,在处理相邻两个脉冲的间隔时用前一个脉冲 的周期,这样从第1个脉冲开始不断的插入后面的脉冲,直 到不能插入脉冲为止。生成的波形如下:10.90.80.70.65 ,)05 V) 0.4 0.3 0.2 0.10.10.20.30.40.50.60.70.80.91time/smatlab高级编程与工程应用课程作业之二相应的代码如下:信号函数function y=signal () T=8000;
4、FL=80;y=zeros (T,1);y(1)=1; index=l;index=index+FL+5*mod(ceil(index/FL),50); while (index=T)y(index)=1;index=index+FL+5*mod(ceil(index/FL),50);end return 画出波形clear all;close all;clc;y=signal ();t=l:8000/8000;plot(t,y);xlabel(time/s1;ylabel(1 signal);sound(y,8000);(9)人工激励产生语音用filter将(8)中的激励信号e(n)输入到(
5、1)的系统中计算输出s(n),试听 和e(n)有何区别。输出的s (n)和e (n)波形如下:t/s1通过波形可以直到e (n)通过系统以后,有了一些音色,同时声音也更加圆滑,并且包络也不再是简单的冲击而是先直线上升而后指数下降。另外,听起来,e (n)是“依依”的声音,s (n)是“啊啊”的声音。其代码如下:matlab高级编程与工程应用课程作业之二clear all;close all;clc;al=1.3789;a2=-0.9506;a=1,-al,-a2;b=l;e=signal();s=filter(b,a,e);t=l:8000/8000;figure;subplot (2,1,1
6、);plot (t,s);xlabel ( !t/s !);ylabel(1s (n) 1);subplot(2,1,2);plot(tf e);xlabel ( 1t/s1);ylabel(* e (n) 1 );sound(s,8000);pause(3);sound(ez 8000);(10)重改 speechprocm 程序重改speechproc.m程序。利用每一帧已经计算得到的基音周期和(8)的方法, 生成合成激励信号Gx(n) (G是增益),用filter函数将Gx(n)送入合成滤波器得 到合成语音sn)。试听和原始语音有何差异。利用(8)的方法得到激励,然后合成激励信号Gx(n
7、),送入合成滤波器得 到合成语音,其代码如下:% (10)在此位置写程序,生成合成激励,并用激励和filter函数产生合成语音 if n=3index=(n-1)*FL+1;endwhile(index=n*FL)exc_syn(index)=G;index=index+PT;ends_syn ( (n-1) *FL+1: n*FL) , zi_syn =f ilter (1, A, exc_syn ( (n-1) *FL+1: n*FL) , z i_syn);通过试听,发现合成语音与原始语音相差不大,但是噪音有所增加,声音 不清晰。下面是合成语音与原始语音波形的比拟:matlab高级编程与
8、工程应用课程作业之二4可见两者波形基本相同,但是在一些细微的地方还是有所不同的。为了 更加清楚的比拟两者的区别,这里进行傅里叶变换得到频谱图如下:50040030020010050010001500相比而言,原始语音的低频分量比合成语音要丰富的多,同时高频的噪声 也比合成语音的大。而合成语音低频分量比拟单调是因为我们用以PT为周期 的单位样值周期信号作为激励,滤掉了一些低频分量。画波形和频谱图的代码如下:figure;subplot (2,1,1);plot (s) ; ylab1。原始语音 1); subplot (2,1,2);plot(s_syn); ylabel ( , 合 成语音D;
9、sound(s, 8000);pause (3);sound(s synz 8000);Trg=0,13730-1/8000;N=13730;matlab高级编程与工程应用课程作业之二OMGrg=0,3000*pi;K=1000;omg,FT=prefourier(Trg,N,OMGrg,K);Fourier_s=FT*s;Fourier_s_syn=FT*s_syn;figure;subplot(2,1,1);plot(omg/2/pi,abs(Fourier_s);ylabel原始语音频谱,);axis(0,1500,0,500);subplot (2,1,2);plot(omg/2/pi
10、,abs(Fourier_s_syn);ylabel ( 1合成语音频谱D ;axis(0, 1500,0z 500);预备傅里叶变换函数代码如下:function omg,FT = prefourier(Trg,N,OMGrg,K) T = Trg (2)-Trg (1);t = linspace (Trg (1) , Trg -T/N, N) 1 ;OMG = OMGrg(2)-OMGrg(1);omg = linspace(OMGrg(1),OMGrg(2)-OMG/K,K)1;FT = T/N*exp(-j *kron(omg,t.1);注明:预备傅里叶变换函数代码参考谷老师提供的程序
11、示范中的prefourier.m文 件,不过有所改进,这里去掉了用不到的时间抽样点和IFL对代码进行了精 简。三、变速不变调(11)变速不变调仿照(10)重改speechproc.m程序,只不过将(10)中合成激励的长度增加一 倍,即原来10毫秒的一帧变成了 20毫秒一帧,再用同样的方法合成出语音 来,如果你用原始采样速度进行播放,就会听到慢了一倍的语音,但是音调基 本没有变化。这里实现的过程与第10题基本相同,这是一帧长度由80变成了 160,其余 的实现过程完全相同,其实现代码如下:% (11)不改变基音周期和预测系数,将合成激励的长度增加一倍,再作为filter%的输入得到新的合成语音,
12、听一听是不是速度变慢了,但音调没有变。if n=3 indexv=(n- 1)*2*FL+1;endwhile(indexv0)p(m)=p(m)*exp(j *150*2*pi/8000); elsep(m)=p(m)*exp(-j *150*2*pi/8000); endendBt,At=zp2tf(z,p,k);Atl=-At(2), At2=-At (3), figure; zplane (b,a); figure;matlab高级编程与工程应用课程作业之二、语音预测模型(1)参数分析给定e(n) = s(n) - ais(n-1) -a2s(n- 2)假设e(n)是输入信号,s(n)
13、是输出信号,上述滤波器的传递函数是什么?如果 ai = 1.3789 , a2 = -0.9506 ,上述合成模型的共振峰频率是多少?用zplane , freqz , impz分别绘出零极点图,频率响应和单位样值响应。用filter绘出单位 样我响应,比拟和impz的是否相同。为了求得传递函数,我们需要使用tf ()函数,其中b=l, a=l,-al,-a2, 其中1.3789, a2 = -0.9506,可得传递函数如下:Transfer function: 11- 1.379 zA-l +0.9506 zA-2Sampling time: unspecified因而可得函数传递函数的一般
14、表达式为:H=q11 -az1 -az 212其代码如下:al=1.3789;a2=-0.9506;a=1,-al,-a2;b= 1 ; sys=tf (b, a, 一1 Variable, 1zA-1!)由于题中给出的为二阶差分方程,因此有一对共飘极点,可知一对共加极点freq =999.9447因此共加峰频率为999.9447HZo下面分别列出零极点图、频率响应和单位样值响应。(1)零极点图:00tpd dcou_ 6eal_8 o.2 05 r 66 6zplane(Bt,At);matlab高级编程与工程应用课程作业之二得到结果如下:Atl =1.2073At2 =-0.9506BP
15、ai=1.2073, a2=-0.9506比照零极点分布如下:频率未改变前:06、 yrrtrr-1-0.500.51Real Part频率提iWj后:1-0.500.51Real Part10.8图中显示出了极点的变化。(13)变调不变速仿照(10)重改speechproc.m程序,但要将基音周期减小一半,将所有的共振 峰频率都增加150Hz ,重新合成语音,听听是何感受。其基本实现思路与合成语音基本相同,只是在两个地方有所不同:1、 系统参数b, a不同,这里的b和a是要用经改变后的极点计算出来的; 2、生成激励信号时,用floor (PT/2)作为这里的PT。其实现代码如下: % (13
16、)将基音周期减小一半,将共振峰频率增加150Hz,重新合成语音 z,p,k=tf2zp(l,A);matlab高级编程与工程应用课程作业之二for m=l:length(p)if(imag(p(m)0)p(m)=p(m)*exp(j *150*2*pi/8000);elsep(m)=p(m)*exp(-j*150*2*pi/8000);endendBt,At=zp2tf(z,p,k);if n=3indext=(n-1)*FL+1;endwhile(indext=n*FL)exc_syn_t(indext)=G;indext=indext+floor (PT/2);end s_syn_t (
17、(n-1) *FL+1: n*FL) , zi_syn_t =f ilter (Btz At, exc_syn_t ( (n- 1)*FL+1 :n*FL),zi_syn_t);试听后,发现音调明显高了好多,但是速度并没有改变,下面是两者的波 形的比照:x 104-W 20004000600080001000012000 14000仔细观察波形,我们会发现变调不变速语音的波形会更加稠密一些,为了 更加直观地看出其差异,我们用傅里叶变换得到其频谱如下:matlab高级编程与工程应用课程作业之二可以发现变调不变速语音的高频分量要比原始语音丰富的多,同时通过耳朵我 们也能感受到其语速没有明显的变化,
18、这证实了变调不变速。其画波形和频谱 代码如下:figure;subplot (2,1,1);plot (s) ; ylabe1厂原始语音1); subplot (2,1,2);plot(s_syn_t); ylabel(1变调不变速语音D;sound(s, 8000);pause (3);sound(s_syn_tz 8000);Trg=0,13730-1/8000;N=13730;OMGrg=0z 3000*pi;K=1000;omg,FT=prefourier(Trg,N,OMGrg,K);Fourier_s=FT*s;Fourier_s_syn_t=FT*s_syn_t;figure;s
19、ubplot(2,1,1);plot(omg/2/pi,abs(Fourier_s);ylabel ( 1原始语音频谱,);axis ( 0, 1500,0,500); subplot (2,1,2);plot(omg/2/pi,abs(Fourier_s_syn_t);ylabel变调不变速语音频谱,);axis(0,1500,0,500);创新补充:变调又变速这里我好奇就结合前面的变调不变速和变速不变调技 术,可以得到变速又变matlab高级编程与工程应用课程作业之二调技术,这里我讲(11)和(13)进行结合,得到变调有变速的代码如下:%变速又变调if n=3 indexvt=(n-1)*
20、2*FL+1;endwhile(indexvt0)p(m)=p(m)*exp(j *10*2*pi/8000); elsep(m)=p(m)*exp(-j*10*2*pi/8000);endendBt,At=zp2tf(z,p,k);if n=3indext=(n-1)*FL+1;endwhile(indext=n*FL)exc_syn_t(indext)=G;indext=indext +floor (PT/1.1);ends_syn_t ( (n-1) *FL+1: n*FL) , zi_syn_t =f ilter (Bt, At, exc_syn_t ( (n- 1)*FL+1 :n*
21、FL), zi_syn_t);ends=s*400000;s_s yn_t=s_s yn_t *400000; % 画出录 入语音和语音变调不变速后的语音figure;subplot (2,1,1);plot (s) ; ylabel (1 录入语音1); subplot (2,1,2);plot(s_syn_t); ylabel (1变调不变速语音D;sound(s, 8000);pause (3);sound(s_syn_tz 8000);matlab高级编程与工程应用课程作业之二writespeech(1myTomspeech.pcm *,s_syn_t);(15) GUI上题介绍了该款
22、娱乐产品的基本功能,即录音、变调处理、回放,给用户 以“趣味学舌”的体验。请利用上题的分析结果,参考该产品功能设计并编制一 套具有自主知识产权的娱乐产品。(提示:help audiorecorder进行录音:可自 动检测话音有无,也可以让用户在说话之前和之后分别按键触发软件的录音和 变调回放。)我根据(14)题的功能进行了 GUI设计,得到界面如下:录入语音波形0.50.50开始录音结束录音变调回放010.20.30 20.30受调语箸波形。60 70 80.91结束 回放关闭|_C3_ 区 J其中上面为波形显示区域,分别为录音波形和变调波形,下面分别实现响 应的功能,有开始录音、结束录音、显
23、示波形、存入变调录音到文件中以及原 始录音和变调录音的回放等相关功能。右下角为关闭窗口按钮。具体实现时要先翻开exl5.m,然后点击run按钮即得到GUI界面,即可实现 相关的功能。这就是我自主设计的娱乐产品。具体代码见exl5.m,由于代码过长,这里不再列出。六、总结通过这次实验,我对人地发声系统有了一个基本的认识,通过语音的重建, 我了解了人的声调高低和音色差异的来源。同时通过变速不变调和变调不变速, 我对语音信号数字处理技术也有了更加进一步的认识。最后通过逆向工程,我对 可视化软件的制作有了初步的了解。总之,我对语音的认识有了一个全新的认 识,也为后面的实验做了良好的铺垫。matlab高
24、级编程与工程应用课程作业之二 附: speechprocm 文件 function speechproc()%定义常数FL = 80;%帧长WL = 240;%窗长P = 10;%预测系数个数s = readspeech ( T voice .pcm, 100000) ;% 载入语音 sL = length (s) ;%读入语音长度FN = floor (L/FL) -2 ;% 计算帧数%预测和重建滤波器exc = zeros (L, 1) ;%激励信号(预测误差)zi_pre = zeros (Pz 1) ;%预测滤波器的状态s_rec = zeros (L, 1) ;% 重建语音zi_re
25、c = zeros (PA1);%合成滤波器exc_syn = zeros (L, 1) ;%合成的激励信号(脉冲串)s_syn = zeros (L, 1) ;% 合成语音zi_syn=zeros (P,1);%变调不变速滤波器exc_syn_t = zeros (L, 1) ;%合成的激励信号(脉冲串)s_syn_t = zeros (Lz 1) ;% 合成语音zi_syn_t=zeros (P,1);%变速不变调滤波器(假设速度减慢一倍)exc_syn_v = zeros (2*L, 1) ;%合成的激励信号(脉冲串)s_syn_v = zeros (2*L, 1) ;% 合成语音zi_
26、syn_v=zeros (P,1);%变速又变调滤波器(假设速度减慢一倍)exc_syn_vt = zeros (2*LZ 1) ;%合成的激励信号(脉冲串)s_syn_vt = zeros (2*L, 1) ;% 合成语音zi syn vt=zeros (Pf1);hw = hamming(WL);hw = hamming(WL);%汉明窗%依次处理每帧语音for n = 3:FN%计算预测系数(不需要掌握)s_w = s (n*FL-WL+l:n*FL) .*hw;%汉明窗加权后的语音A E = Ipc (s_wr P) ;%用线性预测法计算P个预测系数% A是预测系数,E会被用来计算合成
27、激励的能量if n = 27% (3)在此位置写程序,观察预测系统的零极点图Real Partmatlab高级编程与工程应用课程作业之二zplane(1,A); ends f = s ( (n-1)*FL+1:n*FL);s f = s ( (n-1)*FL+1:n*FL);%本帧语音,下面就要对它做处理% (4)在此位置写程序,用filter函数s_f计算激励,注意保持滤波器状态 exc f,zi pre=filter(A,l,s f,zi pre); exc ( (n- 1) *FL+l:n*FL) =exc_f;用将你计算得到的激励写在这里% (5)在此位置写程序,用filter函数和e
28、xc重建语音,注意保持滤波器状态 rec f,zi rec=filter(lfA,exc f,zi rec); s rec ( (n- l)*FL+l:n*FL)=rec_f; %将你计算看到的董建语音写在这里%注意下面只有在得到exc后才会计算正确 s_Pitch = exc(n*FL-222:n*FL);PT = findpitch (s_Pitch) ;%计算基音周期PT (不要求掌握)G = sqrt(E*PT);G = sqrt(E*PT);%计算合成激励的能量G (不要求掌握)% (10)在此位置写程序,生成合成激励,并用激励和filter函数产生合成语 音 if n=3index
29、=(n-1)*FL+1;endwhile(index=n*FL)exc_syn(index)=G; index=index+PT;ends_syn ( (n-1) *FL+1: n*FL) , zi_syn =f ilter (1, A, exc_syn ( (n-1) *FL+1: n*FL) , z i_syn);% (11)不改变基音周期和预测系数,将合成激励的长度增加一倍,再作为filter %的输入得到新的合成语音,听一听是不是速度变慢了,但音调没有变。if n=3 indexv=(n-1)*2*FL+1;endwhile(indexv0)p(m)=p(m)*exp(j *150*2
30、*pi/8000); elsep(m)=p(m)*exp(-j*150*2*pi/8000); end endBt,At=zp2tf(z,p,k);if n=3indext=(n-1)*FL+1;endwhile(indext=n*FL)exc_syn_t(indext)=G;indext=indext+floor (PT/2); ends_syn_t ( (n-1) *FL+1: n*FL) , zi_syn_t =f ilter (Btz At, exc_syn_t ( (n-1)*FL+1 :n*FL), zi_syn_t);告变速又变调if n=3indexvt=(n-1)*2*FL+
31、1;endwhile(indexvt=n*2 *FL)exc_syn_vt(indexvt)=G;indexvt=indexvt +floor (PT/2);ends_syn_vt ( (n-1) *2*FL+1: n*2*FL) , zi_syn_vt =f ilter (Bt, At, exc_syn_vt ( (n- 1)*2*FL+1:n*2*FL),zi_syn_vt);end% (6)在此位置写程序,听一听s , exc和s_rec有何区别,解释这种区 别 sound (exc, 8000);pause(2);sound(s, 8000);pause (2);sound(s_rec
32、z 8000);pause (2);figure;subplot(3,1,1);plot(100:400,exc (100:400);subplot(3Zlz 2);plot( 100:400,s (100:400);subplot(3,1,3);plot(100:400,s_rec(100:400); figure;matlab高级编程与工程应用课程作业之二subplot (3,1,1);plot(6000:6300,exc(6000:6300);subplot(3,1,2);plot(6000:6300zs(6000: 6300);subplot(3,lz 3);plot(6000:630
33、0, s_rec(6000:6300);figure;subplot(3,lz1);plot(12000:12300zexc (12000:12300);subplot(3,1,2);plot ( 12000:12300zs (12000:12300);subplot(3,1,3);plot(12000:12300z s_rec(12000:12300); figure;subplot(3,1r 1);plot (exc);subplot(3,1,2);plot (s);subplot(3,1, 3);plot(s_rec);%后面听语音的题目也都可以在这里写,不再做特别注明 figure;s
34、ubplot (2,1,1);plot (s) ; ylab原始语音1); subplot (2,1,2);plot (s_syn) ; ylabel (合成语音D;sound(s, 8000);pause (3);sound(s_syn,8000);Trg=0z13730-1/8000;N=13730;OMGrg=0z 3000*pi;K=1000;omg,FT=prefourier(Trg,N,OMGrg,K);Fourier_s=FT*s;Fourier_s_syn=FT*s_syn;figure;subplot(2,1,1);plot(omg/2/pi,abs(Fourier_s);y
35、label。原始语音频谱,);axis (0,1500,0,500);subplot (2,1,2);plot(omg/2/pi,abs(Fourier_s_syn);ylabel ( 1合成语音频谱,);axis(0,1500,0,500);figure;subplot (2,1,1);plot (s) ; ylabel ( 1 原始语音 D; subplot (2,1,2);plot(s_syn_v);ylabel变速不变调语音,);matlab高级编程与工程应用课程作业之二sound(s, 8000);pause (3);sound(s_syn_vz 8000);Trgl=0,13730-1/8000;Nl=13730;OMGrg=Oz 3000*pi;K=1000;omgz FT1=prefourier(Trgl,N1,OMGrg, K); Fourier_s=FTl*s; Trg2=0,13730*2- l/8000;N2=13730*2;omg,FT2=prefourier(Trg2,N2,OMGrg,K);Fourier_s_syn_v=FT2*s_syn_v;figure;subplot(2Z1,1);plot(omg/2/p
限制150内