Dawn@4: function [labels, start, stop] = func_readTextgrid(filename) Dawn@4: % [labels, start, stop] = func_readTextgrid(filename) Dawn@4: % Input: filename - textgrid file Dawn@4: % Output: labels, start, stop - vectors containing textgrid data Dawn@4: % Notes: Functions seeks out the "xmin", "xmax", and "text" labels within Dawn@4: % a textgrid file. Dawn@4: % Dawn@4: % Author: Yen-Liang Shue, Speech Processing and Auditory Perception Laboratory, UCLA Dawn@4: % Copyright UCLA SPAPL 2009 Dawn@4: Dawn@4: POINT_BUFFER = 0.025; % 25 ms buffer on either side of the point Dawn@4: Dawn@4: if (exist(filename, 'file') == 0) Dawn@4: fprintf('Error: %s not found\n', filename); Dawn@4: labels = NaN; start = NaN; stop = NaN; Dawn@4: return; Dawn@4: end Dawn@4: Dawn@4: fid = fopen(filename, 'rt'); Dawn@4: C = textscan(fid, '%s', 'delimiter', '\n'); Dawn@4: fclose(fid); Dawn@4: Dawn@4: C = C{1}; Dawn@4: tiers = 0; Dawn@4: proceed_int = 0; % proceed with intervals Dawn@4: proceed_pnt = 0; % proceed with point-sources Dawn@4: xmin = 0; Dawn@4: xmax = 1; Dawn@4: Dawn@4: for k=1:length(C) Dawn@4: % try to read a string in the format: %s = %s Dawn@4: if (isempty(C{k})) Dawn@4: continue; Dawn@4: end Dawn@4: Dawn@4: A = textscan(C{k}, '%[^=] = %s', 'delimiter', '\n'); Dawn@4: Dawn@4: if (~isempty(A{1}{1})) Dawn@4: switch A{1}{1} Dawn@4: % intervals Dawn@4: case {'intervals: size '} % we found the start of a new tier, now allocate mem Dawn@4: tiers = tiers + 1; Dawn@4: tier_len = str2num(A{2}{1}); Dawn@4: labels{tiers} = cell(tier_len, 1); Dawn@4: start{tiers} = zeros(tier_len, 1); Dawn@4: stop{tiers} = zeros(tier_len, 1); Dawn@4: cnt = 1; Dawn@4: proceed_int = 1; Dawn@4: case {'xmin '} Dawn@4: if (proceed_int) Dawn@4: start{tiers}(cnt) = str2num(A{2}{1}); Dawn@4: else Dawn@4: xmin = str2num(A{2}{1}); Dawn@4: end Dawn@4: case {'xmax '} Dawn@4: if (proceed_int) Dawn@4: stop{tiers}(cnt) = str2num(A{2}{1}); Dawn@4: else Dawn@4: xmax = str2num(A{2}{1}); Dawn@4: end Dawn@4: case {'text '} Dawn@4: if (proceed_int) Dawn@4: lab = A{2}{1}; Dawn@4: if (lab(end) ~= '"') Dawn@4: lab = lab(1:end-1); Dawn@4: end Dawn@4: Dawn@4: labels{tiers}{cnt} = lab; Dawn@4: cnt = cnt + 1; Dawn@4: if (cnt > tier_len) Dawn@4: proceed_int = 0; Dawn@4: end Dawn@4: end Dawn@4: % point-sources Dawn@4: case {'points: size '} % we found the start of a new tier, now allocate mem Dawn@4: tiers = tiers + 1; Dawn@4: tier_len = str2num(A{2}{1}); Dawn@4: labels{tiers} = cell(tier_len, 1); Dawn@4: start{tiers} = zeros(tier_len, 1); Dawn@4: stop{tiers} = zeros(tier_len, 1); Dawn@4: cnt = 1; Dawn@4: proceed_pnt = 1; Dawn@4: case {'time '} Dawn@4: if (proceed_pnt) Dawn@4: start{tiers}(cnt) = str2num(A{2}{1}) - POINT_BUFFER; Dawn@4: stop{tiers}(cnt) = str2num(A{2}{1}) + POINT_BUFFER; Dawn@4: Dawn@4: if (start{tiers}(cnt) < xmin) Dawn@4: start{tiers}(cnt) = xmin; Dawn@4: end Dawn@4: Dawn@4: if (stop{tiers}(cnt) > xmax) Dawn@4: stop{tiers}(cnt) = xmas; Dawn@4: end Dawn@4: end Dawn@4: case {'mark '} Dawn@4: if (proceed_pnt) Dawn@4: lab = A{2}{1}; Dawn@4: if (lab(end) ~= '"') Dawn@4: lab = lab(1:end-1); Dawn@4: end Dawn@4: Dawn@4: labels{tiers}{cnt} = lab; Dawn@4: cnt = cnt + 1; Dawn@4: if (cnt > tier_len) Dawn@4: proceed_pnt = 0; Dawn@4: end Dawn@4: end Dawn@4: Dawn@4: Dawn@4: end Dawn@4: end Dawn@4: Dawn@4: end Dawn@4: Dawn@4: Dawn@4: Dawn@4: