Mercurial > hg > emotion-detection-top-level
diff Code/Descriptors/Matlab/MPEG7/FromWeb/VoiceSauce/func_PraatFormants.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_PraatFormants.m Wed Feb 13 11:02:39 2013 +0000 @@ -0,0 +1,136 @@ +function [F1, F2, F3, F4, B1, B2, B3, B4, err] = func_PraatFormants(wavfile, ... + windowlength, frameshift, frameprecision, datalen) +% [F1, F2, F3, F4, B1, B2, B3, B4, err] = func_PraatFormants(wavfile, windowlength, frameshift, frameprecision, datalen) +% KY Time-stamp: <2010-10-16 21:47:24 amoebe> +% Input: wavfile - input wav file +% windowlength - windowlength in seconds +% frameshift - in seconds +% frameprecision - unitless +% datalen - output data length +% Output: Fx, Bx - formant and bandwidth vectors +% err - error flag +% Notes: This currently only works on a PC. +% +% Author: Yen-Liang Shue, Speech Processing and Auditory Perception Laboratory, UCLA +% Modified by Kristine Yu, 2010-10-16 to allow for variable precision in +% matching up time alignment between data vectors. +% +% Copyright UCLA SPAPL 2010 + +% settings +maxFormant = 6000; +iwantfilecleanup = 1; %delete pfmt files when done + +% check if we need to put double quotes around wavfile +if (wavfile(1) ~= '"') + pwavfile = ['"' wavfile '"']; +else + pwavfile = wavfile; +end + +if (ispc) % pc can run praatcon.exe + cmd = sprintf('Windows\\praatcon.exe Windows\\praatformants.praat %s %.3f %.3f %d', pwavfile, frameshift, windowlength, maxFormant); + +elseif (ismac) % mac osx can run Praat using terminal, call Praat from + % Nix/ folder + curr_dir = pwd; + curr_wav = [curr_dir wavfile(2:end)]; + + cmd = sprintf(['MacOS/Praat Windows/praatformants.praat ' ... + '%s %.3f %.3f %d'], curr_wav, frameshift, windowlength, maxFormant); + +else + F1 = NaN; F2 = NaN; F3 = NaN; F4 = NaN; + B1 = NaN; B2 = NaN; B3 = NaN; B4 = NaN; + err = -1; + return; +end + +% Set name of formant track file +fmtfile = [wavfile '.pfmt']; + +%call up praat + +% for pc +if (ispc) + err = system(cmd); + + if (err ~= 0) % oops, error, exit now + F1 = NaN; F2 = NaN; F3 = NaN; F4 = NaN; + B1 = NaN; B2 = NaN; B3 = NaN; B4 = NaN; + if (iwantfilecleanup) + if (exist(fmtfile, 'file') ~= 0) + delete(fmtfile); + end + end + return; + end +end + + +% for mac +if (ismac) + err = unix(cmd); + + if (err ~= 0) % oops, error, exit now + F1 = NaN; F2 = NaN; F3 = NaN; F4 = NaN; + B1 = NaN; B2 = NaN; B3 = NaN; B4 = NaN; + if (iwantfilecleanup) + if (exist(fmtfile, 'file') ~= 0) + delete(fmtfile); + end + end + return; + end +end + +% praat call was successful, return fmt values +F1 = zeros(datalen, 1) * NaN; B1 = zeros(datalen, 1) * NaN; +F2 = zeros(datalen, 1) * NaN; B2 = zeros(datalen, 1) * NaN; +F3 = zeros(datalen, 1) * NaN; B3 = zeros(datalen, 1) * NaN; +F4 = zeros(datalen, 1) * NaN; B4 = zeros(datalen, 1) * NaN; + +% Get formant file + +fid = fopen(fmtfile, 'rt'); + +% read and discard the header +C = textscan(fid, '%s', 1, 'delimiter', '\n'); + +% read the rest +C = textscan(fid, '%f %f %f %f %f %f %f %f %f %f', 'delimiter', '\n', 'TreatAsEmpty', '--undefined--'); +fclose(fid); +t = round(C{1} * 1000); % time locations + +start = 0; % KY changed since Praat doesn't necessarily have data start + % at time = 0 +finish = t(end); +increment = frameshift * 1000; + +for k=start:increment:finish + [val, inx] = min(abs(t - k)); % try to find the closest value + if (abs(t(inx) - k) > frameprecision * frameshift * 1000) % no valid value found + continue; + end + + n = round(k / (frameshift * 1000)) + 1; % KY I added 1 since Matlab + % index starts at 1, not 0 + if (n < 1 || n > datalen) + continue; + end + + F1(n) = C{3}(inx); + B1(n) = C{4}(inx); + F2(n) = C{5}(inx); + B2(n) = C{6}(inx); + F3(n) = C{7}(inx); + B3(n) = C{8}(inx); + F4(n) = C{9}(inx); + B4(n) = C{10}(inx); +end + +if (iwantfilecleanup) + if (exist(fmtfile, 'file') ~= 0) + delete(fmtfile); + end +end