1

我是新来的,所以也许这是一个简单的问题。我尝试在 praat 中创建一个脚本,该脚本将使用 for 循环遍历我的对象列表中的一些对象,并将删除静默间隔。我已经创建了这个脚本,我将把它放在一个 for 循环中。

selectObject: i
inten=To Intensity... 100 0 "no"
txt=To TextGrid (silences)... -35 0.1 0.05 'silent' 'sounding'
selectObject: i
plusObject: txt
Extract intervals where: 1, "no", "contains", "sounding"
myobj=Concatenate
Copy: string$(i)
selectObject: inten
plusObject: txt
plusObject: myobj
Remove

虽然我得到了我想要的,但我的问题就在这条线上

Extract intervals where: 1, "no", "contains", "sounding"

在这一行中,包含声音的部分被提取和选择。然后我立即使用连接来创建所需的文件并选择它。但是,因为这一行产生的变量不止一个,所以我无法保存它。因此,稍后我没有将其从我的对象目录中删除的参考。虽然我仍然可以运行它,但我的目录会被淹没,我认为这并不优雅。有什么建议么?

4

1 回答 1

2

这听起来很明显,但是您可以保存多个提取间隔的 ID 号,方法是将它们中的每一个保存到索引变量中,然后在需要删除它们时重新选择它们。

您将在下面找到脚本的编辑和注释版本。我更改了一些变量名称以使其更易于理解。

sound = selected()
intensity = To Intensity: 100, 0, "no"
textgrid = To TextGrid (silences): -35, 0.1, 0.05, silent, sounding

# Select multiple objects at once
selectObject: sound, textgrid

Extract intervals where: 1, "no", "contains", "sounding"

# Save the ID numbers of the currently selected intervals
total_parts = numberOfSelected()
for i to total_parts
  part[i] = selected(i)
endfor

# No need to make a copy just to rename
sounding = Concatenate
Rename: string$(sound)

# Select all the objects you want to remove
selectObject: intensity, textgrid
# Including the extracted intervals
for i to total_parts
  plusObject: part[i]
endfor
# And remove them
Remove

# If you knew beforehand what objects to select,
# you could also use removeObject()

# Select your concatenated sound
selectObject: sounding

顺便说一句,通过 CPrAN 提供的selection插件是为了更容易管理此类情况下的 Praat 对象选择而编写的。上面插入的两个循环可以替换为对@saveSelection()and的调用@restoreSelection()(完全披露:我编写了那个插件)。

于 2016-01-14T12:41:27.187 回答