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

数字变声器

数字变声器摘要为了实现由男声变换到女声,在语音信号参数分析过程采用短时自相关法提取语音信号的基音周期,同时用LPC倒谱分析法分析共振峰的范围,通过matlab编写程序修改语音参数并接近于女声的范围,构置GUI界面。

在实验中,输入一段语音信号,输出时即实现了由男声到女声的变换效果。

因此对于语音信号参数的修改能够实现男女声音之间的变换。

关键词短时自相关法 LPC倒谱语音信号 matlab GUI前言为了锻炼自己数字信号处理的实践能力,也为了更好的完成老师布置的作业,本设计通过编写matlab程序,修改相关声音参数,使其频率发生相应的变化,在输出时达到变声。

目录数字变声器 (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界面设计以及仿真图形和程序 (8)4.1 界面设计 (8)4.2 仿真图形 (9)4.2.1 原声 (10)4.2.2 女声 (10)4.2.3 童声 (10)4.2.4 老人声 (10)4.2.5 音调变高 (11)4.2.6 音调变低 (11)4.2.7 语速变慢 (11)4.2.8 语速变快 (12)4.3 程序流程图如下 (12)4.4每个控件的程序如下 (13)4.4.1“录音”radiobutton(radiobutton1) (13)4.4.2“打开”radiobutton(radiobutton2) (13)4.4.3“开始”按钮(pushbutton1) (14)4.4.4“保存”按钮(pushbutton2) (14)4.4.5“打开音频文件按钮”(pushbutton3) (15)4.4.6“原声”按钮(pushbutton5) (15)4.4.7“女声”按钮(pushbutton7) (16)4.4.8“童声”按钮(pushbutton6) (17)4.4.9“老人”按钮(pushbutton12) (19)4.4.10“音调变高”按钮(pushbutton11) (20)4.4.11“音调变低”按钮(pushbutton9) (21)4.4.12“语速变慢”按钮(pushbutton14) (21)4.4.13“语速变快”按钮(pushbutton8) (23)第4章分析总结 (24)参考文献 (24)致谢 ...................................................................................................................错误!未定义书签。

第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、用matlap编程和matlap GUI 界面设计。

第3章建模3.1 基于短时自相关法的基音周期估值对语言信号进行低通滤波,然后进行自相关计算。

在低通滤波时,采用巴特沃斯滤波器3.1.1构建巴特沃斯低通滤波器根据人的说话特征设定相应指标参数,对本段语音设计算出巴特沃斯模拟滤波器的阶数N为5,3dB截止频率,,算出为0.175,归一化低通原型系统函数为:其中将带人中,得到低通滤波器,根据设定的滤波器编写matlab程序,当信号经过低通滤波器后,对原始信号滤波产生结果如下图所示,低通滤波后,保留基音频率,然后再用8kHz采样频率进行采样,采样序列为x(n),然后进行下一步的自相关计算。

3.1.2语音信号的短时自相关函数定义语音信号自相关函数如下:其中k为信号延迟点数:为语音信号;N为语音帧长度。

经过低通滤波之后,取160个样点数,帧长取10ms,对每帧语音求短时自相关,取得自相关最大点数,自相关函数在基音周期处表现为峰值,这些峰值点之间的间隔的平均值就是基音周期。

但是由于图中存在野点,编写matlab程序除去野点算出对应基音周期如图3所示,设基音周期值为PT,调动PT,接近女声,设新的为PT1。

3.2 LPC倒谱法提取共振峰通过线性预测分析得到合成滤波器的系统函数为其冲击响应为h(n),为预测系数。

然后求h(n)的倒谱hˆ(n),首先根据同态分析方法,有Hˆ(z)=logH(z),因为H (z)是最小相位的,即在单位圆内是解析的,所以Hˆ(z)可以展开成级数形式,即Hˆ(z)=,也就是说Hˆ(z)的逆变换hˆ(n)是存在的,设hˆ(n)=0,将等式两端分别对求导,得到:=有(1-)=,令式左右两边Z的各次幂前系数分别相等得到:hˆ(1)=1hˆ(n)=+ 1hˆ(n)= n>p在本实验中,取预测阶数为10,语音的样点数为160,按照上式可直接从预测系数求得倒谱hˆ(n),这个倒谱是根据线性预测模型得到,即称为LPC倒谱。

谱的峰值基本上对应于共振峰频率,用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—walker方程,可以解出样值,用这种方法定期地改变激励参数u(n)和预测系数,并使用修改过后的基因周期和共振峰参数,就能合成出语音,合成语音样本如下:S(n)=+Gu(n)为预测系数;G为模型增益;u(n)为激励;合成样本s(n);p为预测器阶数;编写matlab程序,合成效果如下图所示:第4章 GUI界面设计以及仿真图形和程序在设计数字变声器的界面时,使用了MATLAB提供的可视化的界面环境Guide。

相比较通过编写程序进行GUI的设计,可视化的界面环境更加方便快捷。

4.1 界面设计在matlab新建GUI,添加各部件,完成如下图所示。

当选中“录音”radiobutton的时候,“打开”radiobutton会失效,与之相关的“打开音频文件”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 ,wav 格式音频文件 打开已有的wav 格式音频文件 保存录制的的wav格式音频文件 将打开的音频文件原声播放,并绘制将打开的音频文件转为女声播放,并将打开的音频文件转为童声播放,并将打开的音频文件转为老人声播放,将打开的音频文件音调变高播放,并将打开的音频文件音调变低播放,并将打开的音频文件速度变快播放,并将打开的音频文件速度变慢播放,并4.4每个控件的程序如下4.4.1“录音”radiobutton(radiobutton1)% --- Executes on button press in radiobutton1.function radiobutton1_Callback(hObject, eventdata, handles)% hObject handle to radiobutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)% Hint: get(hObject,'Value') returns toggle state of radiobutton1 if get(hObject,'Value')set(handles.pushbutton1,'Enable','on');set(handles.edit1,'Enable','on');set(handles.edit2,'Enable','on');set(handles.radiobutton2,'Value',0);set(handles.pushbutton3,'Enable','off');elseend4.4.2“打开”radiobutton(radiobutton2)% --- Executes on button press in radiobutton2.function radiobutton2_Callback(hObject, eventdata, handles)% hObject handle to radiobutton2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)if get(hObject,'Value')set(handles.radiobutton1,'Value',0);set(handles.pushbutton1,'Enable','off');set(handles.edit1,'Enable','off');set(handles.edit2,'Enable','off');set(handles.pushbutton3,'Enable','on');elseend4.4.3“开始”按钮(pushbutton1)% --- Executes on button press in pushbutton1.function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)set(hObject,'string','luyinzhong');pause(0.4);Fs=str2double(get(handles.edit2,'String'));t=str2double(get(handles.edit1,'String'));ai=analoginput('winsound',0);chane1=addchannel(ai,1);set(ai,'SampleRate',Fs);duration=t;set(ai,'SamplesPerTrigger',duration*Fs);start(ai);y=0;time=0;[y,time]=getdata(ai);handles.y=y;handles.Fs=Fs;guidata(hObject,handles);plot(handles.axes1,handles.y)title(handles.axes1,'shiyutu');ysize=size(handles.y);y=fft(handles.y,length(handles.y));ysize=size(y);plot(handles.axes2,abs(y));xlabel(handles.axes2,'pinlv');ylabel(handles.axes2,'fudu');title(handles.axes2,'pinlvtexing');set(hObject,'string','wanbi');set(handles.pushbutton2,'Enable','on');4.4.4“保存”按钮(pushbutton2)% --- Executes on button press in pushbutton2.function pushbutton2_Callback(hObject, eventdata, handles)% hObject handle to pushbutton2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)Fs=handles.Fs;fs=Fs;[filename]=uiputfile({'*.wav','ALL FILES(*.*)'},'wenjianbaocun'); wavwrite(handles.y,fs,filename);4.4.5“打开音频文件按钮”(pushbutton3)% --- Executes on button press in pushbutton3.function pushbutton3_Callback(hObject, eventdata, handles)% hObject handle to pushbutton3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) [filename pathname]=uigetfile({'*.wav','ALL FILES'},'xuanzeshengyinwenjian');if isequal([filename pathname],[0,0])return;endstr=[pathname filename];[temp Fs]=wavread(str);handles.y=temp;handles.Fs=Fs;handles.xuanze=2;guidata(hObject,handles);set(handles.pushbutton2,'Enable','on');4.4.6“原声”按钮(pushbutton5)% --- Executes on button press in pushbutton5.function pushbutton5_Callback(hObject, eventdata, handles)% hObject handle to pushbutton5 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)c=handles.Fs;Fs=c;wavplay(handles.y,Fs);plot(handles.axes1,handles.y)title(handles.axes1,'shiyutu');ysize=size(handles.y);y=fft(handles.y,length(handles.y));ysize=size(y);plot(handles.axes2,abs(y(1:ysize/2)));xlabel(handles.axes2,'pinlv');ylabel(handles.axes2,'fudu');title(handles.axes2,'pinlvtexing');4.4.7“女声”按钮(pushbutton7)% --- Executes on button press in pushbutton7.function pushbutton7_Callback(hObject, eventdata, handles)% hObject handle to pushbutton7 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) FL = 80;WL = 240;P = 10;s=handles.y;fs=handles.Fs;s = s/max(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);last_syn = 0;zi_syn = zeros(P,1);exc_syn_t = zeros(L,1);s_syn_t = zeros(L,1);last_syn_t = 0;zi_syn_t = zeros(P,1);hw = hamming(WL);for n = 3:FNs_w = s(n*FL-WL+1:n*FL).*hw;[A E] = lpc(s_w, P); •s_f=s((n-1)*FL+1:n*FL); ••[exc1,zi_pre] = filter(A,1,s_f,zi_pre);exc((n-1)*FL+1:n*FL) = exc1;[s_rec1,zi_rec] = filter(1,A,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-last_syn]';exc_syn1 = zeros(length(tempn_syn),1);exc_syn1(mod(tempn_syn,PT)==0) = G;exc_syn1 = exc_syn1((n-1)*FL-last_syn+1:n*FL-last_syn);[s_syn1,zi_syn] = filter(1,A,exc_syn1,zi_syn);exc_syn((n-1)*FL+1:n*FL)=exc_syn1;s_syn((n-1)*FL+1:n*FL) = s_syn1;last_syn = last_syn+PT*floor((n*FL-last_syn)/PT);•PT1 =floor(PT/2);poles = roots(A);deltaOMG =150*2*pi/fs;for p=1:10if imag(poles(p))>0 poles(p) = poles(p)*exp(j*deltaOMG);elseifimag(poles(p))<0poles(p) = poles(p)*exp(-j*deltaOMG);endendA1=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);endplot(handles.axes5,s_syn_t)title(handles.axes5,'shiyutu');ysize=size(s_syn_t);y=fft(s_syn_t,length(s_syn_t));ysize=size(y);plot(handles.axes6,abs(y(1:ysize/2)));xlabel(handles.axes6,'pinlv');ylabel(handles.axes6,'fudu');title(handles.axes6,'pinlvtexing');%grid on;sound(s_syn_t);4.4.8“童声”按钮(pushbutton6)% --- Executes on button press in pushbutton6.function pushbutton6_Callback(hObject, eventdata, handles)% hObject handle to pushbutton6 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)FL =80;WL = 240;P = 10;s=handles.y;fs=handles.Fs;s = s/max(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);last_syn_t = 0;zi_syn_t = zeros(P,1);hw = hamming(WL);for n = 3:FNs_w = s(n*FL-WL+1:n*FL).*hw;[A E] = lpc(s_w, P);s_f = s((n-1)*FL+1:n*FL);[exc1,zi_pre] = filter(A,1,s_f,zi_pre);exc((n-1)*FL+1:n*FL) = exc1;[s_rec1,zi_rec] = filter(1,A,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(A);deltaOMG = 700*2*pi/8000;for p=1:10if imag(poles(p))>0 poles(p) = poles(p)*exp(j*deltaOMG);elseif imag(poles(p))<0 poles(p) = poles(p)*exp(-j*deltaOMG); endendA1=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);endplot(handles.axes3,s_syn_t)title(handles.axes3,'shiyutu');ysize=size(s_syn_t);y=fft(handles.y,length(s_syn_t));ysize=size(y);plot(handles.axes4,abs(y(1:ysize/2)));xlabel(handles.axes4,'pinlv');ylabel(handles.axes4,'fudu');title(handles.axes4,'pinlvtexing');sound(s_syn_t);4.4.9“老人”按钮(pushbutton12)% --- Executes on button press in pushbutton12.function pushbutton12_Callback(hObject, eventdata, handles)% hObject handle to pushbutton12 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)FL =80;WL = 240;P = 10;s=handles.y;fs=handles.Fss = s/max(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);last_syn_v = 0; •zi_syn_v = zeros(P,1);hw = hamming(WL); •for n = 3:FNs_w = s(n*FL-WL+1:n*FL).*hw;[A E] = lpc(s_w, P);s_f = s((n-1)*FL+1:n*FL); •[exc1,zi_pre] = filter(A,1,s_f,zi_pre);exc((n-1)*FL+1:n*FL) = exc1;[s_rec1,zi_rec] = filter(1,A,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-last_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-last_syn_v+1:n*FL_v-last_syn_v); [s_syn1_v,zi_syn_v] = filter(1,A,exc_syn1_v,zi_syn_v);last_syn_v = last_syn_v+PT*floor((n*FL_v-last_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;endplot(handles.axes7,s_syn_v)title(handles.axes7,'shiyutu');ysize=size(s_syn_v);y=fft(s_syn_v,length(s_syn_v));ysize=size(y);plot(handles.axes8,abs(y(1:ysize/2)));xlabel(handles.axes8,'pinlv');ylabel(handles.axes8,'fudu');title(handles.axes8,'pinlvtexing');sound(s_syn_v);4.4.10“音调变高”按钮(pushbutton11)% --- Executes on button press in pushbutton11.function pushbutton11_Callback(hObject, eventdata, handles)% hObject handle to pushbutton11 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)x=handles.y;fs=handles.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(handles.axes15,x)title(handles.axes15,'shiyutu');ysize=size(x);y=fft(x,length(x));ysize=size(y);plot(handles.axes16,abs(y(1:ysize/2)));xlabel(handles.axes16,'pinlv');ylabel(handles.axes16,'fudu');title(handles.axes16,'pinlvtexing');sound(x,M);4.4.11“音调变低”按钮(pushbutton9)% --- Executes on button press in pushbutton9.function pushbutton9_Callback(hObject, eventdata, handles)% hObject handle to pushbutton9 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)x=handles.y;fs=handles.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(handles.axes13,x)title(handles.axes13,'shiyutu');ysize=size(x);y=fft(x,length(x));ysize=size(y);plot(handles.axes14,abs(y(1:ysize/2)));xlabel(handles.axes14,'pinlv');ylabel(handles.axes14,'fudu');title(handles.axes14,'pinlvtexing');sound(x,M);4.4.12“语速变慢”按钮(pushbutton14)% --- Executes on button press in pushbutton14.function pushbutton14_Callback(hObject, eventdata, handles)% hObject handle to pushbutton14 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)FL=80;WL=240;P =10;s=handles.y;fs=handles.Fs;s=s/max(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);last_syn_v=0;zi_syn_v=zeros(P,1);hw=hamming(WL);for n=3:FNs_w=s(n*FL-WL+1:n*FL).*hw;[A E]=lpc(s_w, P);s_f=s((n-1)*FL+1:n*FL);[exc1,zi_pre]=filter(A,1,s_f,zi_pre);exc((n-1)*FL+1:n*FL)=exc1;[s_rec1,zi_rec]=filter(1,A,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-last_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-last_syn_v+1:n*FL_v-last_syn_v); [s_syn1_v,zi_syn_v]=filter(1,A,exc_syn1_v,zi_syn_v);last_syn_v=last_syn_v+PT*floor((n*FL_v-last_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;endplot(handles.axes9,s_syn_v)title(handles.axes9,'shiyutu');ysize=size(s_syn_v);y=fft(s_syn_v,length(s_syn_v));ysize=size(y);plot(handles.axes10,abs(y(1:ysize/2)));xlabel(handles.axes10,'pinlv');ylabel(handles.axes10,'fudu');title(handles.axes10,'pinlvtexing');sound(s_syn_v);4.4.13“语速变快”按钮(pushbutton8)% --- Executes on button press in pushbutton8.function pushbutton8_Callback(hObject, eventdata, handles)% hObject handle to pushbutton8 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)FL=80;WL=240;P =10;s=handles.y;fs=handles.Fs;s=s/max(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);last_syn_v=0;zi_syn_v=zeros(P,1);hw=hamming(WL);for n=3:FNs_w=s(n*FL-WL+1:n*FL).*hw;[A E]=lpc(s_w, P);s_f=s((n-1)*FL+1:n*FL);[exc1,zi_pre]=filter(A,1,s_f,zi_pre);exc((n-1)*FL+1:n*FL)=exc1;[s_rec1,zi_rec]=filter(1,A,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-last_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-last_syn_v+1:n*FL_v-last_syn_v); [s_syn1_v,zi_syn_v]=filter(1,A,exc_syn1_v,zi_syn_v);last_syn_v=last_syn_v+PT*floor((n*FL_v-last_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;endplot(handles.axes11,s_syn_v)title(handles.axes11,'shiyutu');ysize=size(s_syn_v);y=fft(s_syn_v,length(s_syn_v));ysize=size(y);plot(handles.axes12,abs(y(1:ysize/2)));xlabel(handles.axes12,'pinlv');ylabel(handles.axes12,'fudu');title(handles.axes12,'pinlvtexing');sound(s_syn_v);第4章分析总结在实验中,用短时自相关法及LPC倒谱分析方法提取语音参数,用线性预测合成语音能够实现由男声到女声的变换。

相关主题