语音性别识别课设报告.docx
- 文档编号:3799663
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:25
- 大小:89.70KB
语音性别识别课设报告.docx
《语音性别识别课设报告.docx》由会员分享,可在线阅读,更多相关《语音性别识别课设报告.docx(25页珍藏版)》请在冰豆网上搜索。
语音性别识别课设报告
课程设计报告
课程名称______语音信号处理课程设计
题目_____基于语音的性别判别系统设计与开发
指导教师________________________________________
设计起止日期___2017-5-16至2017-6-4__
系别_____通信工程学院___
专业______电子信息工程_________
学生姓名_________
班级/学号_____
成绩_______________________________________
14级“语音信号处理课程设计”任务书
题目2
基于语音的性别判别系统设计与开发
主要
内容
编程实现基于语音的性别判别系统,可以实时判别说话人是男生还是女生。
设计
要求
1.编程实现语音的分帧。
2.编程实现语音基音周期的计算。
3.根据男女基音频率的不同,设计一种算法,分辨男女。
4.编程实现基于语音的性别判别系统。
5.对说话人实时进行判别
6.准确率应不低于80%。
主要
仪器
设备
计算机1台,安装MATLAB软件及cooledit录音软件
主要
参考
文献
数字语音处理及MATLAB仿真[M].北京:
电子工业出版社,2010.
课程设计进度计划(起止时间、工作内容)
本课程设计共安排3个题目,这是其中题目之一。
具体进度如下:
6学时复习题目相关知识,掌握实现的原理;
16学时用MATLAB语言实现题目要求;
6学时进一步完善功能,现场检查、答辩;
4学时完成课程设计报告。
课程设计开始日期
2017.5.16
课程设计完成日期
2017.6.19
课程设计实验室名称
电子信息技术实验室
地点
实验楼3-501,507
资料下载地址
摘要
本文通过对男性和女性声音的语音特征的研究,发现男女声的基音频率存在较大的差异,并设计了基于基音频率分析的男女声识别系统。
本题目要求设计一个系统,可以自动判断输入的语音信号源,是男性声音还是女性声音,其理论依据是男性和女性的基音频率存在着明显的差异,人类的基音频率范围约为60Hz~450Hz,男性的声音基音频率大约在60HZ-200HZ之间,女性声音基音频率大约在200HZ~450HZ之间,因此根据语音的基音频率可以判别说话人的性别。
关键字:
基音频率
一、实验原理及步骤
1、语音信号进行分帧处理
语音信号具有短时平稳性(10--30ms内可以认为语音信号近似不变),、这样就可以把语音信号分为一些短段来来进行处理,这就是分帧,语音信号的分帧是采用可移动的有限长度的窗口进行加权的方法来实现的。
一般每秒的帧数约为33~100帧,视情况而定。
2、幅度差平方和函数
SMDSF定义为
D2(τ)=
其中:
sw1(j)=s(j)w1(j),sw2(j)=s(j)w2(j),τ=0,1,⋯,L-1。
窗函数为w1(j)=
.和w2(j)=
利用SMDSF只能提取出时间短于窗长L的基音周期,即SMDSF的窗长L需要大于可能出现的最长基音周期的时间,一般取值大于25ms。
注意当τ等于基音周期P时,函数值和信号中非周期成分的能量是成一定比例,如果信号是准确的周期信号,则D2(P)=0。
SMDSF不同Σ处的函数值,都计算了L个差值的平方和,这一点与CAMDF是一致的对于最小周期为P的严格周期信号有D2(mP)=D2(nP),其中m、n是正整数。
3.归一化幅度差平方和函数
对SMDSF归一化是十分必要的,目标是使其函数取值能评价语音信号非周期性的程度,以便在后处理中使用。
归一化SMDSF定义为
D2norm(τ)=D2(τ)L/
τ=0,⋯,L-1.如果信号是准周期的,其基音周期是P,D2(τ)与信号中非周期性成分能量成比例,而
)/L与信号总能量成比例。
因此,D2norm(τ)的值体现信号中非周期成分能量与信号总能量的比例。
信号周期性越差,D2norm(τ)越大;信号周期性越好,D2norm(τ)越小;严格周期信号D2norm(τ)=0,因此D2norm(τ)可作为信号非周期性的度量。
此外,可以通过D2norm(τ)进行清浊音判定,一般情况下小于0.5的是浊音,大于0.5的是清音或其他随机噪音。
后面的实验均使用0.5作为阈值
4、程序设计的基本思想:
先进行分帧处理,然后对语音信号的每一帧求幅度差平方和函数,同时求出归一化的幅度差平方和函数。
根据归一化幅度差平方和函数的数值进行清浊音的判定一般情况下小于0.5的是浊音,大于0.5的是清音或其他随机噪音。
本次课设采用0.5作为阈值,将清音和噪音部分置零使其不影响后面波谷点的提取。
然后提取波谷点,如果没有波谷点则将这一帧抛弃,有波谷点则将16(50Hz)——160(500Hz)之间的点作为基音周期的候选点。
由于D2(mP)=D2(nP),所以将各个候选周期与后面的波谷点求商,取最靠近整数的点作为这一帧的候选基音周期,如果仅有两个候选点则看这两点是否为倍数关系,若是则选为这一帧的基音周期,若不是则抛弃。
求出所有的基音周期后有两种判断方法一是求均值然后与判决门限进行比较,判断是男是女。
二是求出大于200Hz所占的总比重然后与判决门限进行比较,判断是男是女。
5、基音频率的判断和语音信号的鉴别。
首先基因频率的判断可以利用时域分析(短时能量、短时自相关)方法的特征或某几个特征的结合,判定某一语音有效的清音和浊音段;其次,针对浊音段,可直接利用短时自相关函数估计基音频率,方法是:
估算浊音段第一最大峰值的位置,再利用抽样率计算基音频率,例如:
如果说某一语音浊音段的第一最大峰值约为35个抽样点,设抽样频率为8kHz,则基音频率为8000/35=228Hz。
也可以用平均幅度差函数,方法是估算浊音段第一最低波谷的位置,再利用抽样率计算基音频率,例如:
如果说某一语音浊音段的第一最低波谷值约为35个抽样点,设抽样频率为8kHz,则基音频率为8000/35=228Hz。
然后语音信号的鉴别,基音频率与个人声带的长短、薄厚、韧性、劲度和发音习惯等有关系,在很大程度上反应了个人的特征。
在生活中,由于男性和女性的生理结构不同,通过耳朵就可以清楚地确定是男性声音还是女性声音,这是由于男性声音与女性声音体现出不同的听觉效果来判断的。
本次实验的理论依据是男性和女性的基音频率存在着明显的差异,人类的基音频率范围约为60Hz~450Hz,男性的声音基音频率大约在60HZ-200HZ之间,女性声音基音频率大约在200HZ~450HZ之间,因此根据语音的基音频率可以判别说话人的性别。
二、设计过程和波形
1.首先我们输入语音
clc,closeall,clearall%清屏
i=1;
whilei%等待命令
input('按回车键开始说话,注意说完请等6秒钟听结果');%程序中断,按回车键继续
y=wavrecord(50000,8000,1);%录制音频,50000个点,采样频率8000Hz,单声道
figure
(1);plot(y);xlabel('语音信号的幅度特性曲线');%输出语音信号的幅度响应图
Q=fft(y);
figure
(2);plot(abs(Q));xlabel('语音信号的幅频响应');%输出语音信号的幅频响应图
图2.1语音信号的幅度特性曲线
图2.2语音信号的幅频响应
2.分帧对每一帧求幅度差平方和并归一化
space=400;
N=round(length(y1)/space-0.5);%计算帧数
l=0;%计算大于260Hz的帧数
h=0;
e=0;%小于500HZ的浊音帧数
fori=1:
N
s=y1((i-1)*320+1:
(i*320));%选择一帧
x=SMDSF(s);%求幅度差平方和函数
c=nomSMDSF(x);%求归一化幅度平方和函数
a=[];%用于存储各个候选周期与后面的波谷点的商值
IndMin1=[];%用于存储大于50Hz小于500Hz的候选基因周期
%将清音和噪音部分置零使其不影响后面波谷点的提取
fori1=1:
length(x)
ifc(i1)>=0.5
x1(i1)=0;
else
x1(i1)=x(i1);
end
end
3.选出候选基音周期
IndMin=find(diff(sign(diff(x1)))>0)+1;%寻找波谷点
[m,n]=size(IndMin);
%存储大于50Hz小于500Hz的候选基因周期
forj1=1:
n
ifIndMin(1,j1)>=16&&IndMin(1,j1)<=160
IndMin1(:
j1)=IndMin(1,j1);
else
IndMin(1,j1)=0;
end
end
IndMin1(find(IndMin1==0))=[];%删除0元素
IndMin(find(IndMin==0))=[];%删除0元素
if~isempty(IndMin)&&n>1%判断是否存在波谷点
k=behind(IndMin,160,16);%求出最靠近160的候选基音周期的个数
ifk~=1&&k~=0
%如果存在两个或两个以上的候选基音周期则求各个候选周期与后面的波谷点的商值
fori2=1:
k
ifk forj2=length(IndMin): -1: i2+1 if(IndMin(i2)>=16&&IndMin(i2)<=160)&&j2<=length(IndMin) a(i2,: )=double(IndMin(j2)/IndMin(i2)); end end elseif(k==length(IndMin))&&(length(IndMin)>2)%所有的波谷点均在50Hz——500Hz内 forj3=length(IndMin): -1: i2+1 if(IndMin(i2)>=16&&IndMin(i2)<=160)&&j3<=length(IndMin) a(i2,: )=double(IndMin(j3)/IndMin(i2)); end end else%仅有两个波谷点,取第一个为候选基音周期 ifIndMin (1)>=16||IndMin (1)<=160 q=IndMin (2)/IndMin (1); q1=round(q); ifabs(q-q1)==0 a(1,: )=IndMin (1); end end end end elseifk==1%仅有一个候选基音周期 ifn>2 forj4=length(IndMin): -1: 2 if(IndMin (1)>=16&&IndMin (1)<=160)&&j4<=length(IndMin) a(j4,: )=double(IndMin(j4)/IndMin (1)); end end else%没有候选基音周期 a=[]; end else a=[]; end if~isempty(a) b=round(a); [i5,j5]=size(a); fori6=1: i5%将为零的情况控制住 forj6=1: j5 ifa(i6,j6)==0 a(i6,j6)=0.9; b(i6,j6)=0; end end end abs1=abs(a-b);%求出和整数的差距 ifi5>=2%如果存在两个候选基音周期则将最靠近整数的一个作为本帧的基音周期 Y0=sort(abs1,2); Y1=Y0(: 1); [Y2,I2]=sort(Y1); g=(8000/IndMin1(I2 (1)));%计算对应的频率并存储 ifg<=500 e=e+1; h=h+g; end ifg>=260 l=l+1; end else%仅存在一个基音周期看是否严格成倍数,是则保留,不是则丢弃 forj7=1: j5 ifabs1(j7)==0 g=(8000/IndMin1 (1)); ifg<=500 e=e+1; h=h+g; end ifg>=260 l=l+1; end end end end else%不存在候选基音周期则丢弃此帧 g=0; h=h+g; e=e+0; l=l+0 end else%没有波谷点则为清音帧或噪声帧丢弃 g=0; h=h+g; e=e+0; l=l+0; end 4.输出结果 f=h/e; iff>200||l~=0 '你是女生'; end iff<200&&l=0 '你是男生'; end iff==200 '无法判断'; end i=input('重新识别按1回车,结束按回车'); end 实验结束。 图2.3男生测试结果 图2.4女生声音频谱 图2.5女生测试结果 三、课设感想 本次基于语音性别识别系统的课程设计,让我收获很多,学会了阅读文献,学会了调试,查错知道了科研项目的艰难但同时也极大地激发了我的兴趣,虽然这个程序判断的准确率不高并且极大地依赖于录音的质量,但也是我的一次冒险尝试,这次课设我做的很开心,这次我是真的学到了很多东西,我相信这些东西会帮助我在以后的学习中越走越远 四、小组分工 负责代码编写,参考文献查找,程序错误修改,报告制作。 负责AMDF法原理,程序测试,查询文件资料 参考文献 [1]数字语音处理及MATLAB仿真[M].北京: 电子工业出版社,2010. [2]韩纪庆,张磊.郑铁然.语音信号处理[M].北京: 清华大学出版社,2004.09.2—215 [3]王炳锡,屈丹,彭煊.实用语音识别基础[M].北京: 国防工业出版社,2005.1 [4]刘健,郑方,吴文虎.基于幅度差平方和函数的基音周期提取算法[J].清华大学学报,2006,46 (1): 74-77 附录: 1.Main1 clc,closeall,clearall%清屏 i=1; whilei%等待命令 input('按回车键开始说话,注意说完请等6秒钟听结果');%程序中断,按回车键继续 y=wavrecord(50000,8000,1);%录制音频,50000个点,采样频率8000Hz,单声道 figure (1);plot(y);xlabel('语音信号的幅度特性曲线');%输出语音信号的幅度响应图 Q=fft(y); figure (2);plot(abs(Q));xlabel('语音信号的幅频响应');%输出语音信号的幅频响应图 sound(y); y1=y(1: 40000)'; input('录音停止,按回车键进行下一步'); err=input('重录按1回车,确认按回车键'); %将语音信号分为段长为160样本的若干段 space=400; N=round(length(y1)/space-0.5);%计算帧数 h=0; e=0;%小于500HZ的浊音帧数 fori=1: N s=y1((i-1)*320+1: (i*320));%选择一帧 x=SMDSF(s);%求幅度差平方和函数 c=nomSMDSF(x);%求归一化幅度平方和函数 a=[];%用于存储各个候选周期与后面的波谷点的商值 IndMin1=[];%用于存储大于50Hz小于500Hz的候选基因周期 %将清音和噪音部分置零使其不影响后面波谷点的提取 fori1=1: length(x) ifc(i1)>=0.5 x1(i1)=0; else x1(i1)=x(i1); end end IndMin=find(diff(sign(diff(x1)))>0)+1;%寻找波谷点 [m,n]=size(IndMin); %存储大于50Hz小于500Hz的候选基因周期 forj1=1: n ifIndMin(1,j1)>=16&&IndMin(1,j1)<=160 IndMin1(: j1)=IndMin(1,j1); else IndMin(1,j1)=0; end end IndMin1(find(IndMin1==0))=[]; IndMin(find(IndMin==0))=[]; if~isempty(IndMin)&&n>1%判断是否存在波谷点 k=behind(IndMin,160,16);%求出最靠近160的候选基音周期的个数 ifk~=1&&k~=0 %如果存在两个或两个以上的候选基音周期则求各个候选周期与后面的波谷点的商值 fori2=1: k ifk forj2=length(IndMin): -1: i2+1 if(IndMin1(i2)>=16&&IndMin1(i2)<=160)&&j2<=length(IndMin) a(i2,: )=double(IndMin(j2)/IndMin1(i2)); end end elseif(k==length(IndMin))&&(length(IndMin)>2)%所有的波谷点均在50Hz——500Hz内 forj3=length(IndMin): -1: i2+1 if(IndMin1(i2)>=16&&IndMin1(i2)<=160)&&j3<=length(IndMin) a(i2,: )=double(IndMin(j3)/IndMin1(i2)); end end else%仅有两个波谷点,取第一个为候选基音周期 ifIndMin1 (1)>=16||IndMin1 (1)<=160 q=IndMin1 (2)/IndMin1 (1); q1=round(q); ifabs(q-q1)==0 a(1,: )=IndMin (1); end end end end elseifk==1%仅有一个候选基音周期 ifn>2 forj4=length(IndMin): -1: 2 if(IndMin1 (1)>=16&&IndMin1 (1)<=160)&&j4<=length(IndMin) a(j4,: )=double(IndMin(j4)/IndMin1 (1)); end end else%没有候选基音周期 a=[]; end else a=[]; end if~isempty(a) b=round(a); [i5,j5]=size(a); fori6=1: i5%将为零的情况控制住 forj6=1: j5 ifa(i6,j6)==0 a(i6,j6)=0.9; b(i6,j6)=0; end end end abs1=abs(a-b);%求出和整数的差距 ifi5>=2%如果存在两个候选基音周期则将最靠近整数的一个作为本帧的基音周期 Y0=sort(abs1,2); Y1=Y0(: 1); [Y2,I2]=sort(Y1); g=(8000/IndMin1(I2 (1)));%计算对应的频率并存储 ifg<=500 e=e+1; h=h+g; end ifg>=260 l=l+1; end else%仅存在一个基音周期看是否严格成倍数,是则保留,不是则丢弃 forj7=1: j5 ifabs1(j7)==0 g=(8000/IndMin1 (1)); ifg<=500 e=e+1; h=h+g; end ifg>=260 l=l+1; end end end end else%不存在候选基音周期则丢弃此帧 g=0; h=h+g; e=e+0; l=l+0; end else%没有波谷点则为清音帧或噪声帧丢弃 g=0; h=h+g; e=e+0; l=l+0; end end %输出结果 f=h/e; iff>200||l~=0 '你是女生'; end iff<200&&l==0 '你是男生'; end iff==200 '无法判断'; end i=input('重新识别按1回车,结束按回车'); end 2.Main2 clc,closeall,clearall%清屏 i=1; whilei%等待命令 input('按回车键开始说话,注意说完请等6秒钟听结果');%程序中断,按回车键继续 y=wavrecord(50000,8000,1);%录制音频,50000个点,采样频率8000Hz,单声道 figure (1);plot(y);xlabel('语音信号的幅度特性曲线');%输出语音信号的幅度响应图 Q=fft(y); figure (2);plot(abs(Q));xlabel('语音信号的幅频响应');%输出语音信号的幅频响应图 sound(y); y1=y(1: 40000)'; input('录音停止,按回车键进行下一步'); err=input('重录按1回车,确认按回车键'); %将语音信号分为段长为160样本的若干段 space=400; N=round(length(y1)/space-0.5);%计算帧数 l=0; h=0;%大于200Hz的浊音帧数 e=0;%小于500HZ的浊音帧数 max=0.60;min=0.54; fori=1: N s=y1((i-1)*320+1: (i*320));%选择一帧 x=SMDSF(s);%求幅度差平方和函数 c=nomSMDSF(x);%求归一化幅度平方和函数 a=[];%用于存储各个候选周期与后面的波谷点的商值 IndMin1=[];%用于存储大于50Hz小于500Hz的候选基因周期 %将清音和噪音部分置零使其不影响后面波谷点的提取 fori1=1: length(x) ifc(i1)>=0.5 x1(i1)=0; else x1(i1)=x(i1); end end IndMin=find(diff(sign(diff(x1)))>0)+1;%寻找波谷点 [m,n]=size(IndMin); %存储大于50Hz小于500Hz的候选基因周期 forj1=1: n ifIndMin(1,j1)>=16&&IndMin(1,j1)<=160 IndMin1(: j1)=IndMin(1,j1); else IndMin(1,j1)=0; end end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语音 性别 识别 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)