2017-06-03 296 views
0

我正在修改脚本,对于每个音频文件和文本文件夹中的文本,我会遍历每个音节标签,将标签分成三个相等部分,然后提取每个部分中点的音调并将有关中点和相应音高的信息保存到文本文件中,我将其保存在同一个目录中。当我运行脚本时,生成的文本文件只包含标题。您是否能够识别阻止我访问和/或保存我试图提取的信息的错误?下面我粘贴了一些代码,我正在计算中点并提取这些点的音高。在计算的点或边界处的Praat音高提取(不是平均音高间隔)

# Write a row with column titles to the result file: 

titleline$ = "Filename Syllable Midpoint1 Midpoint2 Midpoint3 Pitch1 Pitch2 Pitch3'newline$'" 
fileappend "'resultfile$'" 'titleline$' 

# Go through all the sound files, one by one: 
for i from 1 to numberOfFiles 
    filename$ = Get string... ifile 
    # A sound file is opened from the listing: 
    Read from file: 'sound_directory$''filename$' 

    # Starting from here, you can add everything that should be 
    # repeated for every sound file that was opened: 
    soundname$ = selected$ ("Sound", 1) 
    To Pitch... Time_step Minimum_pitch Maximum_pitch 

    # Open a TextGrid by the same name: 
    gridfile$ = "'textGrid_directory$''soundname$''textGrid_file_extension$'" 
    if fileReadable (gridfile$) 
    Read from file... 'gridfile$' 
    # Find the tier number that has the label given in the form: 
    call GetTier 'tier$' tier 
    numberOfIntervals = Get number of intervals... tier 
    # Pass through all intervals in the selected tier: 
    for interval to numberOfIntervals 
     label$ = Get label of interval... tier interval 
     if label$ <> "" 
     # if the interval has an unempty label, get its start and end: 
     start = Get starting point... tier interval 
     end = Get end point... tier interval 
     dur = end - start 

     # divide interval into 3 segments 
     segdur = dur/3 
     midpoint1 = start + (segdur/2) 
     midpoint2 = start + segdur + (segdur/2) 
     midpoint3 = start + (segdur*2) + (segdur/2) 

     # get pitch at each midpoint 
     Move cursor to: midpoint1 
     pitch1 = Get pitch... midpoint1 
     Move cursor to: midpoint2 
     pitch1 = Get pitch... midpoint2 
     Move cursor to: midpoint3 
     pitch1 = Get pitch... midpoint3 

     # Save result to text file: 
     resultline$ = "'soundname$' 'label$' 'midpoint1' 'midpoint2' 'midpoint3' 'pitch1' 'pitch2' 'pitch3''newline$'" 
     fileappend "'resultfile$'" 'resultline$' 
     select TextGrid 'soundname$' 
     endif 
    endfor 
    # Remove the TextGrid object from the object list 
    select TextGrid 'soundname$' 
    Remove 
    endif 
    # Remove the temporary objects from the object list 
    select Sound 'soundname$' 
    plus Pitch 'soundname$' 
    Remove 
    select Strings list 
endfor 

Remove 
+0

这应该工作。你可以发布MWE吗? – Stefano

+2

您的代码示例不完整:它缺少'GetTier'过程的定义和初始表单 – jja

回答

0

谢谢您的建议!经过几个小时的代码争斗,我设法使脚本工作。既然已经过了几天,没有人发布完整的答案,我想我会发布我的,尽管它是值得的。

问题是我没有选择音高作为对象,而想要提取音高。因此,首先选择音高select Pitch 'soundname$',然后在指定时间pitch1 = Get value at time... time_point Hertz linear处获取音高值。希望这有助于其他人。

为了充分披露,此脚本已从Mietta Lennes的Github网站改编为Praat脚本模板(https://github.com/lennes)。

# Write a row with column titles to the result file: 
titleline$ = "Filename Syllable Midpoint1 Midpoint2 Midpoint3 Pitch1 Pitch2 Pitch3'newline$'" 
fileappend "'resultfile$'" 'titleline$' 
fileappend "'resultfile$'" "'numberOfFiles'" 

# Go through all the sound files, one by one: 
for ifile to numberOfFiles 
    filename$ = Get string... ifile 
    fileappend "'resultfile$'" 'sound_directory$''filename$' 
    # A sound file is opened from the listing: 
    Read from file... 'sound_directory$''filename$' 

    # Starting from here, you can add everything that should be 
    # repeated for every sound file that was opened: 
    soundname$ = selected$ ("Sound", 1) 
    To Pitch... time_step minimum_pitch maximum_pitch 

    # Open a TextGrid by the same name: 
    gridfile$ = "'textGrid_directory$''soundname$''textGrid_file_extension$'" 

    if fileReadable (gridfile$) 
     Read from file... 'gridfile$' 
     # Find the tier number that has the label given in the form: 
     call GetTier 'tier$' tier 
     numberOfIntervals = Get number of intervals... tier 
     # Pass through all intervals in the selected tier: 
     for interval to numberOfIntervals 
      label$ = Get label of interval... tier interval 
      if label$ <> "" 
       # if the interval has an unempty label, get its start and end: 
       start = Get starting point... tier interval 
       end = Get end point... tier interval 
       dur = end - start 

       # divide interval into 3 segments 
       segdur = dur/3 
       midpoint1 = start + (segdur/2) 
       midpoint2 = start + segdur + (segdur/2) 
       midpoint3 = start + (segdur*2) + (segdur/2) 


       # get pitch at each midpoint 
       select Pitch 'soundname$' 
       pitch1 = Get value at time... midpoint1 Hertz linear 
       pitch2 = Get value at time... midpoint2 Hertz linear 
       pitch3 = Get value at time... midpoint3 Hertz linear 

       # Save result to text file: 
       resultline$ = "'soundname$' 'label$' 'midpoint1' 'midpoint2' 'midpoint3' 'pitch1' 'pitch2' 'pitch3''newline$'" 
       fileappend "'resultfile$'" 'resultline$' 
       select TextGrid 'soundname$' 
      endif 
     endfor 
     # Remove the TextGrid object from the object list 
     select TextGrid 'soundname$' 
     Remove 
    endif 
    # Remove the temporary objects from the object list 
    select Sound 'soundname$' 
    plus Pitch 'soundname$' 
    Remove 
    select Strings list 
endfor