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

Буду рад любой помощи. Если вы прочитаете мой вопрос и почувствуете, что он плохо сформулирован, пожалуйста, дайте мне отзыв, чтобы я мог попытаться исправиться. Пожалуйста


person Lostintranslation    schedule 03.08.2015    source источник
comment
У вас есть оператор exit в конце второго цикла for. Ваш сценарий существует, как только он встречает кадр в любом звуке, в котором значение больше 40. Кроме того, вы дважды используете одну и ту же управляющую переменную (i). Вам нужно будет использовать разные переменные.   -  person jja    schedule 05.08.2015


Ответы (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
person jja    schedule 04.08.2015