Как я могу заставить вложенные циклы работать в 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
Другие вопросы по тегам