基于幅度调制的语音信号合成资料.docx
《基于幅度调制的语音信号合成资料.docx》由会员分享,可在线阅读,更多相关《基于幅度调制的语音信号合成资料.docx(26页珍藏版)》请在冰点文库上搜索。
![基于幅度调制的语音信号合成资料.docx](https://file1.bingdoc.com/fileroot1/2023-6/4/36c70a0f-9f11-4248-a56e-d2dc8185f427/36c70a0f-9f11-4248-a56e-d2dc8185f4271.gif)
基于幅度调制的语音信号合成资料
课程设计说明书
设计题目:
基于幅度调制的语音信号合成
专业:
电子信息工程
班级:
设计人:
学号:
山东科技大学
山东科技大学
课程设计任务书
电子信息工程专业
一、课程设计题目:
基于幅度调制的语音信号合成
二、设计原始资料:
MATLAB软件编程环境;PC机
三、设计应解决下列各主要问题:
1、选择合适的语音合成方法,并用MATLAB实现;
2、选择合适的方法对语音信号进行分析处理;
3、利用幅度调制法进行语音合成。
四、设计说明书应附有下列图纸:
五、命题发出日期:
2013-12-15设计应完成日期:
2013-12-27
设计指导教师(签章)
教研室主任(签章)
指导教师对课程设计的评语
指导教师(签章):
年月日
摘要
语音信号处理是一门比较实用的电子信息工程专业课程,而语音是人类获取信息的的重要来源和利用信息的重要手段。
通过语言相互传递信息是人类最重要的基本功能之一。
语音信号是一种非平稳的时变信号,它携带着各种信息。
在语音编码、语音合成、语音识别和语音增强等语音处理中无一例外需要提取语音中包含的各种信息。
Matlab是一个数据分析和处理功能十分强大的工程实用软件。
本文介绍了利用matlab软件实现驱动声卡采集语音信号和语音信号采集后的处理方法,并通过实例利用matlab分析了语音信号处理的过程,并最终得到合成的语音信号。
关键词:
语音信号处理语音合成MATLAB
目录
1绪论………………………………………………………………………5
2设计与实现……………………………………………………………6
2.1相关知识简介………………………………………………………6
2.2语音合成方法确定…………………………………………………8
2.2.1LPC线性预测参数法……………………………………………8
2.2.2振幅调制法………………………………………………………10
2.3语音合成步骤………………………………………………………11
2.3.1男声处理…………………………………………………………11
2.3.2女声处理…………………………………………………………15
2.3.3声音调幅载波……………………………………………………19
3设计总结与心得体会……………………………………………………21
4附录…………………………………………………………………………22
4.1参考文献………………………………………………………………22
4.2程序代码………………………………………………………………23
1、绪论
语音信号处理是研究用数字信号处理技术和语音学知识对语音信号进行处理的新兴的学科,是目前发展最为迅速的信息科学研究领域的核心技术之一。
通过语音传递信息是人类最重要、最有效、最常用和最方便的交换信息形式。
同时,语言也是人与机器之间进行通信的重要工具,它是一种理想的人机通信方式,因而可为信息处理系统建立良好的人机交互环境,进一步推动计算机和其他智能机器的应用,提高社会的信息化程度。
语音合成技术和语音识别是实现人机语音通信,建立一个有听和讲能力的语音系统所必需的两项关键技术。
使电脑具有类似于人一样的说话和听懂人说话的能力,是90年代信息产业的重要竞争市场。
和语言识别相比,语言合成的技术相对说来要成熟一些,是该领域中近期最有希望产生突破并形成产业化的一项技术。
综观语言合成技术的研究,语音合成发展方向为:
1.、提高合成语音的自然度;2、丰富合成语音的表现力;3、降低语音合成技术的复杂度;4、多语种文语合成等,认真学习并研究语音信号的合成技术,对于我们开拓知识,提高能力,以及在后续课程的学习具有重要的意义。
2、设计与实现
2.1相关知识简介
人发声的声波区间:
男80Hz--500Hz;女100Hz--1KHz,针对男女声音频率的不同,可以在频域上进行一些处理;
共振峰:
是指在声音的频谱中能量相对集中的一些区域,共振峰是音质的决定因素。
因此可以通过此特点来提取声音的一些特性;
数字滤波器设计原理:
数字滤波是数字信号分析中最重要的组成部分之一,与模拟滤波相比,它具有精度和稳定性高、系统函数容易改变、灵活性强、便于大规模集成和可实现多维滤波等优点。
在信号的过滤、检测和参数的估计等方面,经典数字滤波器是使用最广泛的一种线性系统。
数字滤波器的作用是利用离散时间系统的特性对输入信号波形(或频谱)进行加工处理,或者说利用数字方法按预定的要求对信号进行变换。
FFT:
离散傅立叶变换的快速算法,可以将一个时域信号变换到频域来处理。
比如:
x=sin(2*pi*50*t)+sin(2*pi*100*t)+sin(2*pi*700*t)的图像与频谱如下,可以很直观的看到x的频率集中在50,100,700处。
分帧处理:
语音信号可以认为是短时平稳的。
在5~50ms的范围内,语音频谱特性和一些物理特性参数基本保持不变。
我们将每个短时的语音称为一个分析帧。
一般帧长取10~30ms。
可以看出分帧后一帧声音信号具有明显的周期性。
窗函数:
加窗函数来减小数据采样时带来的谱间泄漏。
Hanning窗在大多数场合很有效,它具有良好的频率分辨率,并降低了频率泄漏。
分帧时配合使用Hanning窗可以很好的对信号去噪,提取包络等处理。
MATLAB音频文件相关函数:
wavrecord(fs*t,fs):
以fs为采样率录音,录音时长为t;
wavwrite(y,fs,16,'luyin.wav'):
将luyin文件储存;
wavread('yuyin.wav'):
读取yuyin文件;
sound(a*y,b*fs):
以a倍振幅,b倍频率试听y文件。
2.2语音合成方法确定
2.2.1LPC线性预测参数法
1.语音生成模型
通过对声管的研究,发现它可以用一个N阶全极点滤波器表述,即:
对于典型的男声,N=10,所有的极点
要分别构成共轭对以保证
系数都是实数。
就可以得到产生语音信号的离散语音模型,如图所示:
假设激励信号用e(n)表示,语音信号用s(n)表示,根据全极点模型表达式,有:
从而可以用声管模型对激励信号进行滤波得到语音信号。
2.语音预测模型
假设已经知道了系数{ai},那么生成模型的输入和输出对换,就构成了语音的预测模型,即语音信号s(n)送入预测滤波器,得到预测残差e(n)
发端需要把误差e(n)传到收端,收端可以用e(n)作为上述差分方程的激励得到重建语音。
在发端,语音s(n)是滤波器的输入,而误差e(n)是输出。
系数{ai}也需要从发端传到收端,但因为语音具有短时平稳性,即在短时间内(比如10ms),系数{ai}可以认为不发生变化,所以也不必太频繁地传输,同时采用预测技术后,可以大幅度地降低语音的带宽。
这种通过现行预测方法压缩语音数据量的技术称为线性预测编码。
3.语音重建模型
如果知道激励信号x(n)和滤波器系数{ai},就可以利用激励生成重建语音了和语音生成模型的公式完全相同
但这个模型被称为语音重建模型,为了同生成模型区分开,
称为重建语音,如果x(n)正好等于e(n),那么重建语音就会和原始语音s(n)完全相同。
语音的非平稳性(虽然短时平稳)导致预测系数{ai}是时变的,一般每10~20ms就会发生一些变化以产生不同的音节。
在这种情况下,滤波过程也要分段进行,即每次用不同的滤波器系数,但相邻两次滤波必须要保持滤波器的状态不发生变化。
4.分析与合成语音
首先,抽样的语音信号被分成10ms长的段;然后,对每段数据进行统计分析,计算相邻样点的相关性并最终得到最佳预测系数。
合成过程就是利用这些预测系数,以及周期的单位样值序列作为输入,依次得到每段合成语音。
通过以上理论分析发现,LPC线性预测参数法的特点:
虽然原理清晰,调节灵活,但实现过程较复杂,步骤较多,同时得到的音质较差。
因此我们采取下一种方法:
振幅调制法。
振幅调制法相比于LPC线性预测参数法较易实现。
2.2.2振幅调制法
振幅调制法相比于LPC线性预测参数法较简单,易于实现,同时步骤较少,因此可以减少积累误差。
振幅调制法的原理如下:
男声信号输入
女声信号输入
时频域分析处理
时频域分析处理
提取包络
提取音色频率
振幅调制
得到合成声音
时频域分析处理
下面具体介绍振幅调制法的具体过程以及如何用MATLAB实现,同时将设计过程及其中遇到的问题和解决办法列写出来。
2.3语音合成步骤
2.3.1男声处理
男声信号最关键的操作是提取频谱包络。
语音包络携带了语音信号的语义和个性化信息,准确提取频谱包络是语音分析的一项重要任务。
在许多科学领域的信号处理中,都需要提取信号的包络信息,因此现在有许多成熟的信号包络提取方法。
目前最常用的方法就是希尔伯特变换。
同时近年又兴起一种新的时频分析方法——小波变换,由于它具有良好的时频局部化特性和多尺度分析的功能,应用日益广泛。
利用小波变换(采用己调高斯小波)提取信号包络的效果比希尔伯特变换更好。
但是由于对于语音信号处理方面的知识储备不足,而且由于现在没有成型的小波变换模型供参考,因此本设计最终采用的是基于希尔伯特变换的包络提取。
同时在设计的过程中由于对包络的概念理解不清,也走了不少弯路,不过也取得了一些意外的效果。
在数学与信号处理的领域中,一个实值函数的希尔伯特变换是将信号s(t)与1/(πt)做卷积,以得到s'(t)。
因此,希尔伯特变换结果s'(t)可以被解读为输入是s(t)的线性时不变系统的输出,而此系统的脉冲响应为1/(πt)。
这是一项有用的数学工具,用在描述一个以实数值载波做调制的信号之复数包络,出现在通讯理论中发挥着重要作用。
希尔伯特变换的数学表达式:
s'(t)=H(s)=s(n)h(t-n)dn=(1/π))(s(n)/(t-n))dn
其中h(t)=1/(πt)
Hilbert变换具有两个性质:
性质1序列x(n)通过Hilbert变换器后,信号频谱的幅度不发生变化,这是因为Hilbert变换器是全通滤波器,引起频谱变化的只是其相位。
性质2序列x(n与其Hilbert变换是正交的。
MATLAB提供了计算Hilbert变换的函数,其格式为y=Hilbert(x)。
但需注意的是,该函数计算出的结果是序列的解析信号,其虚部才是序列的Hilbert变换。
我们首先对采集到的语音信号进行预处理,截取片段,滤除其中的噪声。
对采集语音信号分析其频谱后,发现其含有一定的高频噪声,因此决定设计一个低通滤波器对其进行滤波。
设计的低通滤波器(设计为子程序)如下:
对采集到的信号选取的参数为:
通带频率:
400Hz。
阻带频率:
420Hz。
试听有较好的效果。
处理过程及结果如下:
其次我们对信号进行分帧处理。
由于语音信号的短时平稳特性,可以将平稳过程的处理方法和理论引入到语音信号的短时处理中,将语音信号划分为很多短时的语音段,每个短时的语音段称为一个分析帧。
这样,对一帧语音信号进行处理就相当于对特征固定的持续信号进行处理。
在处理时,按帧取数据,处理完后再取下一帧。
前一帧和后一帧的交叠部分称为帧移。
帧移与帧长的比值一般取为0.2~0.5。
设计的分帧算法如下,考虑到调试方便特设计为子函数的形式,方便调用调试:
然后我们就可以按帧对信号进行处理,通过不断的尝试调试,最终发现最优的处理方法为:
1、每一帧进行加窗处理(Hanning窗);2、对每一帧进行希尔伯特变换;3、帧合并;4、从中抽取出处理后的语音信号。
至此,男声语音包络提取完毕。
波形图如下:
2.3.2女声处理
对于女声,我们主要想提取其音色及频率,然后用其与男声的包络进行幅度调制。
但是最终的提取效果总是不是太好,尝试了很多种办法,都不能达到理想的效果。
因此最终决定直接用女声信号来调制男声信号,发现总体能取得较能接受的效果。
虽然效果不佳,但是在整个过程中收货颇多。
下面将所进行的尝试过程列写下来,总结原因,希望以后有机会还能再进一步进行优化处理。
首先分析人的发音特性。
众所周知,一切物体发声的原理都是振动出声,由空气传出,那在物体振动的时候出来的频率都是一个波形,这个波总可以分解为一系列不同频率正弦波的叠加,含一个基波和许多谐波,即内含各种频率成分,音色的不同,就是这些谐波的含量都不相同。
因此我们可以根据这个特性来提取这些谐波成分,然后加到男声包络上,可能会有不错的结果。
通过上面这两张图片可以看出短时内的基波谐波分布,并呈现出周期特性。
并可以看到短时内声音主要频率都是集中分布的,因此我们可以用一个带阻滤波器来把“基波”滤除掉,然后依次把得到的“谐波”加到包络上。
方法如下:
设计的带阻滤波器子函数:
处理前声音特效:
处理后声音特效:
对比发现差别不是很明显,并未达到预期的效果。
而且加载到男声的包络上后并没有明显的效果。
原因可能是滤波器的选取不合适。
这里用的是切比雪夫型滤波器。
带阻滤波器的设计及参数选择都是一个不好把握的问题。
用FIR滤波器还是IIR滤波器;用椭圆滤波器还是切比雪夫型滤波器还是其他类型滤波器;脉冲响应不变法以及双线性变换法的在使用中区别;是否进行加窗处理;参数选取多少合适等等一系列问题待解决。
因此最终没有达到较好的效果。
但是在处理这些问题的过程中,真正把数字信号处理课程中的内容做到学以致用。
最后决定对女声信号不进行音色提取处理,直接加载到包络上,最终得到的结果可以接受。
最终女声处理素材如下:
截取李娜的《青藏高原》的高潮部分,并进行相应的低通滤波去噪处理。
可见声音频率集中在1500Hz以上,不愧为“华语第一女高音”,李娜的声音已经可以在三个八度的音域内自由驰骋,她的歌唱技艺已达到了一种自由王国的境界。
特怀着崇拜的心情来对这段语音信号进行处理。
2.3.3声音调幅载波
信号调制:
信号调制主要有三种基本调制方法,分别为幅度调制(AM),频率调制(FM)和相位调制(PM)。
信号调制原理是将低频信号加载到高频载波信号的过程,或者说把信息加载到信息载体上以便传输的处理过程,称为调制。
所谓“加载”,其实质是使高频载波信号(信息载体)的某个特性参数随信息信号幅值的大小程线性变化。
基于调幅调制的语音信号合成是以男生信号作为调制信号,女生信号为载波信号来合成一种以女生语音信号声色表述男生语音内容的新信号。
这种调制方式是用传递的低频信号去控制作为传送载体的高频振荡波的幅度,是已调波的幅度随调制信号的大小线性变化,而保持载波的角频率不变。
本设计采用的是幅度调制的方法,用采集到的男生信号去对女生信号进行幅度调制,实现语音合成的目的。
幅度调制的原理如下(以正弦信号为例):
有了以上的例子我们就可以对男女声信号进行调制了,实现过程如下:
可见合成信号的时域波形与男声的时域波形较为相像,频率与女生信号的相差无几,合成信号的特征取得较满意的效果。
3、设计总结与心得体会
在这两个周的课程设计中,我学到了很多平常在书本上学不到的东西,比如未曾接触过得语音信号的处理以及MATLAB软件的大规模应用,这让我收获颇多。
同时设计过程中遇到许多问题,有的已经解决,有的还待优化。
同时,我们通过向老师请教,查阅大量资料,与同学激烈探讨,将本来不懂的设计课题变为了一个个明确编程任务,分工合作,最终完成了本次课程设计。
由于时间和知识水平的限制,虽然课程已经完毕,但我们的设计还是存在很多不足,比如设计方法还有很多没尝试,具体步骤还能优化等等。
设计中遇到很多问题,和别的课题的同学交流获得了巨大的收获,这在以前的设计中是没有的,因此增加了以后处理大课题的信心。
4、附录
4.1参考文献
[1]高西全《数字信号处理(第三版)》西安电子科技大学出版社
[2]陈怀琛《MATLAB及在电子信息课程中的应用(第三版)》电子工业出版社
[3]王卫东《高频电子电路(第2版)》电子工业出版社
[4]韩纪庆《语音信号处理(第2版)》清华大学出版社
[5]《语音信号的合成及其matlab_GUI实现》燕山大学课程设计
[6]王猛《基于分帧平稳小波变换的语音干扰效果定量评估》《电子对抗》2008年第3期
[7]张绪省《信号包络提取方法--从希尔伯特变换到小波变换》《电子科学学刊》1997年第1期
4.2程序代码
男声信号录入及滤波程序:
clc;closeall;clearall;
yy=wavrecord(44100*6,44100);
wavwrite(yy,44100,16,'luyin.wav');
[x,fs]=wavread('luyin.wav');
x=x(1:
90000);%片段截取
figure;
subplot(411)
plot(x);
title('原始信号')
sound(x,fs);
y=fft(x);
y=y(1:
1000);
subplot(412);
plot(abs(y));
title('原始信号的频谱')
a=lvbo(180,220,fs,x);%低通滤波器参数选择
a=a(3639:
93638);%片段截取,消除位移
subplot(413)
plot(a);
title('低通滤除噪声后的信号')
y=fft(a);
y=y(1:
1000);
subplot(414);
plot(abs(y));
title('低通滤除噪声后的频谱')
sound(10*a,fs);
wavwrite(a,44100,16,'LPFlvbo.wav');
男声包络提取程序:
clc;closeall;clearall;
%yy=wavrecord(44100*6,44100);
%wavwrite(yy,44100,16,'luyin.wav');
%[hc,fs]=wavread('luyin.wav');
hc=wavread('LPFlvbo.wav');
hc=hc(1:
90000);
fs=44100;
t=0:
1/fs:
(length(hc)-1)/fs;
figure
(1)
subplot(211)
plot(hc);
title('纯语音波形');
%------进行分帧,加窗处理
framelength=256;%窗长
framemove=80;%帧移
y_frame=fenzhen(hc,framelength,framemove,90000);
subplot(212)
plot(y_frame);
title('对纯语音分帧看结果');
%求帧数,size返回矩阵的行数和列数
nf=size(y_frame,1);
w=hamming(framelength)';%汉明窗
y_window=[];%忽略第一个
fork=1:
nf
y_row=y_frame(k,:
).*w;%加汉明窗
y_row=hilbert(y_row);%对每一帧进行希尔伯特变换取包络
y_row=(abs(y_row));
y_window=[y_window;y_row];
end
figure
subplot(411)
plot(w);
title('窗函数');
subplot(412)
plot(y_window);
axis([030001])
title('对每帧加窗看结果');
%----谱减系数设定及噪声谱估计
a=2;b=1;%2<=a<=4,1<=b<=7是系数的可调范围a=2,b=1时是基本谱减法
n_noise=10;%取前十帧语音作为背景噪声
y_noise=mean(y_window(1:
10,:
));
noise_amplitude=abs(fft(y_noise))';%噪声的谱估计
y_fft=fft(y_window');
y_amplitude=abs(y_fft);%fft后y的幅度
y_angle=angle(y_fft);%fft后y的相位
%figure
subplot(413)
plot(y_amplitude);
title('窗的幅度');
subplot(414)
plot(y_angle);
title('窗的相位');
%谱减过程
y_enhanced_amplitude=[];
fork=1:
nf
y_temp=y_amplitude(:
k).^a-b*noise_amplitude.^a;%谱相减
y_temp0=y_temp.^(1/a);
y_enhanced_amplitude=[y_enhanced_amplitudey_temp];%得到处理后的幅度矩阵
end
y_enhanced_fft=y_enhanced_amplitude.*exp(i*y_angle);%恢复原来的相位
y_enhanced=real(ifft(y_enhanced_fft)');%fft反变换求得增强后的分帧语音,取的是实部
y_output=[];
fork=1:
nf-1
y_output=[y_outputy_enhanced(k,1:
80)];%从增强后的分帧语音中抽取出最终的语音序列
end
y_output=[y_outputy_enhanced(k,:
)];
figure
subplot(211)
plot(hc);
title('纯语音波形');
subplot(212)
plot(y_output);
title('分帧处理后的包络');%-----做出处理前后图形,给出直观对比
sound(hc,fs)
sound(y_output,fs)
wavwrite(y_output,44100,16,'y_output.wav');
声音合成程序:
clc;closeall;clearall;
[y,fs]=wavread('y_output.wav');
sound(y,fs);
y=lvbo(180,220,fs,y);
y=y(1:
80000);
figure
subplot(211);
plot(1:
length(y),y);
title('男生信号包络');
%%%%%%%%%%%%%%%%%%%%%%
[g,fs]=wavread('青藏高原');
fs
subplot(212);
g1=g(1:
80000);%截取片段xxx1:
90000
plot(g1);
title('女声信号片段');
g1=g1'
%%%%%%%%%%%%%%%%%%%%%
z1=g1.*y;
fori=1:
80000;
z(i)=4*z1(i);%增大幅度
end
figure
a=fft(z