Mercurial > hg > emotion-detection-top-level
diff Code/Descriptors/Matlab/MPEG7/FromWeb/VoiceSauce/func_PraatPitch.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_PraatPitch.m Wed Feb 13 11:02:39 2013 +0000 @@ -0,0 +1,136 @@ +function [F0, err] = func_PraatPitch(wavfile, frameshift, frameprecision, minF0, maxF0, ... + silthres, voicethres, octavecost, ... + octavejumpcost, voiunvoicost, ... + killoctavejumps, smooth, smoothbw, ... + interpolate, method, datalen) +% [F0, err = func_PraatPitch(wavfile, frameshift, maxF0, minF0, +% voicethres, octavecost, octavejumpcost, voiunvoicost, datalen) +% Input: wavfile - input wav file +% frameshift - in seconds +% maxF0 - maximum F0 +% minF0 - minimum F0 +% silthres - Silence threshold (Praat specific) +% voicethres - Voice threshold (Praat specific) +% octavecost - Octave Cost (Praat specific) +% octavejumpcost - Octave Jump Cost (Praat specific) +% voiunvoicost - Voiced/unvoiced Cost (Praat specific) +% killoctavejumps - Kill octave jumps? (Praat specific) +% smooth - Smooth? (Praat specific) +% smoothbw - Smoothing bandwidth (Hz) (Praat specific) +% interpolate - Interpolate? (Praat specific) +% method - autocorrelation (ac) or cross-correlation (cc) +% datalen - output data length +% Output: F0 - F0 values +% err - error flag +% Notes: This currently only works on PC and Mac. +% +% Author: Yen-Liang Shue, Speech Processing and Auditory Perception Laboratory, UCLA +% Modified by Kristine Yu 2010-10-16 +% Copyright UCLA SPAPL 2010 + +% settings +iwantfilecleanup = 1; %delete 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\\praatF0.praat %s %.3f ' ... + '%.3f %.3f %.3f %.3f %.3f %.3f %.3f %d %d %.3f %d %s'], pwavfile, frameshift, minF0, maxF0, silthres, ... + voicethres, octavecost, octavejumpcost, voiunvoicost, ... + killoctavejumps, smooth, smoothbw, interpolate, method); + 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/praatF0.praat %s %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %d %d %.3f %d %s'], curr_wav, frameshift, minF0, maxF0, silthres, voicethres, octavecost, octavejumpcost, voiunvoicost, killoctavejumps, smooth, smoothbw, interpolate, method); + +else % otherwise + F0 = NaN; + err = -1; + return; +end + +%call up praat for pc +if (ispc) + err = system(cmd); + + if (err ~= 0) % oops, error, exit now + F0 = NaN; + if (iwantfilecleanup) + if (exist(f0file, 'file') ~= 0) + delete(f0file); + end + end + return; + end +end + +%call up praat for Mac OSX +if (ismac) + err = unix(cmd); + + if (err ~= 0) % oops, error, exit now + F0 = NaN; + if (iwantfilecleanup) + if (exist(f0file, 'file') ~= 0) + delete(f0file); + end + end + return; + end +end + + +% Get f0 file +if strcmp(method, 'ac') %if autocorrelation, get .praatac file + f0file = [wavfile '.praatac']; +else + f0file = [wavfile '.praatcc']; % else, cross-correlation, get .praatcc file +end + + +% praat call was successful, return F0 values +F0 = zeros(datalen, 1) * NaN; + +fid = fopen(f0file, 'rt'); + +% read the rest +C = textscan(fid, '%f %f', 'delimiter', '\n', 'TreatAsEmpty', '--undefined--'); +fclose(fid); + +t = round(C{1} * 1000); % time locations from praat pitch track + +%KY Since Praat outputs no values in silence/if no f0 value returned, must pad with leading +% undefined values if needed, so we set start time to 0, rather than t(1) + +start = 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 a one since + % Matlab indexing starts at 1 + % not 0 + if (n < 1 || n > datalen) + continue; + end + + F0(n) = C{2}(inx); +end + +if (iwantfilecleanup) + if (exist(f0file, 'file') ~= 0) + delete(f0file); + end +end