Praat 将两层合并为一层
Praat combining two tiers into one tier
我在文本网格中有两层,我想将它们合并为一层。每一层都是不同的扬声器。每层内的间隔不重叠。这可能吗?我已经看到很多 Praat 脚本会合并或连接但没有合并它们。我正在尝试使用 Python tgt 模块来执行此操作,但进展缓慢。我已经挖掘了一段时间,所以非常感谢任何关于如何解决这个问题的建议!谢谢。
前段时间我写了 a script 用于查找非重叠间隔,也在具有不同说话者的层中。虽然任务不同,但脚本创建的 TextGrid 可以用于您想要的。
该脚本的逻辑在 a procedure 中,可以将其包含到您正在使用的任何脚本中(如果您喜欢那种东西,也可以将其嵌入其中)。
如果您包含该过程(物理复制或 include
ing),您可以
old = selected("TextGrid")
@toNonOverlappingTiers()
new = selected("TextGrid")
之后,new
TextGrid 将有一个单独的层,所有间隔来自其他层 "flattened out"。此新层中具有非零标签的每个间隔将代表 old
TextGrid 的块,该块包含在最多一个层中的标记间隔中。 old
中的任何标记间隔中均未包含未标记间隔。其余标签告诉您包含它们的唯一标记间隔的层号。
所以在运行上面的例子之后,你可以做
# Loop through intervals in the new TextGrid
selectObject: new
for i to do("Get number of intervals...", 1)
label$ = Get label of interval: 1, i
# Since your original TextGrid had no overlapping intervals
# you only want labeled intervals (there will be no zeros)
if label$ != ""
# Get the midpoint, to match to intervals in a different
# tier in the original TextGrid
tier = number(label$)
start = Get start point: 1, i
end = Get end point: 1, i
midpoint = ((end - start) / 2) + start
# Get the original label
selectObject: old
j = Get interval at time: tier, midpoint
original$ = Get label of interval: tier, j
# Apply the original label to the new TextGrid
selectObject: new
Set interval text: 1, i, original$
endif
endfor
出于存档目的:
# This procedure is a part of the tgutils plugin
# Please see http://cpran.net/plugins/tgutils for more details
procedure toNonOverlappingIntervals ()
# Original TextGrid
.tg = selected("TextGrid")
.tiers = Get number of tiers
.start = Get start time
.end = Get end time
# Overlap TextGrid
.id = Create TextGrid: .start, .end, "overlap", ""
# Populate overlap tier with "flattened" intervals from all tiers
for .tier to .tiers
selectObject: .tg
.intervals = Get number of intervals: .tier
for .interval to .intervals-1
selectObject: .tg
.end = Get end point: .tier, .interval
# We use nocheck because there might already be a boundary there
selectObject: .id
nocheck Insert boundary: 1, .end
endfor
endfor
# Cycle through the flattened intervals to check how many spoken intervals
# align with each. A segment in the overlap tier will be considered to have no
# overlap if and only if there is one tier with a speech labeled interval which
# coincides with it.
selectObject: .id
.flat_intervals = Get number of intervals: 1
for .interval to .flat_intervals
.start = Get start point: 1, .interval
.end = Get end point: 1, .interval
.midpoint = (.end - .start) / 2 + .start
# Count how many speakers are speaking over that flattened interval
.speakers = 0
for .tier to .tiers
selectObject: .tg
.interval_number = Get interval at time: .tier, .midpoint
.label$ = Get label of interval: .tier, .interval_number
if .label$ != ""
# Increment the number of speakers for each labeled coinciding interval
# on any tier. We also save the tier number of the (last) speaker, so we
# know where to look for measurements later.
.speakers += 1
.speaker_tier = .tier
endif
endfor
# Label the overlap intervals. Blank intervals are matched by no speakers in
# any tier. Intervals labeled "0" are matched by more than one speaker, in
# more than one tier. The rest contain the tier number of the single speaker
# speaking at that time.
selectObject: .id
if .speakers = 1
Set interval text: 1, .interval, string$(.speaker_tier)
elif .speakers > 1
Set interval text: 1, .interval, "0"
else
Set interval text: 1, .interval, ""
endif
endfor
endproc
我在文本网格中有两层,我想将它们合并为一层。每一层都是不同的扬声器。每层内的间隔不重叠。这可能吗?我已经看到很多 Praat 脚本会合并或连接但没有合并它们。我正在尝试使用 Python tgt 模块来执行此操作,但进展缓慢。我已经挖掘了一段时间,所以非常感谢任何关于如何解决这个问题的建议!谢谢。
前段时间我写了 a script 用于查找非重叠间隔,也在具有不同说话者的层中。虽然任务不同,但脚本创建的 TextGrid 可以用于您想要的。
该脚本的逻辑在 a procedure 中,可以将其包含到您正在使用的任何脚本中(如果您喜欢那种东西,也可以将其嵌入其中)。
如果您包含该过程(物理复制或 include
ing),您可以
old = selected("TextGrid")
@toNonOverlappingTiers()
new = selected("TextGrid")
之后,new
TextGrid 将有一个单独的层,所有间隔来自其他层 "flattened out"。此新层中具有非零标签的每个间隔将代表 old
TextGrid 的块,该块包含在最多一个层中的标记间隔中。 old
中的任何标记间隔中均未包含未标记间隔。其余标签告诉您包含它们的唯一标记间隔的层号。
所以在运行上面的例子之后,你可以做
# Loop through intervals in the new TextGrid
selectObject: new
for i to do("Get number of intervals...", 1)
label$ = Get label of interval: 1, i
# Since your original TextGrid had no overlapping intervals
# you only want labeled intervals (there will be no zeros)
if label$ != ""
# Get the midpoint, to match to intervals in a different
# tier in the original TextGrid
tier = number(label$)
start = Get start point: 1, i
end = Get end point: 1, i
midpoint = ((end - start) / 2) + start
# Get the original label
selectObject: old
j = Get interval at time: tier, midpoint
original$ = Get label of interval: tier, j
# Apply the original label to the new TextGrid
selectObject: new
Set interval text: 1, i, original$
endif
endfor
出于存档目的:
# This procedure is a part of the tgutils plugin
# Please see http://cpran.net/plugins/tgutils for more details
procedure toNonOverlappingIntervals ()
# Original TextGrid
.tg = selected("TextGrid")
.tiers = Get number of tiers
.start = Get start time
.end = Get end time
# Overlap TextGrid
.id = Create TextGrid: .start, .end, "overlap", ""
# Populate overlap tier with "flattened" intervals from all tiers
for .tier to .tiers
selectObject: .tg
.intervals = Get number of intervals: .tier
for .interval to .intervals-1
selectObject: .tg
.end = Get end point: .tier, .interval
# We use nocheck because there might already be a boundary there
selectObject: .id
nocheck Insert boundary: 1, .end
endfor
endfor
# Cycle through the flattened intervals to check how many spoken intervals
# align with each. A segment in the overlap tier will be considered to have no
# overlap if and only if there is one tier with a speech labeled interval which
# coincides with it.
selectObject: .id
.flat_intervals = Get number of intervals: 1
for .interval to .flat_intervals
.start = Get start point: 1, .interval
.end = Get end point: 1, .interval
.midpoint = (.end - .start) / 2 + .start
# Count how many speakers are speaking over that flattened interval
.speakers = 0
for .tier to .tiers
selectObject: .tg
.interval_number = Get interval at time: .tier, .midpoint
.label$ = Get label of interval: .tier, .interval_number
if .label$ != ""
# Increment the number of speakers for each labeled coinciding interval
# on any tier. We also save the tier number of the (last) speaker, so we
# know where to look for measurements later.
.speakers += 1
.speaker_tier = .tier
endif
endfor
# Label the overlap intervals. Blank intervals are matched by no speakers in
# any tier. Intervals labeled "0" are matched by more than one speaker, in
# more than one tier. The rest contain the tier number of the single speaker
# speaking at that time.
selectObject: .id
if .speakers = 1
Set interval text: 1, .interval, string$(.speaker_tier)
elif .speakers > 1
Set interval text: 1, .interval, "0"
else
Set interval text: 1, .interval, ""
endif
endfor
endproc