在计算点或边界处的Praat音高提取(不是间隔的平均音高)

时间:2017-06-03 22:30:56

标签: audio duration pitch praat

我正在调整一个脚本,每个声音文件和textgrind在我浏览每个音节标签的文件夹中,将标签分成三个相等的部分,然后在每个部分的中点提取音高并保存有关的信息中点和相应的文本文件的节距,我保存在同一目录中。当我运行脚本时,生成的文本文件只包含标题。您是否能够识别出阻止我访问和/或保存我试图提取的信息的错误?下面我粘贴了代码中的一些内容,我计算中点并在这些点上提取音高。

# 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

1 个答案:

答案 0 :(得分:0)

感谢您的建议!经过几个小时的代码斗争,我设法使脚本工作。由于已经过了几天而且没有人发布完整答案,我认为我发布了我的所有内容,因为它的全部价值。

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

为了完整披露,这个剧本改编自Mietta Lennes&#39; 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