数字变声器的设计Word下载.docx
《数字变声器的设计Word下载.docx》由会员分享,可在线阅读,更多相关《数字变声器的设计Word下载.docx(23页珍藏版)》请在冰点文库上搜索。
4.4回调函数 14
4.4.1切换按钮 14
4.4.2按钮 15
参考文献 19
设计总结 20
前言
我们每个人的声音不同,源于我们的每个人的音色和音调不同,我们所说的男中音、男高音,就是音调的不同,而即便音调一致,我们依然能区分出两个不同人的声音,或不同乐器的声音,这就是音色的不同。
变声器,正是借助对声音音色和音调的双重复合改变,实现输出声音的改变。
目前,语音伪装系统(变声器)被广泛应用于社会的各个领域。
语音伪装设备经常出现在以下几个方面:
为了防止打击报复,保护举报人的人身安全的匿名举报系统;
记者采访时对采访对象声音的处理,保护被采访人的安全;
应用于电台或电视台,可对热线电话进行声音的处理。
独居女士和小孩;
可用变声器应付骚扰电话和陌生人来访。
另外,在智能手机或者平板电脑等便携式移动终端中利用变声器开发的小游戏等。
因此,变声器的应用范围及其广泛。
本次课程设计就是运用我们所学到的理论知识,用MATLAB软件来实现对语音信号的变声处理,理论联系实际,从而更好地掌握以及运用所学习的知识。
第1章方案选择
1.1设计方案
方案一:
通过先对语音信号进行FFT变化得到频谱,然后搬移和改变基频,从而放大一部分频率并且减小一部分频率,从而实现对语音信号的变声处理。
另外还可以调整语速从而改变声音。
方案二:
我们可以采用线性预测参数合成法。
线性预测参数合成法利用LPC语音分析方法,通过分析自然语音样本,计算出LPC系数,就可以建立信号产生模型,从而合成出语音,我们用周期脉冲序列构成的激励信号经过时变数字滤波器,并定期的改变激励参数和预测系数就能合成出语音。
然后我们可以通过调整共振峰来实现语音的变声。
1.2方案的选择
方案一简单易懂,但是这种方法不易用参数进行控制,而且这种方法是通过频谱的搬移和改变来减小一部分的干扰,所以变声后的杂音较大,我们可以将它和滤波器结合起来。
方案二——线性预测参数合成法是目前比较简单和实用的一种语音合成方法,以其低数据率、低复杂度、低成本,受到特别的重视。
LPC语音分析方法可以有效地估计基本语音参数,如基音、共振峰、谱、声道面积函数等,可以对语音的基本模型给出精确的估计,而且计算速度较快。
这种方法可以比较容易的用参数进行控制。
综上所述:
我们采用方案二——线性预测参数合成法来实现语音信号的变声处理。
第2章变声的基本原理
2.1基本概念
1.声道:
声道是很多动物及人类都有的一个腔室,从声源产生的声音经由此处滤出。
人的声道包括声道则包括喉腔、咽头、口腔和鼻腔。
2.基音:
一般的声音都是由发音体发出的一系列频率、振幅各不相同的振动复合而成的。
这些振动中有一个频率最低的振动,由它发出的音就是基音,其余为泛音。
发音体整体振动产生的音,叫做基音,决定音高;
发音体部分振动产生的音,叫做泛音,决定音色;
基音和泛音结合一起而形成的音,叫做复合音,日常我们所听到的声音多为复合音。
3.共振峰:
共振峰是指在声音的频谱中能量相对集中的一些区域,共振峰不但是音质的决定因素,而且反映了声道(共振腔)的物理特征。
声音在经过共振腔时,受到腔体的滤波作用,使得频域中不同频率的能量重新分配,一部分因为共振腔的共振作用得到强化,另一部分则受到衰减,得到强化的那些频率在时频分析的语图上表现为浓重的黑色条纹。
由于能量分布不均匀,强的部分犹如山峰一般,故而称之为共振峰。
在语音声学中,共振峰决定着元音的音质,而在计算机音乐中,它们是决定音色和音质的重要参数。
无论是人声还是乐器,它们的声音特性都源自两个因素,一个是发声系统,如人的声带或乐器的振动簧片,另一个是共鸣系统。
乐器不同的共鸣系统使其在一定频域中的分音的振幅得以突出,这样,这些区域就产生了这个乐器所特有的共振峰值,这些共振峰值同共鸣体的大小、形状的材料密切相关。
由于一件乐器的结构是稳定的,因此在一件乐器发出的所有音调中,不论基频如何,都会表现出相同的共振峰值,只不过其显著性有强有弱罢了。
这就可以帮助我们解释为什么在很多的乐器中,同一乐器所发出的不同音调具有相同的音质。
在语音声学中,人声也同样受自身生理如鼻孔、咽腔、口腔大小的影响有自身的共振峰区。
通过利用这些共鸣空间的形状和大小不同的变化(例如改变咽喉、嘴形),我们就能改变声音的共振峰。
我们之所以能够区分不同的人声、元音,主要也是依靠它们的共振峰分布的位置。
2.2变声的原理
声音的合成我们采用的方法是线性预测参数合成法。
如图2.1,我们让周期脉冲序列构成的激励信号通过时变数字滤波器,然后通过改变激励参数和预测系数,就能合成出语音。
图2.1线性预测参数合成
2.2.1生成脉冲序列
语音信号是一种随时间而变化的信号,主要分为浊音和清音两大类。
浊音的基音周期、清浊音信号幅度和声道参数等都随时间而缓缓变化。
由于发生器官的惯性运动,可以认为在一小段时间里(一般为10~30ms)语音信号近似不变,即语音信号具有短时平稳性。
这样可以把语音信号分为一些短段(称为分析帧)来进行处理。
语音信号的分帧是采用可移动的有限长度窗口进行加权的方法来实现的。
一般每秒帧数约为33~100帧,视实际情况而定。
分帧虽然可以采用连续分段的方法,但是一般要采用交叠分段的方法。
如图2.2所示,这是为了使帧与帧之间平滑过渡,保持其连续性。
前一帧和后一帧的交叠部分称为帧移,帧移与帧长的比值一般取为0~1/2。
图2.2交叠分段方式
所以我们首先将信号分成若干个10ms长的段,假设每个段内基音周期固定不变,但段和段之间则不同,具体为:
PT=80+5mod(m;
50)(3.1)
其中PT表示基音周期,m表示段序号,我们知道每段的长度为80。
2.2.2计算预测系数
设语音信号的养殖序列为s(n),n=1,2,…,n,其中语音信号的当前取样值,即第n时刻的取样值s(n)。
而p阶线性预测,是根据信号过去p个取样值的加权和来预测信号当前取样的s(n),此时的预测器称为p阶预测器。
设(n)为s(n)的预测值,则有:
(3.2)
式中,,,…,称为线性预测系数,式(4.1)称为线性预测器,预测器的阶数为p阶。
2.2.3声道参数
从物理声学可以容易推导出均匀断面的共振峰。
例如,对成人声道L=17cm长,其共振频率计算公式为:
=c(2i-1)/4L,(i=1,2,3,…,i)(3.3)
其中,i是共振频率的序号,c=340m/s为声速。
按此算出前三个共振频率为,=1500Hz,=2500Hz。
由于发音时,声道的形状很少是均匀断面的。
因此必须通过语音信号来计算共振峰。
一个二阶谐振器的传输函数可以写为
(3.4)
实践表明,用前3个共振峰代表一个元音足够了。
对于较复杂的辅音或鼻音共振峰的个数要到5个以上。
多个叠加可以得到声道的共振峰模型
在此,我们可以由传输函数和其中的预测系数和求出共振峰。
假设__D_Dd__________ð
ĝϨϨ_________|在时域冲击响应中的贡献为A,并且有__D_Dd__________ĝϨ
因此共振峰频率为999.9447Hz。
实现代码如下:
clearall;
closeall;
clc
;
a=[1,-];
b=[1];
[r,p,k]=residues(b,a);
omega=abs(angle(p
(1)));
T=1/8000;
freq=omega/(2*pi*T);
从上面看,我们可以通过调整预测系数从而调整共振峰来实现语音信号的变声。
第3章程序设计及仿真分析
3.1程序设计
3.1.1分帧处理
对语音信号加Hamming窗处理,方法是用窗序列沿着语音样点值序列逐帧从左向右移动。
Hamming窗的窗函数如下:
=(4.1)
确定了窗函数以后,对语音信号的分帧处理,实际上就是对各帧进行某帧进行某种变换或运算。
代码如下:
WL=240;
hw=hamming(WL);
s_w=s(n*FL-WL+1:
n*FL).*hw;
3.1.2计算预测系数
[AE]=lpc(s_w,P);
3.1.3计算激励信号
对每帧语音信号s(n),和预测模型系数{},用filter函数计算激励信号e(n)。
此时应该注意在系数变化的情况下连续滤波,需要维持滤波器的状态不变,要利用filter函数的和参数。
这里要利用_pre,利用_pre作为初始状态得到最终状态,本次循环得到的最终状态作为下次循环的初始状态,并把每次循环得到的激励保存下来。
s_f=s((n-1)*FL+FL+1:
n*FL);
%本帧语音
[exc_f,zi_pre]=filter(A,1,s_f,zi_pre);
%计算s_f的激励
exc((n-1)*FL+1:
n*FL)=exc_f;
%保存得到的激励
3.1.4重建语音
用计算得到的激励信号e(n)和预测模型系数{},用fliter函数计算重建语音。
同样要注意维持滤波器的状态不变。
这里我们由激励得到语音,并且要利用_rec,利用_rec作为初始状态的到最终状态,本次循环得到的最终状态作为下次循环的初始状态,并且把每次循环得到的重建语音保存下来。
[rec_f,zi_rec]=filter(1,A,exc_f,zi_rec);
%计算重建语音
s_rec((n-1)*FL+1:
n*FL)=rec_f;
%保存得到的重建语音
3.1.5基音周期
基音周期是表征语音信号本质特征的参数,属于语音分析的范畴,只有准确分析并且提取出语音信号的特征参数,才能够利用这些参数进行语音合成处理。
如果x(n)是一个周期为P的信号,则其自相关函数也是周期为P的信号,且在信号周期的整数倍处,自相关函数取最大值。
语音的浊音信号具有准周期性,其自相关函数在基音周期的整数倍处取最大值。
计算两相邻最大峰值间的距离,就可以估计出基因周期。
[B,A]=butter(5,700/4000);
s=filter(B,A,s);
R=zeros(143,1);
fork=1:
143
R(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;
ifR2>
=0.85*Rop
Rop=R2;
Top=T2;
ifR3>
0.85*Rop
Rop=R3;
Top=T3;
PT=Top;
3.1.6合成激励的能量
根据线性预测分析的原理可知,求解p个线性预测系数的依据,是预测误差滤波器的输出方均值或输出功率最小。
可称这一最小方均误差为正向预测误差功率,即
==E{e(n)[s(n)-s(n-1)]}
=E[e(n)s(n)]-E[e(n)s(n-i)](4.2)
由于上式第二项为0,又:
e(n)=s(n)-=s(n)-s(n-i)(4.3)
将(4.3)代入(4.2)得:
=E[e(n)s(n)]=E[s(n)s(n)]-E[s(n)s(n-i)]=R(0)-R(i)(4.4)
根据式(4.4)可以求得增益常数G。
=R(0)-R(i)(4.5)
从而可以得到:
=(4.6)
由前面计算预测系数的代码
可以得到(代码里用E表示),和计算得到的基音周期联立可以得到增益G。
程序代码如下:
G=sqrt(E*PT);
3.1.7变声处理
变声的过程的实现思路与前面合成语音的思路基本相同,只是在两个地方有所不同:
1.系统参数b,a不同,这里的b和a是要用经改变后的极点算出来的;
2.生成激励信号时,用floor(PT/2)作为这里的PT。
其实现代码如下:
PT1=floor(PT/2);
poles=roots(A);
deltaOMG=100*2*pi/8000;
forp=1:
10
ifimag(poles(p))>
0poles(p)=poles(p)*exp(j*deltaOMG);
elseifimag(poles(p))<
0poles(p)=poles(p)*exp(-j*deltaOMG);
A1=poly(poles);
tempn_syn_t=[1:
n*FL-last_syn_t]'
exc_syn1_t=zeros(length(tempn_syn_t),1);
exc_syn1_t(mod(tempn_syn_t,PT1)==0)=G;
exc_syn1_t=exc_syn1_t((n-1)*FL-last_syn_t+1:
n*FL-last_syn_t);
[s_syn1_t,zi_syn_t]=filter(1,A1,exc_syn1_t,zi_syn_t);
exc_syn_t((n-1)*FL+1:
n*FL)=exc_syn1_t;
s_syn_t((n-1)*FL+1:
n*FL)=s_syn1_t;
last_syn_t=last_syn_t+PT1*floor((n*FL-last_syn_t)/PT1);
第4章GUI的设计
在本次课程设计中,我设计了一个GUI界面可以实现语音信号的录制、保存和保存的功能,并能将保存的语音信号进行变声处理实现将自己的语音变为女性的声音,小孩的声音和老人的声音,并能够描绘出语音信号的时域波形与频域波形。
4.1GUI简介
GUI是一种结合计算机科学、美学、心理学、行为学,及各商业领域需求分析的人机系统工程,强调人—机—环境三者作为一个系统进行总体设计。
GUI的广泛应用是当今计算机发展的重大成就之一,他极大地方便了非专业用户的使用。
人们从此不再需要死记硬背大量的命令,取而代之的是可以通过窗口、菜单、按键等方式来方便地进行操作。
而嵌入式GUI具有下面几个方面的基本要求:
轻型、占用资源少、高性能、高可靠性、便于移植、可配置等特点。
4.2GUI界面设计
在设计的这个名为“数字变声器”的GUI界面时,使用了MATLAB提供的可视化的界面环境Guide。
相比较通过编写程序进行GUI的设计,可视化的界面环境更加方便快捷。
1.按钮组:
用于将RadioButton、CheckBox等分组作为容器。
设计中使用了两个按钮组,一个把录音、打开和保存三项功能放在一组;
另一个把语音的变声处理放在了一组。
2.静态文本框:
用于显示文字信息,但不接受输入。
设计中使用了四个个静态文本框,一个用来显示设计的GUI名称——“数字变声器”;
一个用来说明文本框“luyinshijian”中的“10”为录音的时间长短;
一个用来说明文本框“luyinpinlv”中的“8000”为录音的采样频率;
还有一个用来标注打开的音频文件格式为“*。
wav”。
3.切换按钮:
切换按钮是当单击它时会进行凹凸状态转换,分别表示没有选定状态和选定状态。
设计中使用了两个切换按钮,分别命名为“录音”和“打开”。
4.文本框:
凹形方框,可以随意输入和编辑单行和多行文字,并显示出来。
设计中使用了两个文本框,分别编辑为“10”和“8000”,分别用来确定录音的时间和录音的采样频率。
5.按钮:
最常用的控件,用于相应用户的鼠标单击,按钮上有说明文字说明其作用。
设计中使用了七个按钮,分别用于录音确定、打开确定、保存、播放原声、变换为女声、变换为童声和变换为老人声音。
6.坐标轴:
用于绘制坐标轴。
设计中使用了两个坐标轴,axes1用来绘制时域波形;
axes2用来绘制频域波形。
最终设计的GUI界面如图5.1所示
图4.1GUI界面
4.3GUI界面运行流程图
开始
GUI界面
录音/打开
录音确定打开确定
录制10s,8000Hz,wav格式音频文件
打开已有的wav格式音频文件
保存录制的的wav格式音频文件
原声女声童声老人声音
将录制或打开的音频文件变为老人声音播放,并绘制出时域波形和频域波形
将录制或打开的音频文件变为童声播放,并绘制出时域波形和频域波形
将录制或打开的音频文件变为女声播放,并绘制出时域波形和频域波形
将录制或打开的音频文件原声播放,并绘制出时域波形和频域波形
图4.2界面运行流程图
4.4回调函数
对控件的Callback属性编程是实现GUI的基本机制,我们下来就要在各函数中编写程序代码,完成各回调函数的功能。
4.4.1切换按钮
(1)录音
选定“录音”切换开关时,“打开”切换开关和“打开确定”按钮应该失效,避免运行程序时产生冲突。
并且使“录音频率”、“录音时间”文本框和“录音确定”按钮有效,避免运行程序时无法调用参数,或是无法运行程序的情况。
functionluyin_Callback(hObject,eventdata,handles)
ifget(hObject,'
Value'
)
set(handles.luyinpinlv,'
Enable'
'
on'
);
set(handles.dakai,'
0);
set(handles.luyinshijian,'
set(handles.luyinqueding,'
set(handles.dakaiqueding,'
off'
string'
开始'
else
end;
(2)打开
选定“打开”切换开关时,“录音”切换开关、“录音时间”文本框、“录音频率”文本框和“录音确定”按钮失效,避免运行程序时产生冲突,使“打开确定”按钮,确保程序能够运行。
functiondakai_Callback(hObject,eventdata,handles)
set(handles.luyin,'
set(handles.dakaiqueding,'
else
4.4.2按钮
(1)录音开始
functionluyinqueding_Callback(hObject,eventdata,handles)
set(hObject,'
录音中'