Извлечение двух или одного интервала на уровне

Я новичок в написании сценариев, так что терпите меня: у меня настроен цикл 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, он также "взорвется", так что вы также можете работать с комбинацией обоих объектов.

(Полное раскрытие: я написал этот плагин).

Другие вопросы по тегам