当前位置:文档之家› MATLAB变声器

MATLAB变声器

MATLAB变声器MATLAB变声器电子工程学院摘要语音信号处理中的变声处理已经有了比较成熟的算法,本文阐述了变声算法的基础原理,利用数字滤波器,自相关法,LPC,LPC系数求根法等方法在MATLAB上改变语音信号的基频和共振峰以实现变声,并总结了现有变声算法的缺陷,对用不同的变换域能否改进变声算法做了粗略分析。

关键词:变声算法,LPC,变换域目录研究背景 (5)变声原理 (5)语音基本概念 (5)变声原理 (6)变声过程 (7)分帧处理 (7)计算LPC系数 (8)计算原始激励 (8)计算基音周期 (8)计算激励能量 (9)合成脉冲序列 (9)更改声道参数 (9)合成变声语音 (10)程序设计 (10)传统变声算法缺陷 (12)合成激励与原始激励差别较大 (12)不能实现定向变声 (13)实现定向变声的猜想 (14)小波域是否存在恒定音色参数粗略分析 (14)统计上的变换是否利于寻找恒定音色参数猜想 (14)下一步研究计划 (15)研究背景语音信号是人们日常生活中十分常见的信号,语音也是人与人之间传递信息的一种十分重要的方式。

随着智能终端以及互联网的普及,语音信号大量地以数字形式出现,语音信号处理变得越来越重要,变声处理是语音信号处理的基础之一,所以在这样的大背景下,研究变声算法并改进变声算法是很有意义而且有必要的。

另一方面,传统的变声算法是对发声过程的简单模拟进行语音合成,在模拟过程中改变参数以实现变声,而传统的变声算法存在一些缺陷,若要改进变声算法使其更灵活有效,那么细致的研究传统的变声算法是很有必要的。

变声原理语音基本概念1. 声道:声道是很多动物及人类都有的一个腔室,从声源产生的声音经由此处滤出。

人的声道包括声道则包括喉腔、咽头、口腔和鼻腔。

2. 基音:一般的声音都是由发音体发出的一系列频率、振幅各不相同的振动复合而成的。

这些振动中有一个频率最低的振动,由它发出的音就是基音,其余为泛音。

发音体整体振动产生的音,叫做基音,决定音高;发音体部分振动产生的音,叫做泛音,决定音色;基音和泛音结合一起而形成的音,叫做复合音,日常我们所听到的声音多为复合音。

3.共振峰:共振峰是指在声音的频谱中能量相对集中的一些区域,共振峰是语音音质的决定因素,反映了声道(共振腔)的物理特征。

声音在经过共振腔时,受到腔体的滤波作用,使得频域中不同频率的能量重新分配,一部分因为共振腔的共振作用得到强化,另一部分则受到衰减,得到强化的那些频率在时频分析的语图上表现为浓重的黑色条纹。

由于能量分布不均匀,强的部分犹如山峰一般,故而称之为共振峰。

在语音声学中,共振峰决定着元音的音质,在计算机音乐中,共振峰是决定音色和音质的重要参数。

4,短时平稳特性:语音信号是一种随时间而变化的信号,主要分为浊音和清音两大类。

浊音的基音周期、清浊音信号幅度和声道参数等都随时间而缓缓变化。

由于发生器官的惯性运动,可以认为在一小段时间里(一般为10~30ms)语音信号的频域特性近似不变,即语音信号具有短时平稳性。

因而处理语音信号之前要把语音信号分为一些短段(称为分析帧),然后再来进行处理。

人声和乐器声的产生需要两个阶段,一个是发声系统,如人的声带或乐器的振动簧片,另一个是共鸣系统。

乐器不同的共鸣系统使其在一定频域中的语音信号的振幅得以突出,这样,这些区域就产生了这个乐器所特有的共振峰值,这些共振峰值同共鸣体的大小、形状的材料密切相关。

由于乐器的结构是稳定的,因此在乐器发出的所有音调中,不论基频如何,都会表现出相同的共振峰值,只不过其显著性有强有弱罢了。

这就可以解释为什么同一乐器所发出的不同音调具有相同的音质。

在语音声学中,人声也同样受自身生理如鼻孔、咽腔、口腔大小的影响有自身的共振峰区。

人在说话的过程中,正是通过利用这些共鸣空间的形状和大小不同的变化(例如改变嘴形),以能改变声音的共振峰说出不同的元音。

我们之所以能够区分不同的人声、元音,主要也是依靠它们的共振峰分布的位置。

简单来讲不同的人说同一句话的共振峰不同,同一个人说不通的话共振峰也不同。

变声原理变声是通过改变人声的基音频率和共振分分布以达到变声的目的,其具体过程是是模拟人声的发声过程,以脉冲信号代替声带振动,以FIR滤波器代替声道,用脉冲信号通过FIR滤波器进行语音合成。

首先对原始语音信号进行分解,然后得出原始激励参数(基音周期和激励能量)和声道参数(共振峰分布),用得出的参数构建激励和滤波器,再根据变声需要更改参数,就可以达到变声的目的。

过程如下变声过程分帧处理语音信号具有短时平稳特性,所以在处理之前要进行分帧处理,将一段长的语音信号分解为10~30ms的语音信号逐段进行处理。

语音信号的分帧是采用可移动的有限长度窗口进行加权的方法来实现的。

一般每秒帧数约为33~100帧,视实际情况而定。

分帧一般要采用交叠分段的方法。

如图所示,这是为了使帧与帧之间平滑过渡,保持其连续性。

前一帧和后一帧的交叠部分称为帧移,帧移与帧长的比值一般取为0~0.5。

在程序中对语音信号加Hamming窗处理,方法是用窗序列沿着语音样点值序列逐帧从左向右移动。

●计算LPC系数线性预测编码(LPC)是主要用于音频信号处理与语音处理中根据线性预测模型的信息用压缩形式表示数字语音信号谱包络(en:spectral envelope)的工具。

它是最有效的语音分析技术之一,也是低位速下编码方法高质量语音最有用的方法之一,它能够提供非常精确的语音参数预测。

LPC就是根据之前的P个信号构建滤波器,对之后的信号进行预测。

MATLAB中就有LPC函数,其形式为:[A,E]=lpc(s_w,P);其中A是LPC预测系数,用来构建滤波器,E是预测误差,在后面会用来计算激励能量,s_w是语音信号,P是预测阶数。

●计算原始激励用得到的LPC系数构建滤波器,对语音信号进行逆滤波就可以得到语音信号的激励,另外应该注意在系数变化的情况下连续滤波,需要维持滤波器的状态不变,要利用filter函数的和参数。

程序如下[exc1,zi_pre] = filter(A,1,s_f,zi_pre);exc1就是原始激励,用于计算基音周期。

●计算基音周期程序中用自相关法计算基音周期。

如果s(n)是一个周期为P的信号,则其自相关函数也是周期为P的信号,且在信号周期的整数倍处,自相关函数取最大值。

语音的浊音信号具有准周期性,其自相关函数在基音周期的整数倍处取最大值。

计算两相邻最大峰值间的距离,就可以估计出基因周期。

其实现代码如下function PT=findpitch(s)[B,A]=butter(5,700/4000);s=filter(B,A,s);R=zeros(143,1);for k=1:143R(k)=s(144:223)'*s(144-k:223-k);end[R1,T1]=max(R(80:143));T1=T1+79;R1=R1/(norm(s(144-T1:223-T1))+1);[R2,T2]=max(R(40:79));T2=T2+39;R2=R2/(norm(s(144-T2:223-T2))+1);[R3,T3]=max(R(20:39));T3=T3+19;R3=R3/(norm(s(144-T3:223-T3))+1);Top=T1;Rop=R1;if R2>=0.85*RopRop=R2;Top=T2;endif R3>0.85*RopRop=R3;Top=T3;endPT=Top;return●计算激励能量激励能量G用于构建脉冲序列时当作脉冲序列的振幅,激励能量和线性预测误差E和基音周期PT有关,其公式为G = sqrt(E*PT);●合成脉冲序列合成的脉冲序列可根据变声的需要更改原始的基音周期PT,如PT1 =floor(PT/2);而后以PT1为周期,G为振幅构建脉冲序列,作为合成语音的激励●更改声道参数利用LPC求根法以更改共振峰分布。

具体过程为,对由线性预测系数A构成的多项式求根,而共振峰频率F和频谱宽带B 和这些根有对应关系。

设i i i i e r z θ⋅=为一个根,则其共轭值i i i i e r z θ-⋅=也是一个根,i 对应的共振峰频率F 和3dB 带宽B 存在以下关系:i θπ=i TF 2 i TB r e i =-π所以T i πθ2F i = T ri πln B i -=其中T 是采样周期。

在程序中,我们只更改共振峰频率,程序如下poles = roots(A);deltaOMG =100*2*pi/fs;for p=1:10if imag(poles(p))>0poles(p) = poles(p)*exp(peak*1j*deltaOMG); %peak 是变声系数 elseif imag(poles(p))<0poles(p) = poles(p)*exp(-peak*1j*deltaOMG);endendA1=poly(poles);A1是更改过声道参数的线性预测系数,用以构建滤波器合成变声语音。

合成变声语音用脉冲序列作为激励,A1作为滤波器参数,合成变声语音,[s_syn1_t,zi_syn_t] = filter(1,A1,exc_syn1_t,zi_syn_t);程序设计利用MATLAB 的GUI 进行程序设计,结果如下:从图中可看出,经过变声器处理以后,语音信号的频域发生了很明显的变化,共振峰发生明显的移动。

从听觉角度来说,变声效果也比较明显。

传统变声算法缺陷传统的变声算法形成时间较早,是对发声系统粗略的模仿实现语音合成,虽然能实现明显的变声效果,但还存在一些缺陷,这里只针对研究开发过程中发现的不足来说。

合成激励与原始激励差别较大合成激励是以原始激励的基音周期为周期的脉冲序列,忽视了原始激励中的泛音频率,而语音信号中泛音频率也是决定声音音色的重要因素,所以对泛音的忽视直接影响了变声效果。

完成变声器的编程之后,我尝试用基音周期不变的合成激励与原始的声道参数进行语音合成,对比合成语音和原始语音,结果如下可以很明显地看出合成激励和原始激励在频谱上有较大区别,而从听觉上而言,虽然能听出二者音色相似,但用合成激励合成的语音中有较多杂音。

从这个简单的实验可以看出,激励中的泛音对语音信号也有着相当重要的作用,当激励中去除泛音时,对语音信号的频谱分布和听觉上有着较大影响。

所以变声算法中,只考虑基音来构建合成激励是有很大缺陷的。

不能实现定向变声所谓定向变声,是指把一个人的声音定向地变成另一个人的声音。

每个人都有自己独特的音色,也就意味着每个人的声音信号有独特且恒定的参数存在,一开始我猜想是这个参数便是共振峰分布,后来发现,虽然不同的人说相同的话的语音共振峰确实有明显的区别,但是同一个人说不同的话共振峰的区别也非常大,下图分别是同一个人读“为中华崛起而读书”和“现在开始录音”的时域和频域图:可见共振峰分布并不相同,其实每个元音的共振峰分布本来就不一样,这就意味着,共振峰分布不仅决定了音色,也决定了语音内容。

相关主题