《2022年LPC语音合成实验报告 .pdf》由会员分享,可在线阅读,更多相关《2022年LPC语音合成实验报告 .pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、语音合成实验报告李飞 王江为 袁晓杰 陈新依王永胜一、应用 Matlab 实现语音合成的背景语音合成技术的研究已有两百多年的历史,但真正具有实用意义的近代语音合成技术是随着计算机技术和数字信号处理技术的发展而发展起来的,主要是让计算机能够产生高清晰度、 高自然度的连续语音。 在语音合成技术的发展过程中,早期的研究主要是采用参数合成方法,后来随着计算机技术的发展又出现了波形拼接的合成方法。参数合成的特点:调节灵活,但音质较差。21 世纪的通信应在人与人之间、人与机器之间提供高质量的无缝的信息交换手段。无论何时、何地,以任何方式通信,语音通信将是最基本、最重要的方式之一。声音信号的处理和通信领域联
2、系密切,掌握音频信号的压缩编码、 频谱分析和合成的原理与方法,对通信领域工作的开展具有重要意义。Matlab 是由MathWorks 公司于 1984 年推出的一套科学计算软件。Matlab 具有强大的计算功能和诸多的工具箱,并且提供了COM 接口,能方便地与VC 等程序开发平台对接。使用 Matlab 来实现语音合成能够减少工作量,我们无需关心某些函数的实现,只需知道函数的作用和使用什么函数就够了,这就使Matlab 成为科学研究和分析利器。二、使用 Matlab 实现语音合成的目的1. 熟悉 Matlab 的使用2. 了解语音合成的原理和过程3. 重点学习参数合成法的实现三、语音合成的原理
3、1. 语音生成模型通过对声管的研究,发现它可以用若干段级连的不等截面积均匀管道进行描述,一般称作级连无损声管模型。 采用流体力学的方法可以证明每一截均匀管名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 10 页 - - - - - - - - - 道的频响能够用一个但极点模型来近似,这样 N段管道组成的声管就可以用一个N阶全极点滤波器表述,即:111()1(1)NNkkkkkGGVza zp z(9.1)对于典型的男声, N=10 ,所有的极点ip要分别构成共轭对以保证i
4、a系数都是实数。 在综合考虑清音信号, 就可以得到产生语音信号的离散语音模型,如图所示:对上述模型进行充分简化。首先去掉随机信号激励部分,认为激励信号是一个脉冲序列, 不考虑有无周期。 其次去掉声门脉冲模型和口唇的辐射模型,因而得到如图所示最简单的语音模型:假设激励信号用 e(n) 表示,语音信号用s(n) 表示,根据全极点模型表达式,有:1()()()Nkks na s nkG e n(9.2)从而可以用声管模型对激励信号进行滤波得到语音信号。脉冲序列发生器声道模型 V(z) 图 2:简化的语音生成语音信号周期脉冲发生器声门脉冲模型 G(z) 声道模型V(z)辐射模型R(z) 随机噪声发生器
5、清音增益语音信号图 1:产生语音信号的离散时域模名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 10 页 - - - - - - - - - 2. 语音预测模型假设已经知道了系数 ai,那么将图 2 的输入和输出对换,就构成了语音的预测模型,即语音信号s(n)送入预测滤波器,得到预测残差e(n) 1()()()Nkke ns nas nk(9.3)假设信号的发端和收端都知道预测系数ai,那么发端只需要把误差e(n)传到收端即可, 因为收端可以用e(n)作为上述差分方程的激
6、励得到重建语音。在发端,语音 s(n)是滤波器的输入,而误差e(n)是输出。事实上,系数 ai当然也需要从发端传到收端,但因为语音具有短时平稳性,即在短时间内(比如10ms) ,系数ai可以认为不发生变化,所以也不必太频繁地传输,因而采用预测技术后,总是可以大幅度地降低语音的带宽。 这种通过现行预测方法压缩语音数据量的技术称为线性预测编码。3. 语音重建模型如果知道激励信号x(n)和滤波器系数 ai,就可以利用激励生成重建语音了和语音生成模型的公式完全相同1()()()Nkksnxnasnk(9.4)但这个模型被称为语音重建模型,为了同生成模型区分开,s称为重建语音,如果 x(n)正好等于e(
7、n),那么重建语音就会和原始语音s(n)完全相同。语音的非平稳性(虽然短时平稳)导致预测系数ai是时变的,一般每1020ms就会发生一些变化以产生不同的音节。在这种情况下, 滤波过程也要分段进行,即每次用不同的滤波器系数, 但相邻两次滤波必须要保持滤波器的状态不发生变化。4. 谐振和共振峰频率语音生成模型的 每一对共轭极点都对应一个衰减的正弦信号的特征响应。例如一对共轭极点jipe在时域冲激响应中的贡献是co s()niA Pn。其中极点幅度决定衰减速度,幅角决定振荡频率。对语音合成,用数字的正弦信号表示抽样后的连续正弦信号。在这种情况名师资料总结 - - -精品资料欢迎下载 - - - -
8、- - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 10 页 - - - - - - - - - 下,模拟频率和数字频率的关系是=wT,其中 T表示抽样间隔, w表示模拟频率(弧度) ,对应的? =w/2 称为共振频率,它定义了声道的谐振频率。当模型参数变化时,共振峰频率也随着变化,从而产生不同的声调。四、分析与合成语音分析和合成系统如图3 所示。首先要分析一段 (一般是 10ms)语音得到它的最佳 ai系数。给定这些系数后,就可以适当的输入来合成语音。对于浊音信号, 一种可取的激励模型就是以特定频率重复的单位样值序列,这个频率就是
9、基音频率。 对清音,最好选择随机噪声或者白噪声作为输入。 但在不做清浊判决的情况下, 全部采用周期激励的合成质量也可以接受。分析过程如下:首先,抽样的语音信号被分成10ms长的段;然后,对每段数据进行统计分析, 计算相邻样点的相关性并最终得到最佳预测系数。合成过程就是利用这些预测系数, 以及周期的单位样值序列作为输入,依次得到每段合成语音。1、 变速不变调所谓变速不变调,是指声音播放时,速度的改变不会导致音调的变化。为了实现变速不变调,首先需要将表示“调”的内容从语音中分离出来,由前述语音预测模型,表示 “调” 的有两个部分,一是 共振峰频率 ,即预测模型的参数;二是基音周期 ,即激励信号的参
10、数。 接下来的工作就是在不改变这两种参数的前提下改变数据长度。即将10ms的 80 个样点的激励变成20ms160个样点(注意保持单位样值的周期不变) , 在这 20ms内保持预测模型系数不变, 就合成了 20ms需 要 做 的处理声 道 模型 V(z) 线 性 预 测系统需 要 做 的处理重 建 的 趣味语音原始语音滤波器系数 ai e(n) x(n) 图 3 分析和合成语音的系统框图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 10 页 - - - - - - -
11、- - 语音了。新语音的声调和原有语音是完全相同的,只不过时间变长了而已。2、 变调不变速如前所述,可以考虑将激励信号的频率增加(注意不改变信号长度),同时将共振峰频率 也相应增大一些 (即极点的幅角 绝对值增大, 或者说上半平面的极点逆时针旋转, 下半平面的极点顺时针旋转, 但注意两者都要旋转相同角度而且不要转过负实轴),这样得到的合成语音频率将变高。五、语音合成的实现1. 基础部分给定12( )( )(1)(2)e ns na s na s n,假设e(n)是输入信号, s(n)是输出部分,求滤波器的传递函数如果a1=1.3789,a2=-0.9506,求共振峰频率,并用zplane,fr
12、eqz,impz 分别绘出零,极点分布图,频率响应和单位样值相应,用filter 绘出单位样值响应,比较和impz 的是否相同。程序如下:clc clear all close all fs=8000; P=1,-1.3789,0.9506; Z=1; z,p,k=tf2zp(Z,P) %求零点,极点和增益f=abs(angle(p)*fs/(2*pi) %求共振峰频率f=w/(2*pi) figure; subplot(221); zplane(Z,P) %画零极点图title( 零极点图 ); B=Z;A=P; H,W=freqz(B,A); % 求频率响应subplot(222); pl
13、ot(W/pi ,abs(H); xlabel(频率 omega(xpi rad/sample) title( 幅度谱图 ); subplot(223); plot(W/pi,angle(H); xlabel(频率 omega(xpi rad/sample) title( 相位谱图 ); h=impz(B,A); %计算系统单位序列响应figure(2); subplot(211); stem(h); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 10 页 - - -
14、- - - - - - title(impz 函数求系统冲激图); k=0:400; n=0; x=(k-n)=0; Y=filter(Z,P,x); %x 为单位序列,求系统的冲击响应subplot(212) stem(Y); title(filter函数求系统冲激图); 运行结果 f=999.9447 用 impz 和 filter 求出的单位样值相应是一样的,因为这里的输入是单位序列,所以 impz求出的单位冲击相应与用filter 求出的是一样。2 将共振峰频率增加150HZ后,求 a1和 a2. f=round(f)+150;f=f(1); %共振峰频率增加150 p1=f*2*pi
15、/ 8000; %求模拟频率omega p2=abs(p); p0=p2*exp(j*p1);p0=p0(1); p00=p2*exp(-j*p1);p00=p00(1); p3=p0;p00; %已知模值和相角求极点Z,P=zp2tf(z,p3,k) %计算系数通过运行函数求出a1=1.2072,a2=-0.9506 3. 语音合成的实现3.1常量定义与分配内存空间clc clear all close all (1)定义常数:% dd 和 cc 是用于变调和变速的参数,可以进行修改。dd=0; %这个用于变调,值大则高cc=1; %这个用于变速,值大则慢FL = 80; % 帧长WL =
16、240; % 窗长,即汉明窗的长度名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 10 页 - - - - - - - - - P = 30; % 预测系数个数,增加预测系数可以提高音质s=wavread(voice.wav); %读取语音L = length(s); % 读入语音长度FN = floor(L/FL)-2; % 计算帧数fs=8000; %抽样频率FL_v=cc*FL; %改变帧长度可以变速,用于变速不变调(2)分配内存空间% 预测和重建滤波器(初始化空间
17、 ) exc = zeros(L,1); % 激励信号(预测误差)excc = zeros(L,1); % 人工合成的冲击信号,即激励信号s_rec = zeros(L,1); % 重建语音hw = hamming(WL); % 汉明窗fze=zeros(1,30); %用于保持滤波器状态不变fzs=zeros(1,30); %用于保持滤波器状态不变A=zeros(FN,(P+1); %预测系数,也是声道模型的分母部分E=zeros(FN); pp=0; %生成激励的初始相位=0 3.2 语音预测部分这部分对原始语音进行预测处理的目的是取得预测系数A, 基音周期 PT和能量 E。% 依次处理每
18、帧语音for n = 3:FN %从第三帧到最后一帧% 计算预测系数(不需要掌握)s_w = s(n*FL-WL+1:n*FL).*hw; %汉明窗加权后的语音,用来预测A(n,:),E(n-1)*FN) = lpc(s_w, P); %用线性预测法计算P个预测系数% A 是预测系数,E会被用来计算合成激励的能量。s_f = s(n-1)*FL+1:n*FL); % 本帧语音,下面就要对它做处理exc(n-1)*FL+1:n*FL),fze = filter(A(n,:),1,s_f,fze); %通过逆向声道滤波器计算激励s_Pitch = exc(n*FL-222:n*FL); %为什么要
19、 -222 这一点有待研究PT(n) = findpitch(s_Pitch); % 计算基音周期PT (不要求掌握)end 3.3 语音合成部分变速不变调,只改变帧长:由FL变成 FL_v 。变调,通过共振峰频率的改变使预测系数 A 发生变化,也就是声道模型产生了变化。 这正好符合我们所熟知的不同声道会发出不同的声音。% 对参数进行合成for n = 3:FN f=PT(n)/(dd/50+1); %基音周期nn=1/fs:1/fs:FL_v/fs % 帧长度 ,fs 控制着点的密度% excc(n-1)*FL_v+1:n*FL_v)=square(2*pi*f*nn,1); 名师资料总结
20、- - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 10 页 - - - - - - - - - 被注释掉的这一步用于产生激励信号。但是存在方波产生的相位问题,每帧产生的相位是从 0 开始, 但是实际的长度往往不是基音周期的整数倍,这也就产生了冲击信号相位不连续的问题。为了解决这个问题,本文对产生的冲击信号进行了改进,自编chongji()函数解决了相位问题。其具体的原理下文将会继续介绍。excc(n-1)*FL_v+1:n*FL_v),pp=chongji(2*pi*f*nn,pp);
21、%自编函数解决相位问题excc(n-1)*FL_v+1:n*FL_v)=excc(n-1)*FL_v+1:n*FL_v); %转置, 以满足向量运算的形式G(n) = sqrt(E(n-1)*FN)*PT(n); % 计算合成激励的能量G(不要求掌握)下面是变调, 先用 A 作为多项式的参数求出当前声道V的极点,得出数字频率 omiga, 共振峰频率 f=omiga/ 2pi/8000.对 f 增加或者减少某值之后再反过来求相应的多项式的参数A。这样生成了新的声道模型实现了变调。poles = roots(A(n,:); %通过 A 求极点dformant = dd*2*pi/ 8000; %
22、共振峰频率的变化for nn=1:30 if imag(poles(nn)0 poles(nn) = poles(nn)*exp(j*dformant); elseif imag(poles(nn)0 poles(nn) = poles(nn)*exp(-j*dformant); end end % 增大共振峰频率:增大极点的幅角绝对值,即上半平面的极点逆时针转,下半平面的极点顺时针转。A(n,:)=poly(poles); %由根值反求多项式,即由极点反求A 值s_rec(n-1)*FL_v+1:n*FL_v),fzs =filter(1,A(n,:),G(n)*excc(n-1)*FL_v
23、+1:n*FL_v),fzs); %通过声道滤波器重现语音end 3.4 播放并存储合成的语音s_rec=s_rec/max(abs(s_rec); %将生成的语音归一化到-11 sound(s_rec); wavwrite(s_rec,hecheng.wav); 3.5 自编的 chongji 函数这个函数是为了解决冲击函数相位不连续的问题,对于冲击信号的产生信号进行改进。将初始相位赋给函数,使输出冲击函数的相位延迟以实现相位的匹配。本函数可以返回一个相位用于下一次的相位匹配。function s,pp = chongji( t,p ) % s,pp = fangbo( t,p ) %输入
24、t,起始相位p %输出 s,结束相位pp if nargin = 0.85*Rop Rop = R2; Top = T2; end if R3 0.85*Rop Rop = R3; Top = T3; end PT = Top; return 六、实验总结通过本实验, 我们可以了解语音合成的两种基本方法中的参数合成法。参数合成法顾名思义就是采用数字信号处理的方法,将人类发声过程看作是一个模拟声门状态的源, 去激励一个表征声道谐振特性的时变数字滤波器,这个源可能是周期脉冲序列, 它代表浊音情况下的声带振动,或者是随机噪声序列, 代表不出声的清音。调整滤波器的参数等效于改变口腔及声道形状,达到控制
25、发不同音的目的,而调整激励源脉冲序列的周期或强度,将改变合成语音的音调、重音等。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 10 页 - - - - - - - - - 由于准确提取共振峰参数比较困难, 虽然利用共振峰合成器可以得到许多逼真的合成语音,但是整体合成语音的音质难以达到实用要求。除了知识的扩展,我们学到更多的是团队合作, 大家分工共同处理一个实验,这样使每个人都可以发挥自己的特点,为了共同的目的发挥各自的光和热。在团队中相互学习 , 整体合作 , 取长补短,正因为这个团体,我们才把自己变的更好。七 实验分工组长:王江为组员:李飞袁晓杰陈新依 王永胜分工:李飞编写大部分程序,王江为和袁晓杰编了前面的程序。并且在李飞的讲解下我们五人理解了程序。实验报告中陈新依写了原理部分,王永胜写了开头和结尾, 王江为整理了整篇报告, 并写了 ppt。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 10 页 - - - - - - - - -