我是新手,所以也许这是一个简单的问题。我尝试在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"
在此行中,提取并选择包含声音的声部。然后我立即使用concatenate创建所需的文件并选择它。但是因为这一行产生了更多的一个变量我无法保存它。因此,稍后我没有从我的对象目录中删除它的引用。虽然我仍然可以运行它,因为我的目录将被淹没,我不认为这是优雅的。有什么建议吗?
答案 0 :(得分: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()
和@restoreSelection()
的调用(完全披露:我编写了该插件)。