diff Code/Descriptors/Matlab/MPEG7/FromWeb/VoiceSauce/func_SnackFormants.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_SnackFormants.m	Wed Feb 13 11:02:39 2013 +0000
@@ -0,0 +1,86 @@
+function [F1, F2, F3, F4, B1, B2, B3, B4, err] = func_SnackFormants(wavfile, windowlength, frameshift, preemphasis)
+% [F1, F2, F3, F4, B1, B2, B3, B4, err] = func_SnackFormants(wavfile, windowlength, frameshift, preemphasis)
+% Input:  wavfile - input wav file
+%         windowlength - windowlength in seconds
+%         frameshift - in seconds
+%         preemphasis - wonder what this could be?
+% Output: Fx, Bx - formant and bandwidth 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 = 'tclforsnackformant.tcl'; %produce tcl file to call snack
+
+% make the wavfile acceptable to tcl in Snack
+formantfile = [wavfile(1:end-3) 'frm'];
+wavfile = strrep(wavfile, '[', '\[');
+wavfile = strrep(wavfile, ']', '\]');
+wavfile = ['"' wavfile '"'];
+%wavfile = strrep(wavfile, '\', '\\'); % for PC
+
+if (ispc)  % pc can run snack.exe
+    wavfile = strrep(wavfile, '\', '\\');
+    cmds = sprintf('-windowlength %.3f -framelength %.3f -windowtype Hamming -lpctype 1 -preemphasisfactor %.3f -ds_freq 10000', windowlength, frameshift, preemphasis);
+    err = system(['Windows\snack.exe formant ' wavfile ' ' cmds]);
+
+else % for macs and possibly others
+    %cmd = 'tclsh';  % this is for older macs 
+    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].frm w]\n', wavfile);
+    fprintf(fid, 'puts $fd [join [s formant -windowlength %.3f -framelength %.3f -windowtype 1 -lpctype 1 -preemphasisfactor %.3f -ds_freq 10000] \\n]\n', windowlength, frameshift, preemphasis);
+    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, '\]', ']');
+
+% oops, error, exit now
+if (err~=0)
+    F1 = NaN; F2 = NaN; F3 = NaN; F4 = NaN;
+    B1 = NaN; B2 = NaN; B3 = NaN; B4 = NaN;
+    if (iwantfilecleanup)
+        formantfile = strrep(formantfile, '\\', '\');
+        if (exist(formantfile, 'file') ~= 0)
+            delete(formantfile);
+        end
+        
+        if (exist(tclfilename, 'file') ~= 0)
+            delete(tclfilename);
+        end
+    end
+    return;
+end
+
+% snack call was successful, read out formant values
+[F1,F2,F3,F4,B1,B2,B3,B4] = textread(formantfile, '%f %f %f %f %f %f %f %f');
+
+if (iwantfilecleanup)
+    formantfile = strrep(formantfile, '\\', '\');
+    if (exist(formantfile, 'file') ~= 0)
+        delete(formantfile);
+    end
+    
+    if (exist(tclfilename, 'file') ~= 0)
+        delete(tclfilename);
+    end
+end