ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【语音识别】基于MFCC的小波变换DTW实现说话人识别matlab代码

2021-11-19 23:59:44  阅读:241  来源: 互联网

标签:end MFCC signal 小波 length speech namefile speaker 识别


1 简介

小波变换的发展为语音信号提供了新的处理方法与技术,从而使语音处理技术取得了较快的发展。说话人识别提取说话人的语音特征对说话人的身份进行确认或辨认。语音识别研究领域的一个重要研究方向,就是从语音信号中有效地提取个人特征信息进行说话人身份的识别。在说话人识别系统中,最重要的是能够从语音片断中提取代表说话人独有特征的稳定参数。基于短时傅立叶变换的常规特征参数构造表现出了很多不足,它是在短时平稳假定的基础上获取时频局部化信息,时频分辨率是固有的,其缺陷不能很好的处理语音信号这种非平稳信号。针对短时傅立叶分析的缺陷,本文通过对小波理论和说话人识别技术的研究,在学习传统的基于听觉机理的特征参数MFCC(Mel频域倒谱系数)的基础上,加上小波变换、小波包变换和小波多分辨分析,构造出了基于小波变换的说话人识别特征参数:WPTCC(小波包变换系数)。利用在Matlab平台上仿真软件构建的说话人识别系统,进行实验证明。理论和实验分析的结果可以说明利用小波变换提取的说话人识别特征参数取得了一定效果,相比于传统的分析方法确实具有更好的识别特性。语音识别率的提高需要对语音信号进行预处理,本文也利用小波变换的知识对待识别的说话人语音进行降噪处理和端点检测,以保证提取特征参数时的准确。针对小波分析的特点,小波分解预处理后,跳过信号重构,直接将分解分量进入以下一步处理,简化过程提高精度。

2 部分代码

​
close all;
chos=0;
possibility=5;

messaggio='Insert the number of set: each set determins a class. This set should include a number of speech for each person, with some variations in expression and in the lighting.';

while chos~=possibility,
   chos=menu('speaker identification System','Select speech signal and add to database','Select speech signal for speaker identification','Delete database',...
       'speech signal: visualization','Exit');
   %--------------------------------------------------------------------------
   %--------------------------------------------------------------------------
   %--------------------------------------------------------------------------
   % Calculate gmm of the speech and Add to Database
   if chos==1
       clc;
       close all;
       selezionato=0;
       while selezionato==0
          [namefile,pathname]=uigetfile({'*.wav','speech Files (*.wav)'},'Chose speech signal');
           if namefile~=0
    
               selezionato=1;
           else
               disp('Select a speech signal');
           end
          
       end
       filt=melfilter(150,300,15);
       fr1=frm(strcat(pathname,namefile),16,8000,1);
       mc2=train(fr1,filt,20); 
       mc2=mc2(3:18,:);
       mc1=banshengsin(mc2);
       s1=pitch(pathname,namefile);
       a=length(s1);
       b=length(mc1(1,:));
       if a>b
           s1(b+1:a)=[];
       else
           s1(a+1:b)=0;
       end
       mc1=[mc1;s1];
      [im is ip]=init(mc1,16);
      [nim1 nis1 nip1 times]=gmm(im,is,ip,mc1);
     data=struct('name',{},'means',{},'cov',{},'prob',{},'pitch',{});
       
       if (exist('speech_database.dat')==2)
  -----------------------
   %--------------------------------------------------------------------------
   %--------------------------------------------------------------------------
   % speaker recognition
   if chos==2
       clc;
       close all;
       selezionato=0;
       while selezionato==0
          [namefile,pathname]=uigetfile({'*.wav','speech Files (*.wav)'},'Chose speech signal');
           if namefile~=0
            
               selezionato=1;
           else
               disp('Select a speech signal');
           end
         
       end
     
       if (exist('speech_database.dat')==2)
           load('speech_database.dat','-mat');
           filt=melfilter(150,300,15);
fr=frm(strcat(pathname,namefile),16,8000,3);
l=length(fr(1,:));
nosp=length(data);
k=0;
b=0;
r=nosp;
while(r~=1)
 r=floor(r/2);
 k=k+1;
end
p(2,nosp)=0;p(1,1)=0;
for i=1:nosp
   p(2,i)=i;
end
mc4=train(fr,filt,20);
mc4=mc4(3:18,:);
mc=banshengsin(mc4);
pitch2=pitch(pathname,namefile);
a=length(pitch2);
b=length(mc(1,:));
if a>b
   pitch2(b+1:a)=[];
else
   pitch2(a+1:b)=0;
end
mc=[mc;pitch2];
coff=length(mc(:,1));
o=length(mc(1,:));
frameparts=struct('frame',{});
s=mod(l,k);
y=floor(l/k);
if s==0
  for i=1:k
      frameparts(i).frame(coff,y)=0;
  end
else
   for i=1:s
     frameparts(i).frame(coff,y+1)=0;
   end
   for i=s+1:k
     frameparts(i).frame(coff,y)=0;
   end
end
for r=1:k
count=1;
  for i=r:k:l
     frameparts(r).frame(:,count)=mc(:,i);
     count=count+1;
  end
end
c=length(data);
for  i=1:k
  % tic
  p1=ident2(frameparts(i).frame,filt,data,p);
% toc
  p=upd_pr(p,p1);
  p=nmax1(p);
end
p2=p(1)/o;
scores=zeros(nosp,1);
for i=1:nosp
  pitch1=data(i).pitch';
 % tic
  scores(i,1)=myDTW(pitch2,pitch1(1:length(pitch2)));
 % toc
end
scores;
[m,n]=sort(scores);

b=p(2,1);
if or((p2>-25),b==n)
nm=data(b).name;
      message=strcat('The speaker is : ',nm);
      msgbox(message,'DataBase Info','help');
else
   message='the speaker is a stranger.';
   msgbox(message,'DataBase Info','help');
end
       else
           message='DataBase is empty. No check is possible.';
           msgbox(message,'speech DataBase Error','warn');    
       end
       
   end 
  
%删除全部数据,或只删除一个人的数据    
   if chos==3
       clc;
       close all;
       if (exist('speech_database.dat')==2)
            load('speech_database.dat','-mat');
           button = questdlg('which speaker do you want to delete?',...
                  'Genie Question',...
                  'all','specified','all');
            if strcmp(button,'all')
               delete('speech_database.dat');
               msgbox('Database was succesfully removed from the current directory.','Database removed','help');
            else 
                 prompt={'Enter the name of speaker you want to delete'};
  name='specified speaker delete';
  numlines=1;
  defaultanswer={'0'};
  answer=inputdlg(prompt,name,numlines,defaultanswer);
nspeaker=length(data);
names=cell(1,nspeaker);
for i=1:nspeaker
names{1,i}=data(i).name;
end
[a,b]=ismember(answer{1,1},names);
if a==0
      warndlg('the speaker is not exist.','Warining')
  else 
     data(b)=[];
     speaker_number=length(data);
     save('speech_database.dat','data','speaker_number','-append');
  message=strcat('you have succesfully removed The speaker : ',answer{1,1});
           msgbox(message,'specified speaker removed','help');
end
            end
       else
           warndlg('Database is empty.',' Warning ')
       end
   end 
   if chos==4
       clc;
       close all;
       selezionato=0;
       while selezionato==0
          [namefile,pathname]=uigetfile({'*.wav','speech signal (*.wav)'},'Chose speech signal');
           if namefile~=0
              [x,fs]=wavread(strcat(pathname,namefile));
               selezionato=1;
           else
               disp('Select a speech signal');
           end
       
       end
       figure('Name','Selected speech signal');
       plot(x);
       pause;
       x=trim(x);
       plot(x);
       pause;
       filt=melfilter(150,300,15);
       fr1=frm(strcat(pathname,namefile),16,8000,1);
       size(fr1)
       mc2=train(fr1,filt,20); 
      colormap(1-gray);
       imagesc(mc2);
       pause;
       mc2=mc2(3:18,:);
       imagesc(mc2);
       pause;
       y=bansin(16)
       plot(y);
       pause;
       mc1=banshengsin(mc2);
       imagesc(mc1);
       pause;
     % cor=CorrelogramArray(fr1,x,256);
      % [pixels frames] = size(cor);
  % colormap(1-gray);
%for j=1:frames
%imagesc(reshape(cor(:,j),pixels/256,256));
%drawnow;
   %end
   % pitch=CorrelogramPitch(cor,256,8000);
   % plot(pitch)
 s11=pitch(pathname,namefile);
    plot(s11);
   pause;
  %[im is ip]=init(mc1,16);
   % [nim1 nis1 nip1 times]=gmm(im,is,ip,mc1);
    
    end  
end

3 仿真结果

4 参考文献

[1]刘然. 基于小波变换的说话人识别应用研究. Diss. 西安电子科技大学, 2011.

图片

标签:end,MFCC,signal,小波,length,speech,namefile,speaker,识别
来源: https://blog.csdn.net/qq_59747472/article/details/121433209

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有