日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Matlab2013a学习之男女的声音识别

發布時間:2023/12/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Matlab2013a学习之男女的声音识别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

人能夠很容易的聽出說話人的性別,我們能不能讓機器也像人一樣,聽聲辨別性別?這個答案是肯定的,特別是隨著人工智能算法的發展,識別性能是不斷的提升。識別男女聲,也變的相對容易了。

人類基音的范圍約為70~350Hz左右,由于生理結構的不同,男性與女性的聲音呈現出不同的聽覺特征,男聲的基音頻率大都在100—200HZ之間,而女聲則在200—350HZ之間;在會話中,同一發音者的基音頻率變化的統計結果,如圖一所示。女聲與男聲相比,前者的平均值、標準差都為后者的兩倍左右。不同發音者的基音頻率分布如圖二所示,在對數頻率軸上男聲,女聲分別呈現正態分布,男聲的基音頻率的平均值和標準差分別為125HZ及其20HZ。女聲約為男聲的2倍。鑒于男女聲存在基音頻率的明顯差異,基音頻率可作為男女聲識別的依據。

代碼分為幾個部分,不同的部分實現不同的功能;
通過錄入一段音頻;代碼名稱:luru.m

fs=16000; fprintf('testing...\n');y=audiorecorder(fs, 16, 1); % 16000Hz 16bit 單聲道 recordblocking(y,5);%錄制5秒rbd=get(con_rbd,'value') ; if (rbd)delete('test_record/*.wav');m=1;%從頭開始 endname=strcat('test_record\',...num2str(m),'.wav'); y1 = getaudiodata(y,'int16'); audiowrite(name,y1,fs); %生成音頻文件 1.wav cut(name); result = PitchDetect(name); disp(result); m=m+1; set(con_text,'string',result);

剪掉靜音時間段,代碼名稱:jiandiao.m

function y1=cut(s_address)y=audioread(s_address); h=hamming(320);% 計算短時平均能量SAE(short average energe) %信號的平方在與窗函數相卷 % E(n)=[x(m)]^2*h(n-m),m從負無窮到正無窮求和,h(n-m)為漢明窗 e=conv(y.*y,h); % y.*2對y中各元素平方;conv(u,v) 求u與v的卷積% 對語音信號進行切割,當SAE小于能量大值的1/100時,認為是起點或終點mx=max(e); n=length(e); y(n)=0; % 將原始語音信號矩陣擴充至n維 for i=1:nif e(i)<mx*0.01e(i)=0;else e(i)=1; % e中非0的數用1來代替end end y1=y.*e; y1(find(y1==0))=[]; % 把0元素剔除 fs=16000; audiowrite(s_address,y1,fs);

男女聲基因頻率識別,代碼名稱:shibie.m

function pd=PitchDetect(s_address)waveFile = s_address; % fs = 16000 % y = cut(s_address); [y, fs] = audioread(waveFile); time=(1:length(y))/fs; frameSize=floor(40*fs/1000); %幀長40ms 一共640個點 floor不大于x的最大整數 startIndex=round(7000); %起始序號 endIndex=startIndex+frameSize-1; %結束序號 frame = y(startIndex:endIndex); %取出該幀 frameSize=length(frame); frame2=frame.*hamming(length(frame)); % 加hamming窗 rwy = rceps(frame2); % 求倒譜 ylen=length(rwy); cepstrum=rwy(1:ylen/2); %基音檢測 LF=floor(fs/500); %設置基音搜索的范圍 點數 HF=floor(fs/70); %設置基音搜索的范圍 點數 cn=cepstrum(LF:HF); %求倒譜 [mx_cep ind]=max(cn); %設置門限,找到峰值位置 if mx_cep > 0.08 & ind >LF a= fs/(LF+ind); elsea=0; end figure(2); plot(time, y); title(waveFile); axis tight ylim=get(gca, 'ylim'); line([time(startIndex), time(startIndex)], ylim, 'color', 'r'); line([time(endIndex), time(endIndex)], ylim, 'color', 'r'); title('語音波形'); figure(3); subplot(2,1,1); plot(frame); title('取出幀的波形'); subplot(2,1,2); plot(cepstrum); title('倒譜圖');[x,sr]=audioread(s_address); meen=mean(x); x= x - meen; updRate=floor(20*sr/1000); %每20ms更新 fRate=floor(40*sr/1000); %40ms一幀 n_samples=length(x); nFrames=floor(n_samples/updRate)-1; %幀數 k=1; pitch=zeros(1,nFrames); f0=zeros(1,nFrames); LF=floor(sr/500); HF=floor(sr/70); m=1; avgF0=0; for t=1:nFramesyin=x(k:k+fRate-1);cn1=rceps(yin);cn=cn1(LF:HF);[mx_cep ind]=max(cn);if mx_cep > 0.08 & ind >LFa= sr/(LF+ind);elsea=0;endf0(t)=a;if t>2 & nFrames>3 %中值濾波對基音軌跡圖進行平滑z=f0(t-2:t);md=median(z);pitch(t-2)=md;if md > 0avgF0=avgF0+md;m=m+1;endelseif nFrames<=3pitch(t)=a;avgF0=avgF0+a;m=m+1;endendk=k+updRate; end figure(4) subplot(211); plot((1:length(x))/sr, x); ylabel('幅度'); xlabel('時間'); subplot(212); xt=1:nFrames; xt=20*xt; plot(xt,pitch) xlim([0,3]); axis([xt(1) xt(nFrames) 0 max(pitch)+50]); ylabel('基音頻率/HZ'); xlabel('時間');Mypitch = max(pitch) if Mypitch>220pd = ['Woman ', num2str(Mypitch)]; elseif Mypitch<200pd = ['Man ', num2str(Mypitch)]; else pd = ['Sorry ', num2str(Mypitch)]; end

一個非常簡陋的界面,不得不說MATLAB功能還是比較強大的,代碼名稱:UI.m

clear;clc;close all; global n; n=1;set(0,'defaultfigurecolor','w'); %歸一化圖形界面 con_car=figure('position',[400 200 680 380],...'numbertitle','off',...'name','Man or Woman'); set(con_car,'defaultuicontrolunits','normalized');rbd=0; con_rbd=uicontrol('Style','radiobutton',...'Position',[0.15 0.62 0.15 0.05],...'Value',rbd,... rbd的值為0或1,選中為1,未選中為0'String','重新測試','backgroundcolor',get(gcf,'color'));% 關閉按鈕 con_close=uicontrol('style','pushbutton','position',[0.5 0.6 0.2 0.1],...'string','關閉','callback','close');% 測試按鈕 con_test=uicontrol('style','pushbutton','position',[0.3 0.6 0.2 0.1],...'string','測試'); % [left bottom width height]% 顯示字符串‘請一直說話’和測試結果 con_text=uicontrol('style','text','position',[0.3 0.1 0.4 0.4],...'FontSize',30,'string','請一直說話','backgroundcolor',get(gcf,'color'));% 調用錄音測試程序 set(con_test,'callback','test_record');

最后的運行結果:

但在測試過程中,有時也會存在誤判,這多半與說話的方式的有關,建議說數字0-9,正確率比較高!

總結

以上是生活随笔為你收集整理的Matlab2013a学习之男女的声音识别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。