1

私はpraatが初めてなので、これは簡単な質問かもしれません。オブジェクト リスト内のいくつかのオブジェクトを for ループで処理し、サイレント インターバルを削除するスクリプトを praat で作成しようとしています。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 を使用して目的のファイルを作成し、選択します。ただし、この行は複数の変数を生成するため、保存できません。したがって、後でオブジェクトディレクトリから削除するための参照がありません。ディレクトリがいっぱいになるように実行することはできますが、これはエレガントではないと思います。助言がありますか?

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

余談selectionですが、CPrAN から利用できるプラグインは、このような場合に Praat オブジェクトの選択を簡単に管理できるように作成されています。@saveSelection()上に挿入された 2 つのループは、 andの呼び出しに置き換えることができます@restoreSelection()(完全な開示: 私はそのプラグインを作成しました)。

于 2016-01-14T12:41:27.187 に答える