diff Code/Descriptors/Matlab/MPEG7/FromWeb/VoiceSauce/func_SnackPitch.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_SnackPitch.m	Wed Feb 13 11:02:39 2013 +0000
@@ -0,0 +1,90 @@
+function [F0, V, err] = func_SnackPitch(wavfile, windowsize, frameshift, maxF0, minF0)
+% [F0, V, err] = func_SnackPitch(wavfile, windowsize, frameshift, maxF0, minF0)
+% Input:  wavfile - input wav file
+%         windowlength - windowlength in seconds
+%         frameshift - in seconds
+%         maxF0/minF0 - max and min thresholds
+% Output: F0, V - F0 and voicing vectors
+%         err - error flag
+% Notes:  If on Windows/PC, this function will call up the Snack executable
+% in the Windows folder. Otherwise, it will try to call up Snack - this
+% require Snack to be installed beforehand.
+%
+% Author: Yen-Liang Shue, Speech Processing and Auditory Perception Laboratory, UCLA
+% Copyright UCLA SPAPL 2009
+
+
+%settings
+iwantfilecleanup = 1;  %delete tcl,f0,frm files when done
+tclfilename = 'tclforsnackpitch.tcl'; %produce tcl file to call snack
+    
+% make the wavfile acceptable to tcl in Snack
+wavfile = strrep(wavfile, '[', '\[');
+wavfile = strrep(wavfile, ']', '\]');
+wavfile = ['"' wavfile '"'];
+%wavfile = strrep(wavfile, '\', '\\');   % for PC
+
+if (ispc)  % pc can run snack.exe
+    wavfile = strrep(wavfile, '\', '\\');    
+    err = system(['Windows\snack.exe pitch ' wavfile ' -method esps -framelength ' num2str(frameshift) ' -windowlength ' num2str(windowsize) ' -maxpitch ' num2str(maxF0) ' -minpitch ' num2str(minF0)]);
+
+else % for macs and possibly others
+    %cmd = 'tclsh'; % for older Macs and 'nixes
+    cmd = 'wish8.4'; % seems to work for OSX Snow Leopard
+    %cmd = 'wish84';  % for pc
+    
+    fid = fopen(tclfilename, 'wt');
+
+    fprintf(fid, '#!/bin/sh\n');
+    fprintf(fid, '# the next line restarts with wish \\\n');
+    fprintf(fid, 'exec wish8.4 "$0" "$@"\n\n');
+    fprintf(fid, 'package require snack\n\n');
+    fprintf(fid, 'snack::sound s\n\n');
+    fprintf(fid, 's read %s\n\n', wavfile);
+    fprintf(fid, 'set fd [open [file rootname %s].f0 w]\n', wavfile);
+    fprintf(fid, 'puts $fd [join [s pitch -method esps -framelength %f -windowlength %f -maxpitch %d -minpitch %d] \\n]\n', frameshift, windowsize, maxF0, minF0);
+    fprintf(fid, 'close $fd\n\n');
+    fprintf(fid, 'exit');
+    fclose(fid);
+    
+    err = system([cmd ' ' tclfilename]);
+    
+end
+
+% change back into original file
+wavfile = strrep(wavfile, '\[', '[');
+wavfile = strrep(wavfile, '\]', ']');
+pitchfile = [wavfile(2:end-4) 'f0'];  % this should be where the F0's are stored
+
+% oops, exit now
+if (err ~= 0)
+    F0 = NaN;
+    V = NaN;
+    if (iwantfilecleanup)
+        pitchfile = strrep(pitchfile, '\\', '\');
+        if (exist(pitchfile, 'file') ~= 0)
+            delete(pitchfile);
+        end
+        
+        if (exist(tclfilename, 'file') ~= 0)
+            delete(tclfilename);
+        end
+    end
+    return;
+end
+    
+% snack executed successfully, read out the F0 values
+[F0, V, dummy1, dummy2] = textread(pitchfile, '%f %f %f %f');
+
+if (iwantfilecleanup)
+    pitchfile = strrep(pitchfile, '\\', '\');
+    if (exist(pitchfile, 'file') ~= 0)
+        delete(pitchfile);
+    end
+
+    if (exist(tclfilename, 'file') ~= 0)
+        delete(tclfilename);
+    end
+end
+
+