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

Я новичок в написании сценариев praat, так что потерпите меня: у меня настроен цикл for, и я хочу извлечь данные из трех уровней. Мои первые два уровня работают прекрасно, но у меня проблемы с третьим уровнем.

Таким образом, на третьем уровне в заданной точке цикла может быть 1 или 2 элемента (мой исследователь-лингвист заставляет меня написать это; у меня нет полного понимания того, что именно я извлекаю) и Я не знаю, как проверить, сколько элементов. Есть ли функция, которую я могу использовать, которая позволяет мне получить количество элементов с заданным интервалом? На данный момент я думаю о том, чтобы получить количество элементов на третьем уровне в этой точке цикла. Если есть только один, получите его, присвойте ему правильное имя переменной и двигайтесь дальше. Если их два, берите оба.


person Dan    schedule 29.12.2015    source источник


Ответы (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

Извлечение деталей

Совершенно другим подходом было бы использование команды «Извлечь часть...» для TextGrid. Вы можете извлечь часть 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, упомянутый выше, имеет скрипт для "взрывания" TextGrid. Хотя название может немного нервировать, оно просто разделяет TextGrid на куски размером с интервал, используя интервалы в заданном уровне (путем вызова той же команды, упомянутой выше). Например, если вы «взорвете» TextGrid, используя интервальный уровень с 5 интервалами, в результате вы получите 5 меньших TextGrid, соответствующих каждому из исходных интервалов.

Сценарий может сохранять метки времени результирующих элементов TextGrid, чтобы упростить обращение к оригиналу. И если запустить с TextGrid и выбранным звуком, он также «взорвет» звук, поэтому вы также можете работать с комбинацией обоих объектов.

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

person jja    schedule 18.01.2016
comment
Привет, я знаю, что это старый пост, но не могли бы вы рассказать мне, что делает Get interval edge at time? Спасибо! - person Lisa; 07.07.2019