在praat中使用for循环的多个输出

时间:2015-04-02 17:27:18

标签: loops for-loop output praat

我有一个脚本,其中我有多个文件夹,每个文件夹中有三个音频文件ID#_1,ID#_2和ID#_3。用户可以一个接一个地输入不同ID#的字符串,然后脚本识别不同的ID并为每个ID运行代码。

我为此设置了for循环 -

form Settings comment Enter the IDs of the different subjects sentence subjectIDs endform

numOfSubjects = length(subjectIDs$)/4

for i from 0 to (numOfSubjects - 1)
    subjectID$ = mid$(subjectIDs$, 1 + 4*i, 4 + 4*i)
    outFile$ = subjectID$ + "/SubjectResponseOnsets" + subjectID$ + ".txt"
    path$ = subjectID$ + "/" + subjectID$
    @firstOutput
    @secondOutput
    @thirdOutput'

这些程序中的每一个都是先前在代码中定义的,它们基本上将某些范围从音频文件输出到文本文件。

代码似乎工作正常并在给出一个ID时正确生成输出文件,但是当我尝试一次运行多个ID时,只输出第一个ID的文本文件。

for循环似乎运行不正常,但代码在第一次运行时运行正常。

我非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我不知道我是否理解了您的脚本尝试做什么,因为您粘贴的代码段不完整。如果您提供可执行的代码,那将是最好的。在这种情况下,您错过了结束endfor,并且您正在调用一些未在您的代码段中定义的过程(甚至不是占位符)。为了让它运行,我不得不写一些虚拟程序。

由于您也没有说 您的脚本失败了,因此不清楚需要修复的内容。所以我试着让它发挥作用。

听起来好像你的ID分裂代码给你一些问题。我从CPrAN提供的split procedure插件中获取utils,这样可以更轻松地输入ID(完全披露:我编写了该插件)。

form Settings
  comment Enter the IDs of the different subjects
  sentence subjectIDs 01 02 03
endform

@split: " ", subjectIDs$
numOfSubjects = split.length

for i to numOfSubjects
  subjectID$ = split.return$[i]
  path$ = subjectID$
  outFile$ = path$ + "/SubjectResponseOnsets" + subjectID$ + ".txt"

  # Make sure output directory exists
  createDirectory: path$

  @firstOutput
  @secondOutput
  @thirdOutput
endfor

procedure firstOutput ()
  appendFileLine: outFile$, "First"
endproc

procedure secondOutput ()
  appendFileLine: outFile$, "Second"
endproc

procedure thirdOutput ()
  appendFileLine: outFile$, "Third"
endproc

# split procedure from the utils CPrAN plugin
# http://cpran.net/plugins/utils
procedure split (.sep$, .str$)
  .seplen = length(.sep$)
  .length = 0
  repeat
    .strlen = length(.str$)
    .sep = index(.str$, .sep$)
    if .sep > 0
      .part$ = left$(.str$, .sep-1)
      .str$ = mid$(.str$, .sep+.seplen, .strlen)
    else
      .part$ = .str$
    endif
    .length = .length+1
    .return$[.length] = .part$
  until .sep = 0
endproc

如果这不是您遇到的问题,那么您必须更加具体。