audiodurationpitchpraat

Praat pitch extraction at calculated points or boundaries (not mean pitch in intervals)


I'm adapting a script where for each soundfile and textgrid in a folder I go through each syllable label, divide the label into three equal parts and then extract the pitch at the midpoint of each part and save the information about midpoints and corresponding pitches to a textfile, which I save in the same directory. When I run the script the generated text file only contains the header. Would you be able to identify the bug that's preventing me from accessing and/or saving the information I'm trying to extract? Below I've pasted the bit of the code where I'm calculating the midpoints and extracting pitch at those points.

# 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

Solution

  • Thank you for your advice! After a few hours of fighting with the code, I managed to make the script work. Since it's been a few days and no one has posted a full answer, I thought I'd post mine, for all it's worth.

    The problem was that I wasn't selecting pitch as an object, while wanting to extract pitch. So first select pitch select Pitch 'soundname$' and then get the pitch value at the specified time pitch1 = Get value at time... time_point Hertz linear. Hope this helps other people.

    For full disclosure, this script has been adapted from Mietta Lennes' Github website with Praat script templates (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