[指导]数字变声器
数字变声器
河北北方学院宣化教学部 吕路广 摘要 为了实现由男声变换到女声,在语音信号参数
过程采用短时自相关法提取语音信号的基音周期,同时用LPC倒谱分析法分析共振峰的范围,通过mtlb编写程序修改语音参数并接近于女声的范围,构置GUI界面。在实验中,输入一段语音信号,输出时即实现了由男声到女声的变换效果。因此对于语音信号参数的修改能够实现男女声音之间的变换。
关键词 短时自相关法 LPC倒谱 语音信号 mtlb GUI
前言
为了锻炼自己数字信号处理的实践能力,也为了更好的完成老师布置的作业,本设计通过编写mtlb程序,修改相关声音参数,使其频率发生相应的变化,在输出时达到变声。
目录
数字变声器 ......................................................................................1
第1章 采样 ...............................................................................4 1 一些基本概念 ........................................................................4 1.1 声道 ...............................................................................4 1.2 基音 ...............................................................................4 1.3 共振峰............................................................................4 1.4 物理原理 ........................................................................4
第2章 设计
........................................................................5 2.1 设计原理 ..........................................................................5 2.2 设计步骤 ..........................................................................5
第3章 建模 ...............................................................................5 3.1 基于短时自相关法的基音周期估值 ...................................5
3.1.1构建巴特沃斯低通滤波器 .........................................5
3.1.2语音信号的短时自相关函数 ......................................6 3.2 LPC倒谱法提取共振峰 .......................................................6 3.3 线性预测语音信号合成.......................................................7
第4章 GUI界面设计以及仿真图形和程序 .......................................9 4.1 界面设计............................................................................9 4.2 仿真图形.......................................................................... 10
4.2.1 原声 ...................................................................... 11
4.2.2 女声 ...................................................................... 11
4.2.3 童声 ...................................................................... 11
4.2.4 老人声................................................................... 11
4.2.5 音调变高 ............................................................... 12
4.2.6 音调变低 ............................................................... 12
4.2.7 语速变慢 ............................................................... 12
4.2.8 语速变快 ............................................................... 13 4.3 程序
图如下 ............................................................... 13 4.4每个控件的程序如下 ......................................................... 14
4.4.1“录音”rdiobutton(rdiobutton1) ..................... 14
4.4.2“打开”rdiobutton(rdiobutton2) ..................... 14
4.4.3“开始 ”按钮(pushbutton1) .............................. 15
4.4.4“保存”按钮(pushbutton2)................................ 15
4.4.5“打开音频文件按钮”(pushbutton3) ................... 16
4.4.6“原声”按钮(pushbutton5)................................ 16
4.4.7“女声”按钮(pushbutton7)................................ 17
4.4.8“童声”按钮(pushbutton6)................................ 19
4.4.9“老人”按钮(pushbutton12) .............................. 20
4.4.10“音调变高”按钮(pushbutton11) ..................... 22
4.4.11“音调变低”按钮(pushbutton9) ....................... 22
4.4.12“语速变慢”按钮(pushbutton14) ..................... 23
4.4.13“语速变快”按钮(pushbutton8) ....................... 25 第4章 分析总结 ...................................................................... 26 参考文献........................................................................................ 26 致谢............................................................................................... 27
第1章 采样 1 一些基本概念
1.1 声道
声道是很多动物及人类都有的一个腔室,从声源产生的声音经由此处滤出。人的声道包括声道则包括喉腔、咽头、口腔和鼻腔。 1.2 基音
一般的声音都是由发音体发出的一系列频率、振幅各不相同的振动复合而成的。这些振动中有一个频率最低的振动,由它发出的音就是基音,其余为泛音。发音体整体振动产生的音,叫做基音,决定音高;发音体部分振动产生的音,叫做泛音,决定音色;基音和泛音结合一起而形成的音,叫做复合音,日常我们所听到的声音多为复合音。
1.3 共振峰
共振峰是指在声音的频谱中能量相对集中的一些区域,共振峰不但是音质的决定因素,而且反映了声道(共振腔)的物理特征。声音在经过共振腔时,受到腔体的滤波作用,使得频域中不同频率的能量重新分配,一部分因为共振腔的共振作用得到强化,另一部分则受到衰减,得到强化的那些频率在时频分析的语图上表现为浓重的黑色条纹。由于能量分布不均匀,强的部分犹如山峰一般,故而称之为共振峰。
1.4 物理原理
语音科学家将人类发声过程视作一个由声门源输送的气流经以声道、口、鼻腔组成的滤波器调制而成的。人类语音可分为有380声语音和无声语音,前者是由声带振动激励的脉冲信号经声腔调制变成不同的音,它是人类语言中元音的基础,声带振动的频率称为基频。无声语音则是声带保持开启状态,禁止振动引发的。一般来说,由声门振动决定的基频跟说话人的性别特征有关,如下表,而无声语音则没有体现这个特征。说话人的个性化音色和语音的另外一个声学参数——共振峰频率的分布有关。儿童由于声道短,其共振峰频率高于成年人,成年女性的声道一般短于成年男性,所以女性的共振峰频率一般高于男性。本实验是基于男生录制的声音进行相关参数提取,修改接近于女声、童声、老人声,并实现了音调的高低与速度的快慢
男声 基频分布(hz):50~180 共振峰频率分布:偏低
人群 女声 基频分布(hz):160~380 共振峰频率分布:中
童声 基频分布(hz):400~1000 共振峰频率分布:偏高
第2章 设计方案 2.1 设计原理
采用线性预测参数合成法。线性预测参数合成法利用LPC语音分析方法,通过分析自然语音样本,计算出LPC系数,就可以建立信号产生模型,从而合成出语音。
2.2 设计步骤
它包括以下几个步骤:1、先用短时自相关法对基音周期估值。2、用LPC倒谱法提取共振峰。3、线性预测语音信号合成,根据线性预测的基本思想,用过去M个样点值来预测现在或未来的样点值。4、用mtlp编程和mtlp GUI界面设计。
第3章 建模 3.1 基于短时自相关法的基音周期估值
对语言信号进行低通滤波,然后进行自相关计算。在低通滤波时,采用巴特沃斯滤波器
3.1.1构建巴特沃斯低通滤波器
根据人的说话特征设定相应指标参数,对本段语音设计算出巴特沃斯模拟滤波器的阶数N为5,3dB截止频率,,算出为0.175,归一化低通原型系统函数为:
其中
将带人中,得到低通滤波器,
根据设定的滤波器编写mtlb程序,当信号经过低通滤波器后,对原始信号滤波产生结果如下图所示,低通滤波后,保留基音频率,然后再用8kHz采样频率进行采样,采样序列为x(n),然后进行下一步的自相关计算。
3.1.2语音信号的短时自相关函数
定义语音信号自相关函数如下:
其中k为信号延迟点数:为语音信号;N为语音帧长度。经过低通滤波之后,取160个样点数,帧长取10ms,对每帧语音求短时自相关,取得自相关最大点数,自相关函数在基音周期处表现为峰值,这些峰值点之间的间隔的平均值就是基音周期。但是由于图中存在野点,编写mtlb程序除去野点算出对应基音周期如图3所示,设基音周期值为PT,调动PT,接近女声,设新的为PT1。
3.2 LPC倒谱法提取共振峰
通过线性预测分析得到合成滤波器的系统函数为
其冲击响应为h(n),为预测系数。
ˆˆhH然后求h(n)的倒谱(n),首先根据同态分析方法,有(z)=logH(z),因为H
ˆH(z)是最小相位的,即在单位圆内是解析的,所以(z)可以展开成级数形式,
ˆˆˆˆhhHH即(z)=,也就是说(z)的逆变换(n)是存在的,设(n)=0,将等式两端分别对求导,得到:
= 有(1-)=, 令式左右两边Z的各次幂前系数分别相等得到:
ˆ (1)=1 h
ˆ (n)=+ 1h
ˆ (n)= n>p h
在本实验中,取预测阶数为10,语音的样点数为160,按照上式可直接从预
ˆ测系数求得倒谱(n),这个倒谱是根据线性预测模型得到,即称为LPC倒谱。h
谱的峰值基本上对应于共振峰频率,用GT表示共振峰;修改共振峰,使共振峰接近女声、童声、老人声范围,新的为GT1. 3.3 线性预测语音信号合成
根据线性预测的基本思想,用过去M个样点值来预测现在或未来的样点值:
ˆy(n)= ˆy(n)是预测信号,为预测系数,y(n)为取样信号,预测误差(n):
E,(n),=E,, 为使E,(n),最小,对求偏导,并令其为零,有:
E,,,y(n-),=0 =1,„,M
上式表明采用最佳预测系数时,预测误差与过去的样点值正交。由于语音信号的短时平稳性,要分帧处理,对于每一个样点值记为 (n)„, (n+N-1),这段语音记为Yn。
对于语音段Yn,并记(j,i)=E,,,对于语音段Yn,它的自相关函数为:
n=1,„,M
根据Yule—wlker方程,可以解出样值,用这种方法定期地改变激励参数
,并使用修改过后的基因周期和共振峰参数,就能合成出语音,u(n)和预测系数
合成语音样本如下:
S(n)=+Gu(n) 为预测系数;G为模型增益;u(n)为激励;合成样本s(n);p为预测器阶数;
编写mtlb程序,合成效果如下图所示:
第4章 GUI界面设计以及仿真图形和程序
在设计数字变声器的界面时,使用了MTLB提供的可视化的界面环境Guide。相比较通过编写程序进行GUI的设计,可视化的界面环境更加方便快捷。
4.1 界面设计
在mtlb新建GUI,添加各部件,完成如下图所示。
当选中“录音”rdiobutton的时候,“打开”rdiobutton会失效,与之相关的“打开音频文件”pushbutton按钮也会失效,而与录音相关的两个文本框和“保存”按钮会有效,两个文本框分别写入录音时间与录音频率。
接下来的八个变声按钮则分别实现变声的效果,每个变声按钮后跟的两个坐标图分别画出变声后的时域图和频域图。
4.2 仿真图形
选择一段音频文件,显示其仿真图形(左图为时域图,右图为频域图)。
4.2.1 原声
4.2.2 女声
4.2.3 童声
4.2.4 老人声
4.2.5 音调变高
4.2.6 音调变低
4.2.7 语速变慢
4.2.8 语速变快
4.3 程序
如下
开 始
GUI界面 录音 打开 录音/打开
录制ns,8000Hz,打开已有的wv格
wv格式音频文件 式音频文件
保存录制的的wv
格式音频文件
原声 女声 童声 老人 调高 调低 速快 速慢
将打开将打开将打开将打开将打开将打开将打开将打开的音频的音频的音频的音频的音频的音频的音频的音频文件原文件转文件转文件转文件音文件音文件速文件速声播放,为女声调变高调变低为童声为老人度变快度变慢并绘制播放,并播放,并声播放,播放,并播放,并播放,并播放,并时域和绘制时绘制时并绘制绘制时绘制时绘制时绘制时频域波域和频域和频时域和域和频域和频域和频域和频
域波形 域波形 域波形 形 域波形 频域波域波形 域波形
形
4.4每个控件的程序如下
4.4.1“录音”rdiobutton(rdiobutton1)
% --- Executes on button press in rdiobutton1. function rdiobutton1_Cllbck(hObject, eventdt, hndles) % hObject hndle to rdiobutton1 (see GCBO)
% eventdt reserved - to be defined in future version of MTLB
% hndles structure with hndles nd user dt (see GUIDT)
% Hint: get(hObject,'Vlue') returns toggle stte of rdiobutton1
if get(hObject,'Vlue')
set(hndles.pushbutton1,'Enble','on');
set(hndles.edit1,'Enble','on');
set(hndles.edit2,'Enble','on');
set(hndles.rdiobutton2,'Vlue',0);
set(hndles.pushbutton3,'Enble','off');
else
end
4.4.2“打开”rdiobutton(rdiobutton2)
% --- Executes on button press in rdiobutton2. function rdiobutton2_Cllbck(hObject, eventdt, hndles) % hObject hndle to rdiobutton2 (see GCBO)
% eventdt reserved - to be defined in future version of MTLB
% hndles structure with hndles nd user dt (see GUIDT)
if get(hObject,'Vlue')
set(hndles.rdiobutton1,'Vlue',0);
set(hndles.pushbutton1,'Enble','off');
set(hndles.edit1,'Enble','off');
set(hndles.edit2,'Enble','off');
set(hndles.pushbutton3,'Enble','on');
else
end
4.4.3“开始 ”按钮(pushbutton1)
% --- Executes on button press in pushbutton1.
function pushbutton1_Cllbck(hObject, eventdt, hndles) % hObject hndle to pushbutton1 (see GCBO) % eventdt reserved - to be defined in future version of MTLB
% hndles structure with hndles nd user dt (see GUIDT)
set(hObject,'string','luyinzhong'); puse(0.4);
Fs=str2double(get(hndles.edit2,'String')); t=str2double(get(hndles.edit1,'String')); i=nloginput('winsound',0);
chne1=ddchnnel(i,1);
set(i,'SmpleRte',Fs);
durtion=t;
set(i,'SmplesPerTrigger',durtion*Fs); strt(i);
y=0;time=0;
[y,time]=getdt(i);
hndles.y=y;
hndles.Fs=Fs;
guidt(hObject,hndles);
plot(hndles.xes1,hndles.y)
title(hndles.xes1,'shiyutu');
ysize=size(hndles.y);
y=fft(hndles.y,length(hndles.y)); ysize=size(y);
plot(hndles.xes2,bs(y));
xlbel(hndles.xes2,'pinlv');
ylbel(hndles.xes2,'fudu');
title(hndles.xes2,'pinlvtexing'); set(hObject,'string','wnbi');
set(hndles.pushbutton2,'Enble','on'); 4.4.4“保存”按钮(pushbutton2) % --- Executes on button press in pushbutton2.
function pushbutton2_Cllbck(hObject, eventdt, hndles)
% hObject hndle to pushbutton2 (see GCBO)
% eventdt reserved - to be defined in future version of MTLB
% hndles structure with hndles nd user dt (see GUIDT)
Fs=hndles.Fs;
fs=Fs;
[filenme]=uiputfile({'*.wv','LL FILES(*.*)'},'wenjinbocun');
wvwrite(hndles.y,fs,filenme);
4.4.5“打开音频文件按钮”(pushbutton3)
% --- Executes on button press in pushbutton3.
function pushbutton3_Cllbck(hObject, eventdt, hndles)
% hObject hndle to pushbutton3 (see GCBO)
% eventdt reserved - to be defined in future version of MTLB
% hndles structure with hndles nd user dt (see GUIDT)
[filenme pthnme]=uigetfile({'*.wv','LL FILES'},'xunzeshengyinwenjin');
if isequl([filenme pthnme],[0,0])
return;
end
str=[pthnme filenme];
[temp Fs]=wvred(str);
hndles.y=temp;hndles.Fs=Fs;
hndles.xunze=2;
guidt(hObject,hndles);
set(hndles.pushbutton2,'Enble','on');
4.4.6“原声”按钮(pushbutton5)
% --- Executes on button press in pushbutton5.
function pushbutton5_Cllbck(hObject, eventdt, hndles)
% hObject hndle to pushbutton5 (see GCBO)
% eventdt reserved - to be defined in future version of MTLB
% hndles structure with hndles nd user dt (see GUIDT)
c=hndles.Fs;
Fs=c;
wvply(hndles.y,Fs);
plot(hndles.xes1,hndles.y) title(hndles.xes1,'shiyutu'); ysize=size(hndles.y);
y=fft(hndles.y,length(hndles.y)); ysize=size(y);
plot(hndles.xes2,bs(y(1:ysize/2))); xlbel(hndles.xes2,'pinlv'); ylbel(hndles.xes2,'fudu'); title(hndles.xes2,'pinlvtexing'); 4.4.7“女声”按钮(pushbutton7)
% --- Executes on button press in pushbutton7.
function pushbutton7_Cllbck(hObject, eventdt, hndles)
% hObject hndle to pushbutton7 (see GCBO) % eventdt reserved - to be defined in future version of MTLB
% hndles structure with hndles nd user dt (see GUIDT)
FL = 80;
WL = 240;
P = 10; s=hndles.y;fs=hndles.Fs;
s = s/mx(s);
L = length(s);
FN = floor(L/FL)-2;
exc=zeros(L,1);
zi_pre = zeros(P,1);
s_rec = zeros(L,1);
zi_rec = zeros(P,1);
exc_syn = zeros(L,1);
s_syn = zeros(L,1); lst_syn = 0;
zi_syn = zeros(P,1);
exc_syn_t = zeros(L,1);
s_syn_t = zeros(L,1);
lst_syn_t = 0;
zi_syn_t = zeros(P,1);
hw = hmming(WL);
for n = 3:FN
s_w = s(n*FL-WL+1:n*FL).*hw;
[ E] = lpc(s_w, P); •
s_f=s((n-1)*FL+1:n*FL); ••
[exc1,zi_pre] = filter(,1,s_f,zi_pre);
exc((n-1)*FL+1:n*FL) = exc1;
[s_rec1,zi_rec] = filter(1,,exc1,zi_rec);
s_rec((n-1)*FL+1:n*FL) = s_rec1;
s_Pitch = exc(n*FL-222:n*FL);
PT = findpitch(s_Pitch);
G = sqrt(E*PT);
tempn_syn = [1:n*FL-lst_syn]';
exc_syn1 = zeros(length(tempn_syn),1);
exc_syn1(mod(tempn_syn,PT)==0) = G;
exc_syn1 = exc_syn1((n-1)*FL-lst_syn+1:n*FL-lst_syn);
[s_syn1,zi_syn] = filter(1,,exc_syn1,zi_syn);
exc_syn((n-1)*FL+1:n*FL)=exc_syn1;
s_syn((n-1)*FL+1:n*FL) = s_syn1;
lst_syn = lst_syn+PT*floor((n*FL-lst_syn)/PT);•
PT1 =floor(PT/2);
poles = roots();
deltOMG =150*2*pi/fs;
for p=1:10
if img(poles(p))>0 poles(p) = poles(p)*exp(j*deltOMG);
elseif
img(poles(p))<0
poles(p) = poles(p)*exp(-j*deltOMG);
end
end
1=poly(poles);
tempn_syn_t = [1:n*FL-lst_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-lst_syn_t+1:n*FL-lst_syn_t);
[s_syn1_t,zi_syn_t] = filter(1,1,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;
lst_syn_t = lst_syn_t+PT1*floor((n*FL-lst_syn_t)/PT1);
end
plot(hndles.xes5,s_syn_t)
title(hndles.xes5,'shiyutu');
ysize=size(s_syn_t);
y=fft(s_syn_t,length(s_syn_t)); ysize=size(y);
plot(hndles.xes6,bs(y(1:ysize/2))); xlbel(hndles.xes6,'pinlv');
ylbel(hndles.xes6,'fudu');
title(hndles.xes6,'pinlvtexing'); %grid on;
sound(s_syn_t); 4.4.8“童声”按钮(pushbutton6)
% --- Executes on button press in pushbutton6. function pushbutton6_Cllbck(hObject, eventdt, hndles)
% hObject hndle to pushbutton6 (see GCBO) % eventdt reserved - to be defined in future version of MTLB
% hndles structure with hndles nd user dt (see GUIDT)
FL =80;
WL = 240;
P = 10;
s=hndles.y;fs=hndles.Fs;
s = s/mx(s);
L = length(s);
FN = floor(L/FL)-2;
exc = zeros(L,1);
zi_pre = zeros(P,1);
s_rec = zeros(L,1);
zi_rec = zeros(P,1);
exc_syn_t = zeros(L,1);
s_syn_t = zeros(L,1);
lst_syn_t = 0;
zi_syn_t = zeros(P,1);
hw = hmming(WL);
for n = 3:FN
s_w = s(n*FL-WL+1:n*FL).*hw;
[ E] = lpc(s_w, P);
s_f = s((n-1)*FL+1:n*FL);
[exc1,zi_pre] = filter(,1,s_f,zi_pre); exc((n-1)*FL+1:n*FL) = exc1;
[s_rec1,zi_rec] = filter(1,,exc1,zi_rec);
s_rec((n-1)*FL+1:n*FL) = s_rec1;
s_Pitch = exc(n*FL-222:n*FL);
PT = findpitch(s_Pitch);
G = sqrt(E*PT);
PT1 =floor(PT/2);
poles = roots();
deltOMG = 700*2*pi/8000;
for p=1:10
if img(poles(p))>0 poles(p) = poles(p)*exp(j*deltOMG);
elseif img(poles(p))<0 poles(p) = poles(p)*exp(-j*deltOMG);
end
end
1=poly(poles);
tempn_syn_t = [1:n*FL-lst_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-lst_syn_t+1:n*FL-lst_syn_t);
[s_syn1_t,zi_syn_t] = filter(1,1,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;
lst_syn_t = lst_syn_t+PT1*floor((n*FL-lst_syn_t)/PT1);
end
plot(hndles.xes3,s_syn_t)
title(hndles.xes3,'shiyutu');
ysize=size(s_syn_t);
y=fft(hndles.y,length(s_syn_t));
ysize=size(y);
plot(hndles.xes4,bs(y(1:ysize/2)));
xlbel(hndles.xes4,'pinlv');
ylbel(hndles.xes4,'fudu');
title(hndles.xes4,'pinlvtexing');
sound(s_syn_t);
4.4.9“老人”按钮(pushbutton12)
% --- Executes on button press in pushbutton12.
function pushbutton12_Cllbck(hObject, eventdt, hndles)
% hObject hndle to pushbutton12 (see GCBO)
% eventdt reserved - to be defined in future version of MTLB
% hndles structure with hndles nd user dt (see GUIDT)
FL =80;
WL = 240;
P = 10;
s=hndles.y;fs=hndles.Fs
s = s/mx(s);
L = length(s);
FN = floor(L/FL)-2;
exc = zeros(L,1);
zi_pre = zeros(P,1);
s_rec = zeros(L,1);
zi_rec = zeros(P,1);
v=.38;
exc_syn_v = zeros(v\L,1);
s_syn_v = zeros(v\L,1);
lst_syn_v = 0; •
zi_syn_v = zeros(P,1);
hw = hmming(WL); •
for n = 3:FN
s_w = s(n*FL-WL+1:n*FL).*hw;
[ E] = lpc(s_w, P);
s_f = s((n-1)*FL+1:n*FL); •
[exc1,zi_pre] = filter(,1,s_f,zi_pre); exc((n-1)*FL+1:n*FL) = exc1;
[s_rec1,zi_rec] = filter(1,,exc1,zi_rec); s_rec((n-1)*FL+1:n*FL) = s_rec1; s_Pitch = exc(n*FL-222:n*FL);
PT = findpitch(s_Pitch);
G = sqrt(E*PT);
FL_v = floor(FL/v);
tempn_syn_v = [1:n*FL_v-lst_syn_v]'; exc_syn1_v = zeros(length(tempn_syn_v),1); exc_syn1_v(mod(tempn_syn_v,PT)==0) = G; exc_syn1_v = exc_syn1_v((n-1)*FL_v-lst_syn_v+1:n*FL_v-lst_syn_v);
[s_syn1_v,zi_syn_v] = filter(1,,exc_syn1_v,zi_syn_v); lst_syn_v = lst_syn_v+PT*floor((n*FL_v-lst_syn_v)/PT);
exc_syn_v((n-1)*FL_v+1:n*FL_v) =exc_syn1_v; s_syn_v((n-1)*FL_v+1:n*FL_v) = s_syn1_v; end
plot(hndles.xes7,s_syn_v)
title(hndles.xes7,'shiyutu');
ysize=size(s_syn_v);
y=fft(s_syn_v,length(s_syn_v)); ysize=size(y);
plot(hndles.xes8,bs(y(1:ysize/2))); xlbel(hndles.xes8,'pinlv');
ylbel(hndles.xes8,'fudu');
title(hndles.xes8,'pinlvtexing'); sound(s_syn_v);
4.4.10“音调变高”按钮(pushbutton11) % --- Executes on button press in pushbutton11. function pushbutton11_Cllbck(hObject, eventdt, hndles)
% hObject hndle to pushbutton11 (see GCBO) % eventdt reserved - to be defined in future version of MTLB
% hndles structure with hndles nd user dt (see GUIDT)
x=hndles.y;fs=hndles.Fs;
N=length(x);
n=[0:N-1];
X=fft(x);
Fs=1*fs;
f=n/N*Fs;
w=1.6;
M=w*fs;
plot(hndles.xes15,x)
title(hndles.xes15,'shiyutu'); ysize=size(x);
y=fft(x,length(x));
ysize=size(y);
plot(hndles.xes16,bs(y(1:ysize/2))); xlbel(hndles.xes16,'pinlv');
ylbel(hndles.xes16,'fudu');
title(hndles.xes16,'pinlvtexing'); sound(x,M);
4.4.11“音调变低”按钮(pushbutton9) % --- Executes on button press in pushbutton9.
function pushbutton9_Cllbck(hObject, eventdt, hndles) % hObject hndle to pushbutton9 (see GCBO) % eventdt reserved - to be defined in future version of MTLB
% hndles structure with hndles nd user dt (see GUIDT)
x=hndles.y;fs=hndles.Fs;
N=length(x);
n=[0:N-1];
X=fft(x);
Fs=1*fs;
f=n/N*Fs;
w=0.6;
M=w*fs;
plot(hndles.xes13,x)
title(hndles.xes13,'shiyutu');
ysize=size(x);
y=fft(x,length(x));
ysize=size(y);
plot(hndles.xes14,bs(y(1:ysize/2)));
xlbel(hndles.xes14,'pinlv');
ylbel(hndles.xes14,'fudu');
title(hndles.xes14,'pinlvtexing');
sound(x,M);
4.4.12“语速变慢”按钮(pushbutton14) % --- Executes on button press in pushbutton14. function pushbutton14_Cllbck(hObject, eventdt, hndles)
% hObject hndle to pushbutton14 (see GCBO) % eventdt reserved - to be defined in future version of MTLB
% hndles structure with hndles nd user dt (see GUIDT)
FL=80;
WL=240;
P =10;
s=hndles.y;fs=hndles.Fs;
s=s/mx(s);
L=length(s);
FN=floor(L/FL)-2;
exc=zeros(L,1);
zi_pre=zeros(P,1);
s_rec=zeros(L,1);
zi_rec=zeros(P,1);
v=0.3;
exc_syn_v=zeros(v\L,1);
s_syn_v=zeros(v\L,1);
lst_syn_v=0;
zi_syn_v=zeros(P,1);
hw=hmming(WL);
for n=3:FN
s_w=s(n*FL-WL+1:n*FL).*hw; [ E]=lpc(s_w, P); s_f=s((n-1)*FL+1:n*FL); [exc1,zi_pre]=filter(,1,s_f,zi_pre); exc((n-1)*FL+1:n*FL)=exc1;
[s_rec1,zi_rec]=filter(1,,exc1,zi_rec); s_rec((n-1)*FL+1:n*FL)=s_rec1; s_Pitch=exc(n*FL-222:n*FL);
PT=findpitch(s_Pitch);
G=sqrt(E*PT);
FL_v=floor(FL/v);
tempn_syn_v=[1:n*FL_v-lst_syn_v]'; exc_syn1_v=zeros(length(tempn_syn_v),1); exc_syn1_v(mod(tempn_syn_v,PT)==0)=G; exc_syn1_v=exc_syn1_v((n-1)*FL_v-lst_syn_v+1:n*FL_v-lst_syn_v);
[s_syn1_v,zi_syn_v]=filter(1,,exc_syn1_v,zi_syn_v);
lst_syn_v=lst_syn_v+PT*floor((n*FL_v-lst_syn_v)/PT);
exc_syn_v((n-1)*FL_v+1:n*FL_v)=exc_syn1_v; s_syn_v((n-1)*FL_v+1:n*FL_v)=s_syn1_v; end
plot(hndles.xes9,s_syn_v)
title(hndles.xes9,'shiyutu'); ysize=size(s_syn_v);
y=fft(s_syn_v,length(s_syn_v)); ysize=size(y);
plot(hndles.xes10,bs(y(1:ysize/2))); xlbel(hndles.xes10,'pinlv'); ylbel(hndles.xes10,'fudu');
title(hndles.xes10,'pinlvtexing'); sound(s_syn_v);
4.4.13“语速变快”按钮(pushbutton8) % --- Executes on button press in pushbutton8. function pushbutton8_Cllbck(hObject, eventdt, hndles) % hObject hndle to pushbutton8 (see GCBO) % eventdt reserved - to be defined in future version of MTLB
% hndles structure with hndles nd user dt (see GUIDT)
FL=80;
WL=240;
P =10;
s=hndles.y;fs=hndles.Fs;
s=s/mx(s);
L=length(s);
FN=floor(L/FL)-2;
exc=zeros(L,1);
zi_pre=zeros(P,1);
s_rec=zeros(L,1);
zi_rec=zeros(P,1);
v=2;
exc_syn_v=zeros(v\L,1);
s_syn_v=zeros(v\L,1);
lst_syn_v=0;
zi_syn_v=zeros(P,1);
hw=hmming(WL);
for n=3:FN
s_w=s(n*FL-WL+1:n*FL).*hw;
[ E]=lpc(s_w, P);
s_f=s((n-1)*FL+1:n*FL);
[exc1,zi_pre]=filter(,1,s_f,zi_pre); exc((n-1)*FL+1:n*FL)=exc1;
[s_rec1,zi_rec]=filter(1,,exc1,zi_rec); s_rec((n-1)*FL+1:n*FL)=s_rec1;
s_Pitch=exc(n*FL-222:n*FL);
PT=findpitch(s_Pitch);
G=sqrt(E*PT);
FL_v=floor(FL/v);
tempn_syn_v=[1:n*FL_v-lst_syn_v]'; exc_syn1_v=zeros(length(tempn_syn_v),1); exc_syn1_v(mod(tempn_syn_v,PT)==0)=G; exc_syn1_v=exc_syn1_v((n-1)*FL_v-lst_syn_v+1:n*FL_v-lst_syn_v);
[s_syn1_v,zi_syn_v]=filter(1,,exc_syn1_v,zi_syn_v);
lst_syn_v=lst_syn_v+PT*floor((n*FL_v-lst_syn_v)/PT);
exc_syn_v((n-1)*FL_v+1:n*FL_v)=exc_syn1_v; s_syn_v((n-1)*FL_v+1:n*FL_v)=s_syn1_v; end
plot(hndles.xes11,s_syn_v)
title(hndles.xes11,'shiyutu');
ysize=size(s_syn_v);
y=fft(s_syn_v,length(s_syn_v));
ysize=size(y);
plot(hndles.xes12,bs(y(1:ysize/2)));
xlbel(hndles.xes12,'pinlv');
ylbel(hndles.xes12,'fudu');
title(hndles.xes12,'pinlvtexing');
sound(s_syn_v);
第4章 分析总结
在实验中,用短时自相关法及LPC倒谱分析方法提取语音参数,用线性预测合成语音能够实现由男声到女声的变换。这种分析方法简单易行,且对参数有一个较好的把握,预测误差也会受到相应的变化,整个过程不会对合成效果产生较大的偏差,具有可行性;本实验最大不同点在于新建的LPC倒谱法,用于共振峰的提取,能够对参数比较有效的控制,减去比较复杂计算以及激励问题;整个过程成功实现由男声到女声、童声、老人声,以及语速与音调的变换。
参考文献
[1] 程佩青.数字信号处理教程。清华大学出版社,2007.2 [2] 陈垚光等.精通MTLB GUI设计.北京:电子工业出版社,2011.1 [3] 精锐创作组.MTLB6.0科学运算完整解决方案.北京:人民邮电出版社,2001.7
[4] 王洪元.MTLB语言及其在电子信息工程中的应用.北京:清华大学出版社,2004
[5] 张雪英.数字语音处理及MTLB仿真.北京:电子工业出版社,2010.7
[6] 郑阿奇.MTLB实用教程。北京:电子工业出版社,2007.8 [7] 高西全,丁玉美.数字信号处理(第三版)[M].西安电子科技大学出版社,2011.
[8]陈生潭,郭宝龙,李学武,高建宁.信号与系统(第三版)[M].西安电子科技大学出版社,2008.
致谢
感谢曹老师能够给我这次锻炼的机会,使我更加深刻得体会到了数字信号处理的强大魅力,增加了自己课外实践的能力。也感谢室友和同学们的支持与帮助,鄙人在此表示对老师和同学们深深的谢意。