annotate 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
rev   line source
Dawn@4 1 function [F1, F2, F3, F4, B1, B2, B3, B4, err] = func_PraatFormants(wavfile, ...
Dawn@4 2 windowlength, frameshift, frameprecision, datalen)
Dawn@4 3 % [F1, F2, F3, F4, B1, B2, B3, B4, err] = func_PraatFormants(wavfile, windowlength, frameshift, frameprecision, datalen)
Dawn@4 4 % KY Time-stamp: <2010-10-16 21:47:24 amoebe>
Dawn@4 5 % Input: wavfile - input wav file
Dawn@4 6 % windowlength - windowlength in seconds
Dawn@4 7 % frameshift - in seconds
Dawn@4 8 % frameprecision - unitless
Dawn@4 9 % datalen - output data length
Dawn@4 10 % Output: Fx, Bx - formant and bandwidth vectors
Dawn@4 11 % err - error flag
Dawn@4 12 % Notes: This currently only works on a PC.
Dawn@4 13 %
Dawn@4 14 % Author: Yen-Liang Shue, Speech Processing and Auditory Perception Laboratory, UCLA
Dawn@4 15 % Modified by Kristine Yu, 2010-10-16 to allow for variable precision in
Dawn@4 16 % matching up time alignment between data vectors.
Dawn@4 17 %
Dawn@4 18 % Copyright UCLA SPAPL 2010
Dawn@4 19
Dawn@4 20 % settings
Dawn@4 21 maxFormant = 6000;
Dawn@4 22 iwantfilecleanup = 1; %delete pfmt files when done
Dawn@4 23
Dawn@4 24 % check if we need to put double quotes around wavfile
Dawn@4 25 if (wavfile(1) ~= '"')
Dawn@4 26 pwavfile = ['"' wavfile '"'];
Dawn@4 27 else
Dawn@4 28 pwavfile = wavfile;
Dawn@4 29 end
Dawn@4 30
Dawn@4 31 if (ispc) % pc can run praatcon.exe
Dawn@4 32 cmd = sprintf('Windows\\praatcon.exe Windows\\praatformants.praat %s %.3f %.3f %d', pwavfile, frameshift, windowlength, maxFormant);
Dawn@4 33
Dawn@4 34 elseif (ismac) % mac osx can run Praat using terminal, call Praat from
Dawn@4 35 % Nix/ folder
Dawn@4 36 curr_dir = pwd;
Dawn@4 37 curr_wav = [curr_dir wavfile(2:end)];
Dawn@4 38
Dawn@4 39 cmd = sprintf(['MacOS/Praat Windows/praatformants.praat ' ...
Dawn@4 40 '%s %.3f %.3f %d'], curr_wav, frameshift, windowlength, maxFormant);
Dawn@4 41
Dawn@4 42 else
Dawn@4 43 F1 = NaN; F2 = NaN; F3 = NaN; F4 = NaN;
Dawn@4 44 B1 = NaN; B2 = NaN; B3 = NaN; B4 = NaN;
Dawn@4 45 err = -1;
Dawn@4 46 return;
Dawn@4 47 end
Dawn@4 48
Dawn@4 49 % Set name of formant track file
Dawn@4 50 fmtfile = [wavfile '.pfmt'];
Dawn@4 51
Dawn@4 52 %call up praat
Dawn@4 53
Dawn@4 54 % for pc
Dawn@4 55 if (ispc)
Dawn@4 56 err = system(cmd);
Dawn@4 57
Dawn@4 58 if (err ~= 0) % oops, error, exit now
Dawn@4 59 F1 = NaN; F2 = NaN; F3 = NaN; F4 = NaN;
Dawn@4 60 B1 = NaN; B2 = NaN; B3 = NaN; B4 = NaN;
Dawn@4 61 if (iwantfilecleanup)
Dawn@4 62 if (exist(fmtfile, 'file') ~= 0)
Dawn@4 63 delete(fmtfile);
Dawn@4 64 end
Dawn@4 65 end
Dawn@4 66 return;
Dawn@4 67 end
Dawn@4 68 end
Dawn@4 69
Dawn@4 70
Dawn@4 71 % for mac
Dawn@4 72 if (ismac)
Dawn@4 73 err = unix(cmd);
Dawn@4 74
Dawn@4 75 if (err ~= 0) % oops, error, exit now
Dawn@4 76 F1 = NaN; F2 = NaN; F3 = NaN; F4 = NaN;
Dawn@4 77 B1 = NaN; B2 = NaN; B3 = NaN; B4 = NaN;
Dawn@4 78 if (iwantfilecleanup)
Dawn@4 79 if (exist(fmtfile, 'file') ~= 0)
Dawn@4 80 delete(fmtfile);
Dawn@4 81 end
Dawn@4 82 end
Dawn@4 83 return;
Dawn@4 84 end
Dawn@4 85 end
Dawn@4 86
Dawn@4 87 % praat call was successful, return fmt values
Dawn@4 88 F1 = zeros(datalen, 1) * NaN; B1 = zeros(datalen, 1) * NaN;
Dawn@4 89 F2 = zeros(datalen, 1) * NaN; B2 = zeros(datalen, 1) * NaN;
Dawn@4 90 F3 = zeros(datalen, 1) * NaN; B3 = zeros(datalen, 1) * NaN;
Dawn@4 91 F4 = zeros(datalen, 1) * NaN; B4 = zeros(datalen, 1) * NaN;
Dawn@4 92
Dawn@4 93 % Get formant file
Dawn@4 94
Dawn@4 95 fid = fopen(fmtfile, 'rt');
Dawn@4 96
Dawn@4 97 % read and discard the header
Dawn@4 98 C = textscan(fid, '%s', 1, 'delimiter', '\n');
Dawn@4 99
Dawn@4 100 % read the rest
Dawn@4 101 C = textscan(fid, '%f %f %f %f %f %f %f %f %f %f', 'delimiter', '\n', 'TreatAsEmpty', '--undefined--');
Dawn@4 102 fclose(fid);
Dawn@4 103 t = round(C{1} * 1000); % time locations
Dawn@4 104
Dawn@4 105 start = 0; % KY changed since Praat doesn't necessarily have data start
Dawn@4 106 % at time = 0
Dawn@4 107 finish = t(end);
Dawn@4 108 increment = frameshift * 1000;
Dawn@4 109
Dawn@4 110 for k=start:increment:finish
Dawn@4 111 [val, inx] = min(abs(t - k)); % try to find the closest value
Dawn@4 112 if (abs(t(inx) - k) > frameprecision * frameshift * 1000) % no valid value found
Dawn@4 113 continue;
Dawn@4 114 end
Dawn@4 115
Dawn@4 116 n = round(k / (frameshift * 1000)) + 1; % KY I added 1 since Matlab
Dawn@4 117 % index starts at 1, not 0
Dawn@4 118 if (n < 1 || n > datalen)
Dawn@4 119 continue;
Dawn@4 120 end
Dawn@4 121
Dawn@4 122 F1(n) = C{3}(inx);
Dawn@4 123 B1(n) = C{4}(inx);
Dawn@4 124 F2(n) = C{5}(inx);
Dawn@4 125 B2(n) = C{6}(inx);
Dawn@4 126 F3(n) = C{7}(inx);
Dawn@4 127 B3(n) = C{8}(inx);
Dawn@4 128 F4(n) = C{9}(inx);
Dawn@4 129 B4(n) = C{10}(inx);
Dawn@4 130 end
Dawn@4 131
Dawn@4 132 if (iwantfilecleanup)
Dawn@4 133 if (exist(fmtfile, 'file') ~= 0)
Dawn@4 134 delete(fmtfile);
Dawn@4 135 end
Dawn@4 136 end