view 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 source
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