diff Code/Descriptors/Matlab/MPEG7/FromWeb/VoiceSauce/func_StraightPitch.m @ 4:92ca03a8fa99 tip

Update to ICASSP 2013 benchmark
author Dawn Black
date Wed, 13 Feb 2013 11:02:39 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/Descriptors/Matlab/MPEG7/FromWeb/VoiceSauce/func_StraightPitch.m	Wed Feb 13 11:02:39 2013 +0000
@@ -0,0 +1,153 @@
+function [F0, V] = func_StraightPitch(y, Fs, variables, textgridfile)
+% [F0, V] = func_StraightPitch(y, Fs, variables, textgridfile)
+% Input:  y, Fs - from wavread
+%         variables - settings
+%         textgridfile - this is optional
+% Output: F0, V - F0 and voicing vectors
+% Notes:  This function calls the Straight functions. Using textgrid
+% segmentation helps to speed up the processing.
+%
+% Author: Yen-Liang Shue, Speech Processing and Auditory Perception Laboratory, UCLA
+% Copyright UCLA SPAPL 2009
+
+maxF0 = variables.maxstrF0;
+minF0 = variables.minstrF0;
+maxdur = variables.maxstrdur;
+
+prmF0in.DisplayPlots = 0;
+prmF0in.ThresholdForVUV = 0.1;
+prmF0in.ThresholdForSilence = 1;
+prmF0in.F0searchLowerBound = minF0;
+prmF0in.F0searchUpperBound = maxF0;
+%prmF0in.VUVthresholdofAC1 = 0.9000;
+
+warning off
+
+% break up the file if it is too big (i.e. > 15sec)
+if (nargin == 3)  % do the whole file, no textgrid data available
+    L = floor(length(y)/Fs * 1000) - 1;    
+    F0 = zeros(L, 1);
+
+    if (length(y) / Fs > maxdur)
+        % find suitable places to chop
+        cnt = 1;
+        startx = 1;
+        endx = startx + floor(maxdur*Fs);
+        isgood = 1;
+
+        while(startx < length(y))
+            if (startx == 1)
+                yseg = y(startx : endx);  % extra millisecond
+            else
+                yseg = y(startx - floor(F0 / 1000) - 10 : endx);  % extra millisecond
+            end
+            %fprintf('Processing segment %d to %d\n', startx, endx);
+            
+            try    
+                [F0seg, V, auxouts, prmF0out] = MulticueF0v14(yseg,Fs,prmF0in);
+            catch
+                isgood = 0;
+                break;
+            end
+            
+            F0(cnt:cnt+length(F0seg)-1) = F0seg;
+            cnt = cnt + length(F0seg);
+            startx = endx + 1;
+            
+            remainder = length(y) - endx - 1;
+            if (remainder > maxdur*Fs)
+                endx = startx + floor(maxdur*Fs);
+            else
+                endx = length(y);
+            end
+        end
+        
+        if (~isgood)  % multicue failed
+            fprintf('Multicue failed: switching to exstraightsource\n');
+            F0 = exstraightsource(y,Fs,prmF0in);
+            F0 = F0(1:L)';
+            V = ones(size(F0seg));
+        end
+
+    else
+        try
+            [F0, V, auxouts, prmF0out] = MulticueF0v14(y,Fs,prmF0in);
+        catch
+            fprintf('Multicue failed: switching to exstraightsource\n');
+            F0 = exstraightsource(y,Fs, prmF0in);
+            F0 = F0(1:L)';
+            V = ones(size(F0));
+        end
+    end
+else  % use textgrid data
+    % get the labels to ignore from the settings
+    tbuffer = variables.tbuffer;
+    ignorelabels = textscan(variables.TextgridIgnoreList, '%s', 'delimiter', ',');
+    ignorelabels = ignorelabels{1};
+    
+    [labels, start, stop] = func_readTextgrid(textgridfile);
+    
+    labels_tmp = [];
+    start_tmp = [];
+    stop_tmp = [];
+    
+    for k=1:length(variables.TextgridTierNumber)
+        inx = variables.TextgridTierNumber(k);
+        if (inx <= length(labels))
+            labels_tmp = [labels_tmp; labels{inx}];
+            start_tmp = [start_tmp; start{inx}];
+            stop_tmp = [stop_tmp; stop{inx}];
+        end
+    end
+    
+    labels = labels_tmp;
+    start = start_tmp * 1000; % milliseconds
+    stop = stop_tmp * 1000; % milliseconds
+    
+    L = floor(length(y) / Fs * 1000) - 1;
+    
+    F0 = zeros(L, 1) * NaN;
+    V = zeros(L, 1) * NaN;
+    
+    for k=1:length(start)
+        
+        switch(labels{k})
+            case ignorelabels
+                continue;  % skip anything that is within the ignore list
+        end
+                
+        tstart = start(k) - tbuffer;
+        tstop = stop(k) + tbuffer;
+        
+        sstart = floor(tstart / 1000 * Fs);
+        sstop = ceil(tstop / 1000 * Fs);
+        
+        sstart(sstart <= 0) = 1;
+        sstop(sstop > length(y)) = length(y);
+        
+        yseg = y(sstart:sstop);
+
+        try
+            [F0seg, Vseg, auxouts, prmF0out] = MulticueF0v14(yseg,Fs,prmF0in);
+        catch 
+            fprintf('Multicue failed: switching to exstraightsource\n');
+            F0seg = exstraightsource(yseg,Fs,prmF0in);
+            F0seg = F0seg(2:end-1)';
+            Vseg = ones(size(F0seg));
+        end
+        
+        tstart = floor(tstart);
+        tstart(tstart <= 0) = 1;
+        F0(tstart:tstart+length(F0seg)-1) = F0seg;
+        V(tstart:tstart+length(Vseg)-1) = Vseg;
+        
+        if (length(F0) > L)
+            F0 = F0(1:L);
+        end
+        
+    end
+    
+end
+
+% sometimes Straight outputs 0s for F0
+F0(F0 == 0) = NaN;
\ No newline at end of file