0

次の問題があります: 240 の WAV ファイルをローパス フィルター処理したいです。スクリプトは、ローパス フィルター処理されたサウンドが作成され、オブジェクト リスト ("..._band") に表示されるまでのみ実行されます。ただし、Praat はそれらを WAV ファイルとしてエクスポートしません。出力フォルダーを選択した後、「コマンド '文字列の数を取得' は現在の選択には使用できません」という警告メッセージが表示されます。

要するに、WAV サウンドを新しいファイル名で個別にオブジェクト リストに保存するにはどうすればよいですか? スクリーンショットも参照してください。

スクリプトは以下を参照してください。

ご助力ありがとうございます!

ご挨拶、

#determine praat version
ver1$ = left$(praatVersion$, (rindex(praatVersion$, ".")-1));
ver1 = 'ver1$'
if ver1 < 5.2
    exit Please download a more recent version of Praat
endif

if ver1 == 5.2
    ver2$ = right$(praatVersion$, length(praatVersion$) - (rindex(praatVersion$, ".")));
    ver2 = 'ver2$'
    if ver2 < 4
        exit Please download a more recent version of Praat (minor)
    endif
endif

beginPause ("Low-Pass Filter Instructions")
    comment ("1. Select a folder containing the wave files to be low-pass filtered")
    comment ("2. Wave files will be low-pass filtered (0 - 400 Hz)")
    comment ("3. Select an output folder for the low-pass filtered wave files to be saved to")
    comment ("Click 'Next' to begin")
clicked = endPause("Next", 1);

#wavefile folder path
sourceDir$ = chooseDirectory$ ("Select folder containing wave files")
if sourceDir$ == ""
    exit Script exited. You did not select a folder.
else
    sourceDir$ = sourceDir$ + "/";
endif

Create Strings as file list... list 'sourceDir$'/*.wav

numberOfFiles = Get number of strings
levels$ = ""
for ifile to numberOfFiles
    select Strings list
    currentList = selected ("Strings")
    filename$ = Get string... ifile
    Read from file... 'sourceDir$'/'filename$'
    currentSound = selected ("Sound")
    filterFreqRange = Filter (pass Hann band)... 0 400 20

    select currentSound
    Remove

endfor

select currentList
Remove

#output folder path  - where the wave files get saved
outputDir$ = chooseDirectory$ ("Select folder to save wave files")
if outputDir$ == ""
    exit Script exited. You did not select a folder.
else
    outputDir$ = outputDir$ + "/";
endif

numberOfFiles = Get number of strings
for ifile to numberOfFiles
    select Strings list
    currentList = selected ("Strings")
    filename$ = Get string... ifile
    currentSound = selected ("Sound")
    endif
    Save as WAV file... 'outputDir$'/'filename$'
    select currentSound
    Remove
endfor

#clean up
select currentList
Remove

#clear the info window
clearinfo
#print success message
printline Successfully low-pass filtered 'numberOfFiles' wave files.
4

1 に答える 1

1

一見すると、スクリプトのそのポイントに到達すると選択が空になるため、コマンドは使用できません。最初のループの最後でオブジェクトを選択してStringsからオブジェクトを選択するため、空ですRemove

より一般的には、スクリプトがオブジェクトの選択を適切に処理していません。これは、アクティブな選択によって使用可能なコマンドが変化するため、Praat では大きな問題です。

そのため、リストの行を削除してもRemove、2 回目の実行時に問題が発生しますGet number of strings。それまでに選択が変更されているためです。また、その行を削除しても (実際には必要ありません)、オブジェクトを選択した後に実行すると問題が発生しますとにかく前にそれら)。selected("Sound")StringsSound

スクリプトのより慣用的なバージョンは、サウンドが 1 つずつ読み取られ、フィルター処理され、削除される単一のループでも実行されます (メモリ効率も向上します)。

form Low-Pass Filter...
    real From_frequency_(Hz) 0
    real To_frequency_(Hz) 400
    real Smoothing_(Hz) 20
    comment Leave paths empty for GUI selectors
    sentence Source_dir 
    sentence Output_dir 
endform

if praatVersion < 5204
  exitScript: "Please download a more recent version of Praat"
endif

if source_dir$ == ""
    source_dir$ = chooseDirectory$("Select folder containing wave files")
    if source_dir$ == ""
        exit
    endif
endif

if output_dir$ == ""
    output_dir$ = chooseDirectory$("Select folder to save filtered files")
    if output_dir$ == ""
        exit
    endif
endif

list = Create Strings as file list: "list", source_dir$ + "/*.wav"
numberOfFiles = Get number of strings
levels$ = ""

for i to numberOfFiles
    selectObject: list
    filename$ = Get string: i
    sound = Read from file: source_dir$ + "/" + filename$
    filtered = Filter (pass Hann band): from_frequency, to_frequency, smoothing

    Save as WAV file: output_dir$ + "/" + selected$("Sound")
    removeObject: sound, filtered
endfor

それを知りたいと思うかもしれませんが、ファイルの自動読み取りと保存が必要ない場合 (つまり、スクリプトをリストのオブジェクトで動作させることに問題がない場合)、スクリプトは次のように縮小できます。

Filter (pass Hann band): 0, 400, 20

複数の選択されたSoundオブジェクトで機能します。

ループが絶対に必要な場合 (つまり、非常に大きなファイルのセットで作業する場合)、vieweachpluginの使用にも興味があるかもしれません。 with は、こ​​の種のボイラープレートを最小限に抑えるように書かれています (完全な免責事項: 私はプラグイン)。私はそれについても長いブログ記事を書きました。

于 2016-09-17T08:14:03.900 に答える