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
|