课程设计报告课程名称语音信号处理课程设计基于语音的性别判别系统设计与开发指导教师起止日期2016-5-16至2016-6-19系别信息与通信工程专业电子信息工程班级/学号学生姓名成绩_______________________指导教师签字___________________2摘要本文通过对男性和女性声音的语音特征的研究,发现男女声的基音频率存在较大的差异,并设计了基于基音频率分析的男女声识别系统。本题目要求设计一个系统,可以自动判断输入的语音信号源,是男性声音还是女性声音,其理论依据是男性和女性的基音频率存在着明显的差异,人类的基音频率范围约为60Hz~450Hz,男性的声音基音频率大约在60HZ-200HZ之间,女性声音基音频率大约在200HZ~450HZ之间,因此根据语音的基音频率可以判别说话人的性别。关键字:基音频率,313级“语音信号处理课程设计”任务书题目2基于语音的性别判别系统设计与开发主要内容编程实现基于语音的性别判别系统,可以实时判别说话人是男生还是女生。设计要求1.编程实现语音的分帧。2.编程实现语音基音周期的计算。3.根据男女基音频率的不同,设计一种算法,分辨男女。4.编程实现基于语音的性别判别系统。5.对说话人实时进行判别6.准确率应不低于80%。主要仪器设备计算机1台,安装MATLAB软件及cooledit录音软件主要参考文献数字语音处理及MATLAB仿真[M].北京:电子工业出版社,2010.课程设计进度计划(起止时间、工作内容)本课程设计共安排3个题目,这是其中题目之一。具体进度如下:6学时复习题目相关知识,掌握实现的原理;16学时用MATLAB语言实现题目要求;6学时进一步完善功能,现场检查、答辩;4学时完成课程设计报告。课程设计开始日期2016.5.16课程设计完成日期2015.6.19课程设计实验室名称电子信息技术实验室地点实验楼3-501,507资料下载地址4一、实验原理及步骤1、语音信号进行加窗分帧处理,语音信号具有短时平稳性(10--30ms内可以认为语音信号近似不变),、这样就可以把语音信号分为一些短段来来进行处理,这就是分帧,语音信号的分帧是采用可移动的有限长度的窗口进行加权的方法来实现的。一般每秒的帧数约为33~100帧,视情况而定。一般的分帧方法为交叠分段的方法,前一帧和后一帧的交叠部分称为帧移,帧移与帧长的比值一般为0~0.5,。汉明窗函数如下:2、短时自相关函数法基音检测的主要原理是利用短时自相关函数的第二条性质,通过比较原始信号和它移位后的信号之间的类似性来确定基音周期。3、语音线性预测的基本思想是:一个语音信号的抽样值可以用过去若干个取样值的线性组合来逼近。通过使实际语音抽样值与线性预测抽样值的均方误差达到最小,可以确定唯一的一组线性预测系数。采用线性预测分析不仅能够得到语音信号的预测波形,而且能够提供一个非常好的声道模型。如果将语音模型看作激励源通过一个线性时不变系统产生的输出,那么可以利用LPC分析对声道参数进行估值,以少量低信息率的时变参数精确地描述语音波形及其频谱的性质。此外,LPC分析还能够对共振峰、功率谱等语音参数进行精确估计,LPC分析得到的参数可以作为语音识别的重要参数之一。清音和浊音的判断。在语音信号处理中,有声段的清/浊音判决是语音信号预处理的一个重要环节,其判决的复杂和准确度对后续的语音处理有很大影响。能否准确地对语音信号进行清/浊音判决,决定着后续工作能否顺利进行。在信号处理中,语音按其激励形式的不同可分为2类:(1)浊音当气流通过声门时,如果声带的张力刚好使声带发生张弛振荡式的振荡,产生一股准周期的气流,这一气流激励声道就产生了浊音。这种语音信号是1种激励信号,它是由规则的全程激励产生的,其时域波形具有准周期性,语音频率集中在比较低的频率范围内,短时能量较高,由于语音信号中的高频成分有高的过零率而低频有低的过5零率,因此浊音的过零率低。通常,浊音信号可以由周期激励通过线性滤波器合成。(2)清音当气流通过声门时,如果声带不振动,而在某处收缩,迫使气流高速通过这一收缩部分而产生湍流,就得到清音。清音是由不规则的激励产生的,发清音时声带不振动,其时域波形不具有周期性,自相关函数没有很强的自相关周期峰,其语音频率集中在较高的范围内,短时能量较低,因而过零率较高。通常,清音信号可由白噪声通过线性滤波器合成。浊音信号的周期称为基音周期,它是声带振动频率的倒数,基音周期的估计称为基音检测。基音检测是语音处理中的一项重要技术,它在有调语音辨意、低速率语音编码、说话人识别等方面起着非常关键的作用。但在实现过程中,由于声门激励波形不是一个完全的周期脉冲串,再加上声道影响去除不易、基音周期定位困难、背景噪声影响强烈等一系列因素,基音检测面临着很大的困难。现在已有很多性能优越的基音检测算法,自相关基因检测算法就是一种基于语音时域分析理论较好的算法。基因周期作为语音信号处理中描述激励源的重要参数之一,在语音合成、语音压缩编码、语音识别和说话人确认等领域都有着广泛而重要的问题,尤其对汉语更是如此。汉语是一种有调语言,而基因周期的变化称为声调,声调对于汉语语音的理解极为重要。因为在汉语的相互交谈中,不但要凭借不同的元音、辅音来辨别这些字词的意义,还需要从不同的声调来区别它,也就是说声调具有辨义作用;另外,汉语中存在着多音字现象,同一个字的不同的语气或不同的词义下具有不同的声调。因此准确可靠地进行基音检测对汉语语音信号的处理显得尤为重要。5、基音频率的判断和语音信号的鉴别。首先基因频率的判断可以利用时域分析(短时能量、短时自相关)方法的特征或某几个特征的结合,判定某一语音有效的清音和浊音段;其次,针对浊音段,可直接利用短时自相关函数估计基音频率,方法是:估算浊音段第一最大峰值的位置,再利用抽样率计算基音频率,例如:如果说某一语音浊音段的第一最大峰值约为35个抽样点,设抽样频率为8kHz,则基音频率为8000/35=228Hz。然后语音信号的鉴别,基音频率与个人声带的长短、薄厚、韧性、劲度和发音习惯等有关系,在很大程度上反应了个人的特征。在生活中,由于男性和女性的生理结构不同,通过耳朵就可以清楚地确定是男性声音还是女性声音,这是由于男性声音与女性声音体现出不同的听觉效果来判断的。本次实验的理论依据是男性和女性的基音频率存在着明显的差异,人类的基音频率范围约为60Hz~450Hz,6男性的声音基音频率大约在60HZ-200HZ之间,女性声音基音频率大约在200HZ~450HZ之间,因此根据语音的基音频率可以判别说话人的性别。7二、实验代码及注释%homework10.5:LPCclearall%清屏i=1;whilei%等待命令input('按回车键开始说话,注意说完请等6秒钟听结果');%程序中断,按回车键继续y=wavrecord(50000,8000,1);%录制音频,500000个点,采样频率8000Hz,单声道%sound(y);%y=y(16000:32000);%input('录音停止,按回车键听');%err=input('重录按1回车,确认按回车键');%[y,Fs,bits]=wavread('female');%读取语音文件%y=y(6500:8000);%n=1:10000;%y=sin(100*n)';%分帧%帧内遍历即遍历每一帧的160个采样点%帧外遍历即遍历整个语音段的L个帧frame=160;%每帧160点8L=round(length(y)/frame-0.5);%L为四舍五入计算的帧数。其中为了保证采集到的所有点都有效,将每帧的点数减小一个小于1的数以保证相除之后的结果大于实际值c=[];%设置一个空矩阵cn=1:frame;%每帧中从点1到点160w=0.54-0.46*cos(2*pi*n/frame);%对每一帧加hammingwingdowp=10;%定义要求线性预测系数10个(10阶线性预测)cof=[];%自定义空矩阵cofG=[];%自定义空矩阵Gwave=[];自定义空矩阵wavefori=1:L%定义循环,帧外遍历re=zeros(1,frame);%创建re为1行,160列(即一维)的全零矩阵s=y((i-1)*frame+1:i*frame);%求帧内每个点的幅值e(i)=sum(s.^2);%计算每一帧的能量eife(i)0.0%如果第i帧的能量小于0period(i)=0;%将数组period的第i个值赋0else%如果第i帧的能量不小于0%s=s.*w';%对语音序列加窗加权(本程序中不加权)%计算自相关序列(不加窗计算)fork=1:frame%定义循环,帧内遍历rss(k)=s(1:frame-k)'*s(1+k:frame);%求出帧内每一点的自相关值endwave=[waverss];%给空矩阵wave赋值为自相关序列9%求线性预测系数[a,g]=lpc(s,p);%用lpc函数对每帧内所有的点求10个线性预测系数(即10阶),并且赋值给矩阵[下一个预测值a,系数g]a=real(a);%取a的实数部分为新的aa=a(2:end);%a取从第2个开始到最后一个预测值为新的a序列(原值为1-10,预测值为2-11)cof=[cofa];%将所得的预测值a赋给矩阵cof(cof是预测值矩阵,是10阶线性预测得出的新的10个值)G=[Gg];%将所得的g值序列赋给矩阵G(G是线性预测系数矩阵)fork=1:pra(k)=a(1:p-k)*a(1+k:p)';%计算线性预测系数的自相关序列end%清音浊音判断fork=1:frame-pre(k)=ra(1:p)*rss(k:k+p-1)';%对两个自相关序列进行互相关优化endre0=re(1);%将re(1)的幅值赋给re0作为归一化标准max=0;period(i)=0;%max初值为0,样点数初值为0fork=8*2:8*15%假定在样点数16-120范围中寻找ifre(k)/re0max%如果幅度归一化结果大于010max=re(k)/re0;period(i)=k;%令max等于归一化结果,基音周期中样点数period(i)为kendendfork=8*3:8*15%样点24到120范围中ifrss(k)max%如果自相关值大于0max=rss(k);period(i)=k;%则自相关值赋给max,period(i)为基音周期中的样点数endendmax;ifmax0.25%如果max值小于0.25period(i)=0;%将period(i)赋值为0(舍掉,消除半频和倍频错误)endifperiod(i)==16%如果period(i)是16(即基音频率为500Hz以上的帧)period(i)=0;%将period(i)赋值为0(舍掉,非人声范围)endendendnonzero=0;%设置一个全1矩阵的大小为0,即浊音帧数初值为0fori=1:L%所有帧中ifperiod(i)~=0%如果一帧中period(i)的值不为0nonzero=nonzero+1;%即此帧为浊音,矩阵大小加1endendover200=0;%定义频率超过200Hz的帧数初值为0fori=1:L%所有帧中11ifperiod(i)~=0&period(i)40%如果基音周期中有样点,且样点数少于40个over200=over200+1;%频率超过200Hz的帧数加1endendratio=over200/nonzero%计算频率超过200Hz的帧数占浊音帧数的比值max=0.7;min=0.5;ifratio=max%如果比值大于等于最大值'你是女生'%输出'你是女生'[yfs]=wavread('resultfemale');%读取wav语音文件'resultfemale(或其他名称)'wavplay(y,fs)%播放该语音endifratio=min%其后同理'你是纯爷们儿'[yfs]=wavread('resultmale');wavpl