Code covered by the BSD License  

Highlights from
Play Pitch Period Contour

image thumbnail

Play Pitch Period Contour

by

 

07 Feb 2014 (Updated )

The exercise tries to separate the main properties of speech excitation function from vocal tract.

Callbacks_play_pitch_GUI25(f,C,start_path)
function Callbacks_play_pitch_GUI25(f,C,start_path)


%SENSE COMPUTER AND SET FILE DELIMITER
switch(computer)				
    case 'MACI64',		char= '/';
    case 'GLNX86',  char='/';
    case 'PCWIN',	char= '\';
    case 'PCWIN64', char='\';
    case 'GLNXA64', char='/';
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x=C{1,1};
y=C{1,2};
a=C{1,3};
b=C{1,4};
u=C{1,5};
v=C{1,6};
m=C{1,7};
n=C{1,8};
lengthbutton=C{1,9};
widthbutton=C{1,10};
enterType=C{1,11};
enterString=C{1,12};
enterLabel=C{1,13};
noPanels=C{1,14};
noGraphicPanels=C{1,15};
noButtons=C{1,16};
labelDist=C{1,17};%distance that the label is below the button
noTitles=C{1,18};
buttonTextSize=C{1,19};
labelTextSize=C{1,20};
textboxFont=C{1,21};
textboxString=C{1,22};
textboxWeight=C{1,23};
textboxAngle=C{1,24};
labelHeight=C{1,25};
fileName=C{1,26};
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%PANELS
for j=0:noPanels-1
uipanel('Parent',f,...
'Units','Normalized',...
'Position',[x(1+4*j) y(1+4*j) x(2+4*j)-x(1+4*j) y(3+4*j)-y(2+4*j)]);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%GRAPHIC PANELS
for i=0:noGraphicPanels-1
switch (i+1)
case 1
graphicPanel1 = axes('parent',f,...
'Units','Normalized',...
'Position',[a(1+4*i) b(1+4*i) a(2+4*i)-a(1+4*i) b(3+4*i)-b(2+4*i)],...
'GridLineStyle','--');
case 2
graphicPanel2 = axes('parent',f,...
'Units','Normalized',...
'Position',[a(1+4*i) b(1+4*i) a(2+4*i)-a(1+4*i) b(3+4*i)-b(2+4*i)],...
'GridLineStyle','--');
case 3
graphicPanel3 = axes('parent',f,...
'Units','Normalized',...
'Position',[a(1+4*i) b(1+4*i) a(2+4*i)-a(1+4*i) b(3+4*i)-b(2+4*i)],...
'GridLineStyle','--');
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%TITLE BOXES
for k=0:noTitles-1
switch (k+1)
case 1
titleBox1 = uicontrol('parent',f,...
'Units','Normalized',...
'Position',[u(1+4*k) v(1+4*k) u(2+4*k)-u(1+4*k) v(3+4*k)-v(2+4*k)],...
'Style','text',...
'FontSize',textboxFont{k+1},...
'String',textboxString(k+1),...
'FontWeight',textboxWeight{k+1},...
'FontAngle',textboxAngle{k+1});
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%BUTTONS
for i=0:(noButtons-1)
enterColor='w';
if strcmp(enterType{i+1},'pushbutton')==1 ||strcmp(enterType{i+1},'text')==1
enterColor='default';
end
if (strcmp(enterLabel{1,(i+1)},'')==0 &&...
        strcmp(enterLabel{1,(i+1)},'...')==0) %i.e. there is a label
%creating a label for some buttons
uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i)-labelDist-labelHeight(i+1) ...
(m(2+2*i)-m(1+2*i)) labelHeight(i+1)],...
'Style','text',...
'String',enterLabel{i+1},...
'FontSize', labelTextSize(i+1),...
'HorizontalAlignment','center');
end
switch (i+1)
case 1
button1=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button1Callback);
case 2
button2=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button2Callback);
case 3
button3=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button3Callback);
case 4
button4=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button4Callback);
case 5
button5=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button5Callback);
case 6
button6=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button6Callback);
case 7
button7=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button7Callback);
case 8
button8=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button8Callback);
case 9
button9=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button9Callback);
case 10
button10=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button10Callback);
case 11
button11=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button11Callback);
case 12
button12=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button12Callback);
case 13
button13=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button13Callback);
end
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%USER CODE FOR THE VARIABLES AND CALLBACKS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Initialize Variables
    curr_file=1;
    fs=8000;
    directory_name='abcd';
    wav_file_names='abce';
    fin_path='filename';
    fname='output';
    fnameo='output';
    nsamp=1;
    x=[];
    xin=[];
    fsd=10000;
    nsec=4;
    imf=1;
    ppthr=0.075;
    pthr1=2.5;
    nfft=4000;
    Lmed=5;
    ivowel=1;
    ss=1;
    es=19400;
    Lm=40;
    Rm=10;
    iwin=1;
    pitchfile=[];
    fsr=8000;
    zout=[];

% Name the GUI
    set(f,'Name','play_pitch_contour');

% CALLBACKS
% Callback for button1 -- Get Speech Files Directory
 function button1Callback(h,eventdata)
     directory_name=uigetdir(start_path,'dialog_title');
%      if isempty(getpref('SpeechApps'))
%          url = sprintf('%s%s%s',...
%              'http://www.mathworks.com/matlabcentral/fileexchange/',...
%              '42911-speech-and-audio-files-for-speech-processing-excercises',...
%              '?download=true');
%          [saveloc,~,~] = fileparts(pwd); %save to one level up from current folder
%          % Create a waitbar during download
%          h = waitbar(0.35,'This may take several minutes...',...
%              'Name','Downloading Speech Files...');
%          % Download the zipped file
%          [filestr,status] = urlwrite(url,[saveloc filesep 'speech_files.zip'],...
%              'Timeout',10);
%          if status
%              delete(h);
%              hh1= helpdlg('Downloaded. Select a location to UNZIP the speech files.');
%              uiwait(hh1);
%              unziploc = uigetdir(saveloc,'Select a location to unzip the speech files');
%              h2 = waitbar(0.2,'This may take a minute...',...
%                  'Name','Unzipping the Speech Files to Location Selected...');
%              unzip(filestr,unziploc);
%              delete(h2)
%              addpref('SpeechApps','path',unziploc);
%              hh2= helpdlg('Ready. Select the speech_files folder in the next window');
%              uiwait(hh2);
%          else
%              warndlg('No Internet Connection to MATLAB Central!');
%          end
%          
%      else
%      end
%      directory_name=uigetdir(getpref('SpeechApps','path'));
     A=strvcat(strcat((directory_name),[char,'*.wav']));
     struct_filenames=dir(A);
     wav_file_names={struct_filenames.name};
     set(button2,'String',wav_file_names);
     
% once the popupmenu/drop down menu is created, by default, the first
% selection from the popupmenu/drop down menu id not called
    indexOfDrpDwnMenu=1;
    
% by default first option from the popupmenu/dropdown menu will be loaded
    [curr_file,fs]=loadSelection(directory_name,wav_file_names,indexOfDrpDwnMenu);
 end

% Callback for button2 -- Choose speech file for play and plot
 function button2Callback(h,eventdata)
     indexOfDrpDwnMenu=get(button2,'val');
     [curr_file,fs]=loadSelection(directory_name,wav_file_names,indexOfDrpDwnMenu);
 end

%*************************************************************************
% function -- load selection from designated directory and file
%
function [curr_file,fs]=loadSelection(directory_name,wav_file_names,...
    indexOfDrpDwnMenu);
%
% read in speech/audio file
% fin_path is the complete path of the .wav file that is selected
    fin_path=strcat(directory_name,char,strvcat(wav_file_names(indexOfDrpDwnMenu)));
    
% clear speech/audio file
    clear curr_file;
    
% read in speech/audio signal into curr_file; sampling rate is fs 
    [curr_file,fs]=wavread(fin_path);
    xin=curr_file*32768;
    
% create title information with file, sampling rate, number of samples
    fname=wav_file_names(indexOfDrpDwnMenu);
    FS=num2str(fs);
    nsamp=num2str(length(curr_file));
    file_info_string=strcat('  file: ',fname,', fs: ',FS,' Hz, nsamp:',nsamp);
    
% read in filename (fname) from cell array
    fname=wav_file_names{indexOfDrpDwnMenu};
    
% change character '_' to character ' ' in speech filename
    fname(find(fname(:) == '_')) = ' ';
    fnameo=fname;
end

% Callback for button3 -- fsr: sampling rate for speech recording
 function button3Callback(h,eventdata)
     fsr=str2num(get(button3,'string'));
     a = [16000 6000 8000 10000 16000 20000];
     fsr = a(get(button3,'val'));
     fs=fsr;
 end

% Callback for button4 -- nsec: recording duration in samples
 function button4Callback(h,eventdata)
     nsec=str2num(get(button4,'string'));
     if ~((nsec >= 1 && nsec <= 5))
        waitfor(errordlg('nsec must be a positive integer between 1 and 5'))
        return;
     end
     nsec=round(nsec);
     set(button4,'string',num2str(nsec));
 end

% Callback for button5 -- Record Speech
 function button5Callback(h,eventdata)
     
% check parameters for recording speech, fs and nse
    button3Callback(h,eventdata);
    button4Callback(h,eventdata);
    
% begin recording after hitting OK on msg box
    uiwait(msgbox('Ready to Record -- Hit OK to Begin','Record','modal'));
    
% recording loop
    xin=record_single('out_recording.wav',fs,nsec);
    fname='recording';
 end

% Callback for button6 -- Lm: analysis frame length in msec
 function button6Callback(h,eventdata)
     Lm=str2num(get(button6,'string'));
     if ~((Lm >= 1 && Lm <= 100))
        waitfor(errordlg('Lm must be a positive number between 1 and 100'))
        return;
     end
 end

% Callback for button7 -- Rm: analysis frame shift in msec
 function button7Callback(h,eventdata)
     Rm=str2num(get(button7,'string'));
     if ~((Rm >= 1 && Rm <= 100))
        waitfor(errordlg('Rm must be a positive number between 1 and 100'))
        return;
     end
 end

% Callback for button8 == imf: male/female/combined pitch period range switch
 function button8Callback(h,eventdata)
     imf=get(button8,'val');
 end

% Callback for button9 -- ivowel: vowel used for synthesis (1-10 range)
 function button9Callback(h,eventdata)
     ivowel=get(button9,'val');
 end

% Callback for button10 -- Run Play Pitch Contour
 function button10Callback(h,eventdata)
     
% check parameters for playing pitch period contours
    button6Callback(h,eventdata);
    button7Callback(h,eventdata);
    button8Callback(h,eventdata);
    button9Callback(h,eventdata);
    
% setup play pitch contour code
    fsd=10000;
    ppthr=0.075;
    pthr1=2.5;
    nfft=4000;
    Lmed=5;
    fname='out_play_pitch';
    setup_play_pitch_contour(xin,fs,fsd,imf,ppthr,pthr1,nfft,...
        Lmed,Lm,Rm,ivowel,fname);
    
 end

%**********************************************************************
    function setup_play_pitch_contour(xin,fs,fsd,imf,ppthr,pthr1,...
            nfft,Lmed,Lm,Rm,ivowel,filesave)
%
% from a given speech file (either from a saved file or from a newly
% recorded file) extract the pitch period contour, create a
% pseudo-excitation function of pitch pulses and random noise, and convolve
% the resulting pseudo-excitation with a vowel impulse response (any of
% ten vowel sounds), and play out the resulting sound
    
% resample speech if fs ~= fsd
    if (fs ~= fsd)
        xin=srconv(xin,fs,fsd);
    end
    lxin=length(xin);
    
% convert Lm and Rm to samples at rate fsd
    L=round(Lm*fsd/1000);
    R=round(Rm*fsd/1000);
    
% compute cepstrum and detect pitch
    [pp1,pp2,plevel1,plevel2]=pitch_detect_cepstrum(xin,fsd,0,imf,nfft,...
        L,R,0,filesave);
    
% median smooth pitch period contour
    ppdf=smoothpitch(pp1,pp2,plevel1,plevel2,pthr1);
    nl=length(ppdf);
    fprintf('length: %d  \n',length(pp1));
    ppsav=pp1;
    pplevel=plevel1./(25*plevel2);
    % pp1(find(pplevel < ppthr))=0;
    
% compute median pitch period and median log confidence scores
    p1m=medf(ppdf,Lmed,length(pp1));
    c1m=medf(plevel1(1:nl),Lmed,nl);
    ppm=p1m;
    plevel1m=c1m(1:nl);
    
% plot median-smoothed data    
    n=1:length(ppdf);
    
% clear graphics Panel 3
        reset(graphicPanel3);
        axes(graphicPanel3);
        cla;
        
% plot original speech signal in graphics Panel 3
        ss1=L/2+1-R;
        es1=L/2+1+nl*R;
        plot(ss1:es1,xin(ss1:es1),'b');xlabel('Samples');ylabel('Value');
        axis([ss1 es1 min(xin) max(xin)]);grid on;legend('original speech');
    
% clear graphics Panel 2
        reset(graphicPanel2);
        axes(graphicPanel2);
        cla;
        
% plot pitch period contour in graphics Panel 2
    plot(n,p1m(1:nl),'k','LineWidth',2),axis([0 nl+1 0 1.1*max(p1m)]);grid on,...
       xlabel('Frame Number'),ylabel('Pitch Period');
        stitle=sprintf(' file: %s, median smoothed (Lmed=5)',filesave);
        legend('pitch period contour');
        
% clear graphics Panel 1
        reset(graphicPanel1);
        axes(graphicPanel1);
        cla;
        
% plot confidence score contour in graphics Panel 1
     plot(n,c1m(1:nl),'k','LineWidth',2),axis([0 nl+1 0 1.1*max(c1m)]); grid on,...
        xlabel('Frame Number'),ylabel('Confidence');legend('confidence score');
    
% display fname, and signal processing parameters in titleBox1
        stitle=sprintf(' file:%s, Lm:%d, Rm:%d, median smoothed (Lmed:5)',fnameo,Lm,Rm);
        stitle1=strcat('Play Pitch Contour -- ',stitle);
        set(titleBox1,'string',stitle1);
        set(titleBox1,'FontSize',20);
 
% save output in file
    outfile=['out_cepstrum_',filesave,'.mat'];
    save (outfile, 'ppdf', 'plevel1', 'ppm', 'plevel1m', 'filesave', 'fsd', 'L', 'R', 'Lmed');

% create excitation signal
    e=create_excitation(ppdf,fsd,R);
    
% load information about vowel sounds (formants and bandwidths)
% load 'vowels_fmts_bw';
    str=load('vowels_fmts_bw.mat');
    vowels=str.vowels;
    formants=str.formants;
    bandwidths=str.bandwidths;
    
% generate vowel impulse response
    fmts=formants(ivowel,:);
    fmts=[fmts 4500];
    yout=vowel_ir(fmts,bandwidths,fsd);
    
% convolve vowel impulse response with excitation    
    zout=filter(yout(1:500),1,e);
    end

% Callback for button11 -- Play original speech
    function button11Callback(h,eventdata)
    soundsc(xin,fs);
    end

% Callback for button12 -- Play vowel with pitch period contour
    function button12Callback(h,eventdata)
    soundsc(zout,fsd);
end

% Callback for button13 -- Close GUI
 function button13Callback(h,eventdata)
     fclose('all');
     close(gcf);
 end
end

Contact us