我是praat脚本的新手,所以请耐心等待:我有一个for循环设置,我想从三层中提取数据。我的前两个层工作得很漂亮,但我遇到了第三层的问题。
所以在第三层,在循环的给定点,可能有1或2个元素,(我的语言学研究员让我写这个;我没有完全理解我到底是什么提取),我不知道如何检查有多少元素。是否有一个我可以使用的功能,允许我以给定的间隔获得元素的数量?我现在的思路是在循环中获得第三层中元素的数量。如果只有一个,那么获取那个,将其分配给正确的变量名称,然后继续。如果有两个,抓住两个。
答案 0 :(得分:0)
我可以想到两种方法来做到这一点,"手动"并通过提取TextGrid的部分。
让我们想象(为了清楚起见)您想要计算在给定间隔内的点数。这个和计数间隔之间存在一些差异,这些差异在间隔内,但是婴儿步骤。
我手动的意思是你可以获得"第一个"的索引。你的间隔内的点(间隔开始后的第一个点),以及" last"的指数。点,然后只是减去(小心fencepost errors!)。如果第一个是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
(或者你可以在"Count points in range..." CPrAN插件中使用tgutils命令。
如果你计算间隔时间,你必须稍微改变一下:
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的那部分 落在你的时间窗口内,然后只与该部分一起工作。 计算该部分中的间隔数将简单地为a 计算新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 plugin都有一个脚本 "explode" TextGrids。虽然名字可能有点令人不安, 这只是使用。将TextGrid分隔为区间大小的块 给定层中的间隔(通过调用上面提到的相同命令)。例如,如果你"爆炸"一个TextGrid 使用具有5个间隔的间隔层,您将得到结果5 较小的TextGrid,对应于每个原始间隔。
脚本可以保留生成的TextGrids的时间戳 让它更容易回溯到原始。如果运行一个 选择了TextGrid和一个声音,它会爆炸"爆炸"声音也是如此 你也可以处理这两个对象的组合。
(完全披露:我写了那个插件)。