Извлечение двух или одного интервала на уровне
Я новичок в написании сценариев, так что терпите меня: у меня настроен цикл for, и я хочу извлечь данные из трех уровней. Мои первые два уровня работают прекрасно, но у меня проблемы с третьим уровнем.
Таким образом, на третьем уровне, в данной точке цикла, может быть 1 или 2 элемента (мой лингвист-исследователь заставляет меня написать это; у меня нет полного понимания того, что именно я извлекаю) и Я не знаю, как проверить, сколько элементов. Есть ли функция, которую я могу использовать, которая позволяет мне получить количество элементов в данном интервале? На данный момент моя мысль состоит в том, чтобы получить количество элементов третьего уровня в этой точке цикла. Если есть только один, получите его, назначьте правильное имя переменной и продолжайте. Если есть два, возьмите оба.
1 ответ
Я могу придумать два способа сделать это "вручную" и извлекать части TextGrid.
Давайте представим (для ясности), что вы хотите посчитать количество точек, попадающих в данный интервал. Есть некоторые различия между этим и интервалами подсчета, которые попадают в интервалы, но шаги ребенка.
Вручную
Я имею в виду, что вручную вы можете получить индекс "первой" точки в пределах вашего интервала (первая точка после начала интервала), а также индекс "последней" точки, а затем просто вычесть (остерегаться ошибки забора!). Если первый 3
и последнее 8
Вы знаете, что в вашем интервале 6 баллов.
Давайте предположим, что у нас есть это:
textgrid = selected("TextGrid")
main_tier = 1 ; The tier with the main interval
sub_tier = 2 ; The tier with the elements you want to count
interval = 3 ; The interval in the main tier
start = Get start point: main_tier, interval
end = Get end point: main_tier, interval
Тогда мы можем сделать это:
first = Get high index from time: sub_tier, start
last = Get low index from time: sub_tier, end
total = last - first + 1
appendInfoLine: "There are ", total, " points within interval ", interval
(Или вы можете использовать команду "Подсчитать точки в диапазоне..." в плагине tgutils CPrAN).
Если бы вы считали интервалы, вам бы пришлось немного их изменить:
first = Get high interval at time: sub_tier, start
last = Get low interval at time: sub_tier, end
Или, если вы хотите считать только те интервалы, которые полностью попадают в ваш основной интервал
first = Get high interval at time: sub_tier, start
last_edge = Get interval edge from time: sub_tier, end
last = last_edge + 1
Извлечение частей
Совершенно другой подход заключается в использовании команды "Извлечь часть..." для TextGrids. Вы можете извлечь часть TextGrid, которая попадает в ваше временное окно, и затем работать только с этой частью. Подсчет количества интервалов в этой части будет просто подсчет общего количества интервалов в этой новой TextGrid.
Конечно, это не проверяет, находятся ли ваши интервалы, которые считаются внутри, полностью в пределах.
Простой пример:
Extract part: start, end, "yes"
# And then you just count the intervals
intervals = Get number of intervals: sub_tier
# or points
points = Get number of points: sub_tier
Если вы хотите сделать это несколько раз (например, для каждого из интервалов в вашем основном уровне), упомянутый выше плагин tgutils имеет скрипт для "взрыва" TextGrids. Хотя имя может немного нервировать, это просто разделяет TextGrid на куски с интервалом, используя интервалы в заданном уровне (вызывая ту же команду, упомянутую выше). Например, если вы "взорвите" TextGrid, используя интервал с 5 интервалами, вы получите в результате 5 меньших TextGrids, соответствующих каждому из исходных интервалов.
Сценарий может сохранять временные метки результирующих TextGrids, чтобы упростить обращение к оригиналу. И если запустить с выбранной TextGrid и Sound, он также "взорвется", так что вы также можете работать с комбинацией обоих объектов.
(Полное раскрытие: я написал этот плагин).