Как я могу заставить вложенные циклы работать в Praat, чтобы обнаружить начало во всем каталоге?
Это мой первый вопрос, и я делаю все возможное, чтобы быть ясным. Я просмотрел сайт, не найдя ни одного прежнего вопроса, который мог бы мне помочь.
Я пытаюсь получить сценарий обнаружения начала в praat для цикла для всего каталога. Я вложил сценарий обнаружения начала как внутренний цикл во внешний цикл, проходящий через каждый файл в определенной библиотеке. Тем не менее, я не могу заставить его работать. Я только получил начало для первого файла в моем каталоге. Сценарий обнаружения начала хорошо работает сам по себе, а внешний цикл прекрасно работает с другими командами, такими как, например, "получить интенсивность". Кто-нибудь может увидеть, что я делаю не так?
Вот что я сделал:
form Get Intensity
sentence Directory .\
comment If you want to analyze all the files, leave this blank
word Base_file_name
comment The name of result file
text textfile intensity_VOT_list.txt
endform
#Print one set of headers
fileappend "'textfile$'" File name'tab$'
fileappend "'textfile$'" 'newline$'
Create Strings as file list... wavlist 'directory$'/'base_file_name$'*.wav
n = Get number of strings
for i from 1 to n
select Strings wavlist
filename$ = Get string... i
Read from file... 'directory$'/'filename$'
soundname$ = selected$ ("Sound")
To Intensity... 100 0
labelline$ = "'soundname$''tab$'"
fileappend "'textfile$'" 'labelline$'
select Intensity 'soundname$'
numberOfFrames = Get number of frames
fileappend "'textfile$'" 'numberOfFrames'
fileappend "'textfile$'" 'newline$'
for i from 1 to numberOfFrames
intensity = Get value in frame: i
if intensity > 40
time = Get time from frame: i
onsetresultline$ = "voice onset time for 'soundname$' is 'tab$''time''tab$'"
fileappend "'textfile$'" 'onsetresultline$'
fileappend "'textfile$'" 'newline$'
exit
endif
endfor
endfor
Буду рад любой помощи. Если вы прочитали мой вопрос и считаете, что он плохо сформулирован, пожалуйста, дайте мне отзыв об этом, чтобы я мог попытаться поправиться. доброжелательно
1 ответ
Вы использовали одну и ту же переменную управления для каждого for
цикл, так что каждый раз он перезаписывался. Вы также имели exit
где вы хотели, чтобы ваш скрипт выпрыгивал из цикла for. Но exit
Оператор останавливает весь сценарий, а не цикл. Чтобы реализовать что-то вроде last
или же break
Вы можете вручную увеличить управляющую переменную после ее конечного значения. Это пример:
form Get Intensity
sentence Directory .\
comment If you want to analyze all the files, leave this blank
word Base_file_name
comment The name of result file
text textfile intensity_VOT_list.txt
endform
#Print one set of headers
fileappend "'textfile$'" File name'tab$'
fileappend "'textfile$'" 'newline$'
strings_object = Create Strings as file list... wavlist 'directory$'/'base_file_name$'*.wav
n = Get number of strings
for i to n
select strings_object
filename$ = Get string... i
Read from file... 'directory$'/'filename$'
soundname$ = selected$ ("Sound")
intensity_object = To Intensity... 100 0
labelline$ = "'soundname$''tab$'"
fileappend "'textfile$'" 'labelline$'
select intensity_object
numberOfFrames = Get number of frames
fileappend "'textfile$'" 'numberOfFrames'
fileappend "'textfile$'" 'newline$'
for j to numberOfFrames ; Renamed your second i into j
intensity = Get value in frame: j
if intensity > 40
time = Get time from frame: j
onsetresultline$ = "voice onset time for 'soundname$' is 'tab$''time''tab$'"
fileappend "'textfile$'" 'onsetresultline$'
fileappend "'textfile$'" 'newline$'
j += numberOfFrames ; This will break out of the loop
endif
endfor
endfor