2016-09-16 1 views
0

У меня есть следующая проблема: я хочу фильтр нижних частот 240 WAV файлов. Скрипт работает только до тех пор, пока не будут созданы звуковые фильтры с низким проходом и не будут показаны в списке объектов («..._ band»). Однако Praat не экспортирует их как файлы WAV. После выбора выходной папки я получаю предупреждающее сообщение «Команда« Получить количество строк », недоступных для текущего выбора».Как сохранить управляемые файлы WAV в списке объектов?

Одним словом, мой вопрос заключается в том, как я могу сохранить звуки WAV в списке объектов индивидуально с их новыми именами файлов? См. Также Screenshot.

Сценарий см. Ниже.

Большое вам спасибо за помощь!

Привет,

#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. 

ответ

0

На первый взгляд, команда не доступна, потому что, когда вы дойдете до этой точки в сценарии выбор пуст. Он пуст, потому что в конце первого цикла вы выбираете свой объект Strings, а затем Remove.

В общем, ваш сценарий не правильно обрабатывает выбор объекта, что является большой проблемой в Praat, потому что доступные команды изменяются в зависимости от активного выбора.

Так что, даже если вы удалите строку, в которой находится список Remove, вы столкнетесь с проблемой во второй раз, когда вы запустите Get number of strings, потому что к тому времени вы изменили выбор. И даже если вы удалите эту строку (которая вам действительно не нужна), вы будете еще столкнуться с проблемой при запуске selected("Sound") после выбора объекта Strings, потому что к тому времени у вас не будет выбранных Sound объектов (у вас их не было раньше).

Более идиоматическое версия вашего скрипта, который также работает на одной петле, где звуки читаются, фильтруют и удаляют один за другим (который также меньше памяти) будет выглядеть следующим образом:

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 объектов.

Если вам абсолютно необходим цикл (т. Е. Если вы будете работать с действительно большими наборами файлов), вы также можете быть заинтересованы в использовании vieweach plugin, с которым было написано, чтобы попытаться свести к минимуму этот тип шаблона (полная оговорка : Я написал плагин). Я написал более длинный blog post об этом.

+0

Благодарим вас за ответ. К сожалению, это не работает с вашим предложением. – username

+0

Я правильно определил источник проблемы, но не ее степень. Оказывается, у вашего сценария было множество проблем с выбором. Я обновил свой ответ с рабочей версией вашего скрипта и некоторыми ссылками на дополнительные ресурсы. – jja

+0

Большое спасибо за вашу помощь, jja !! Теперь он работает, единственное, что я изменил, это следующее: он сохранил звуки без окончания типа файла: 'Сохранить как WAV-файл: output_dir $ +"/"+ selected $ (" Sound ") +" .wav «' – username

Смежные вопросы