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