Mercurial > hg > emotion-detection-top-level
view 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 source
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