Dawn@4
|
1 function [labels, start, stop] = func_readTextgrid(filename)
|
Dawn@4
|
2 % [labels, start, stop] = func_readTextgrid(filename)
|
Dawn@4
|
3 % Input: filename - textgrid file
|
Dawn@4
|
4 % Output: labels, start, stop - vectors containing textgrid data
|
Dawn@4
|
5 % Notes: Functions seeks out the "xmin", "xmax", and "text" labels within
|
Dawn@4
|
6 % a textgrid file.
|
Dawn@4
|
7 %
|
Dawn@4
|
8 % Author: Yen-Liang Shue, Speech Processing and Auditory Perception Laboratory, UCLA
|
Dawn@4
|
9 % Copyright UCLA SPAPL 2009
|
Dawn@4
|
10
|
Dawn@4
|
11 POINT_BUFFER = 0.025; % 25 ms buffer on either side of the point
|
Dawn@4
|
12
|
Dawn@4
|
13 if (exist(filename, 'file') == 0)
|
Dawn@4
|
14 fprintf('Error: %s not found\n', filename);
|
Dawn@4
|
15 labels = NaN; start = NaN; stop = NaN;
|
Dawn@4
|
16 return;
|
Dawn@4
|
17 end
|
Dawn@4
|
18
|
Dawn@4
|
19 fid = fopen(filename, 'rt');
|
Dawn@4
|
20 C = textscan(fid, '%s', 'delimiter', '\n');
|
Dawn@4
|
21 fclose(fid);
|
Dawn@4
|
22
|
Dawn@4
|
23 C = C{1};
|
Dawn@4
|
24 tiers = 0;
|
Dawn@4
|
25 proceed_int = 0; % proceed with intervals
|
Dawn@4
|
26 proceed_pnt = 0; % proceed with point-sources
|
Dawn@4
|
27 xmin = 0;
|
Dawn@4
|
28 xmax = 1;
|
Dawn@4
|
29
|
Dawn@4
|
30 for k=1:length(C)
|
Dawn@4
|
31 % try to read a string in the format: %s = %s
|
Dawn@4
|
32 if (isempty(C{k}))
|
Dawn@4
|
33 continue;
|
Dawn@4
|
34 end
|
Dawn@4
|
35
|
Dawn@4
|
36 A = textscan(C{k}, '%[^=] = %s', 'delimiter', '\n');
|
Dawn@4
|
37
|
Dawn@4
|
38 if (~isempty(A{1}{1}))
|
Dawn@4
|
39 switch A{1}{1}
|
Dawn@4
|
40 % intervals
|
Dawn@4
|
41 case {'intervals: size '} % we found the start of a new tier, now allocate mem
|
Dawn@4
|
42 tiers = tiers + 1;
|
Dawn@4
|
43 tier_len = str2num(A{2}{1});
|
Dawn@4
|
44 labels{tiers} = cell(tier_len, 1);
|
Dawn@4
|
45 start{tiers} = zeros(tier_len, 1);
|
Dawn@4
|
46 stop{tiers} = zeros(tier_len, 1);
|
Dawn@4
|
47 cnt = 1;
|
Dawn@4
|
48 proceed_int = 1;
|
Dawn@4
|
49 case {'xmin '}
|
Dawn@4
|
50 if (proceed_int)
|
Dawn@4
|
51 start{tiers}(cnt) = str2num(A{2}{1});
|
Dawn@4
|
52 else
|
Dawn@4
|
53 xmin = str2num(A{2}{1});
|
Dawn@4
|
54 end
|
Dawn@4
|
55 case {'xmax '}
|
Dawn@4
|
56 if (proceed_int)
|
Dawn@4
|
57 stop{tiers}(cnt) = str2num(A{2}{1});
|
Dawn@4
|
58 else
|
Dawn@4
|
59 xmax = str2num(A{2}{1});
|
Dawn@4
|
60 end
|
Dawn@4
|
61 case {'text '}
|
Dawn@4
|
62 if (proceed_int)
|
Dawn@4
|
63 lab = A{2}{1};
|
Dawn@4
|
64 if (lab(end) ~= '"')
|
Dawn@4
|
65 lab = lab(1:end-1);
|
Dawn@4
|
66 end
|
Dawn@4
|
67
|
Dawn@4
|
68 labels{tiers}{cnt} = lab;
|
Dawn@4
|
69 cnt = cnt + 1;
|
Dawn@4
|
70 if (cnt > tier_len)
|
Dawn@4
|
71 proceed_int = 0;
|
Dawn@4
|
72 end
|
Dawn@4
|
73 end
|
Dawn@4
|
74 % point-sources
|
Dawn@4
|
75 case {'points: size '} % we found the start of a new tier, now allocate mem
|
Dawn@4
|
76 tiers = tiers + 1;
|
Dawn@4
|
77 tier_len = str2num(A{2}{1});
|
Dawn@4
|
78 labels{tiers} = cell(tier_len, 1);
|
Dawn@4
|
79 start{tiers} = zeros(tier_len, 1);
|
Dawn@4
|
80 stop{tiers} = zeros(tier_len, 1);
|
Dawn@4
|
81 cnt = 1;
|
Dawn@4
|
82 proceed_pnt = 1;
|
Dawn@4
|
83 case {'time '}
|
Dawn@4
|
84 if (proceed_pnt)
|
Dawn@4
|
85 start{tiers}(cnt) = str2num(A{2}{1}) - POINT_BUFFER;
|
Dawn@4
|
86 stop{tiers}(cnt) = str2num(A{2}{1}) + POINT_BUFFER;
|
Dawn@4
|
87
|
Dawn@4
|
88 if (start{tiers}(cnt) < xmin)
|
Dawn@4
|
89 start{tiers}(cnt) = xmin;
|
Dawn@4
|
90 end
|
Dawn@4
|
91
|
Dawn@4
|
92 if (stop{tiers}(cnt) > xmax)
|
Dawn@4
|
93 stop{tiers}(cnt) = xmas;
|
Dawn@4
|
94 end
|
Dawn@4
|
95 end
|
Dawn@4
|
96 case {'mark '}
|
Dawn@4
|
97 if (proceed_pnt)
|
Dawn@4
|
98 lab = A{2}{1};
|
Dawn@4
|
99 if (lab(end) ~= '"')
|
Dawn@4
|
100 lab = lab(1:end-1);
|
Dawn@4
|
101 end
|
Dawn@4
|
102
|
Dawn@4
|
103 labels{tiers}{cnt} = lab;
|
Dawn@4
|
104 cnt = cnt + 1;
|
Dawn@4
|
105 if (cnt > tier_len)
|
Dawn@4
|
106 proceed_pnt = 0;
|
Dawn@4
|
107 end
|
Dawn@4
|
108 end
|
Dawn@4
|
109
|
Dawn@4
|
110
|
Dawn@4
|
111 end
|
Dawn@4
|
112 end
|
Dawn@4
|
113
|
Dawn@4
|
114 end
|
Dawn@4
|
115
|
Dawn@4
|
116
|
Dawn@4
|
117
|
Dawn@4
|
118
|