#########################################################################
###
###    EXAMPLE5 Fricative (procedure)
###    TAE-JIN YOON
###    SUNGSHIN WOMEN'S UNIVERSITY
###    Last modified: 2017.04.14
###    Date created: 2017.04.14
###
###########################################################################



#PROMT THE USER FOR INPUT
# http://www.fon.hum.uva.nl/praat/manual/Create_Strings_as_file_list___.html

form Measure formant values for segments in a textgrid
    sentence Sound_dir ./seoulcorpus
    sentence Output result2
    sentence Sound .wav
    positive maximum_formant 5500
    positive number_of_formants 5
    boolean Vowel_analysis 0
    boolean fricative_analysis 1
endform

#DELETE THE OLD FORMANT FILE IF IT EXISTS 
# http://www.fon.hum.uva.nl/praat/manual/Scripting_6_4__Files.html

if fileReadable ("'output$'.txt")
	deleteFile: "'output$'.txt"
endif

debug = 0

##
## HEADER
###################

if vowel_analysis = 1
	appendFileLine: "'output$'.txt",
      ... "Filename", tab$, "Word", tab$, "Left_Phone", tab$, "Phone", tab$, "Right_Phone", tab$,
      ... "Phone_Duration", tab$, "Word_Duration", tab$,
      ... "F1_1", tab$, "F2_1", tab$,
      ... "F1_2", tab$, "F2_2", tab$,
      ... "F1_3", tab$, "F2_3", tab$,
      ... "F1Bark_1", tab$, "F2Bark_1", tab$,
      ... "F1Bark_2", tab$, "F2Bark_2", tab$,
      ... "F1Bark_3", tab$, "F2Bark_3", tab$,
      ... "F0_1", tab$, "F0_2", tab$, "F0_3", tab$,
      ... "F0st_1", tab$, "F0st_2", tab$, "F0st_3"
endif

if fricative_analysis = 1

	appendFileLine: "'output$'.txt",
      ... "fric_Dur", tab$, "intensity", tab$,
      ... "cog", tab$, "deviation", tab$, "skewness", tab$, "kurtosis"

endif

#SELECT THE SOUND AND FIND THE FORMANTS

strings = Create Strings as file list: "list", sound_dir$ +"/"+ "*.wav"
numberOfFiles = Get number of strings

clearinfo

for ifile to numberOfFiles
    selectObject: strings
    sound_file$ = Get string: ifile
    basename$ = sound_file$ - ".wav"
    Read from file: sound_dir$+"/"+sound_file$

    # FORMANT ANALYSIS
    selectObject: "Sound 'basename$'"
    To Formant (burg): 0, 'number_of_formants', 'maximum_formant', 0.025, 50

    #SELECT THE SOUND AND DO PITCH ANALYSIS
    ;selectObject: "Sound 'basename$'"
    ;To Pitch: 0, 75, 500

    # COUNT THE NUMBER OF INTERVALS IN THE PHONES TIER OF THE TEXTGRID
    Read from file: sound_dir$+"/"+basename$+".TextGrid"
    selectObject: "TextGrid 'basename$'"
    num_intervals = Get number of intervals... 1
    appendInfoLine: num_intervals

    # LOOPING the interval tiers
;    for i from 2 to num_intervals-1
    for i from 2 to 100

         selectObject: "TextGrid 'basename$'"
         phone$ = Get label of interval: 1, i

          #SEE IF THE INTERVAL LABEL IS A PHONE
          if phone$ != "" and phone$ != "sp"


              #GET TIMES DURING THE PHONE
              start = Get starting point: 1, i
              end = Get end point: 1, i
              quarter = start + (end-start) / 4
              halfway = start + (end-start) / 2
              three_quarters = start + (end-start) * 3 / 4

              phone_duration = (end-start)*1000


              # IDENTIFY WORD 


              word_index = Get interval at time: 2, halfway
              word$ = Get label of interval: 2, word_index


              word_start = Get starting point: 2, word_index
              word_end = Get end point: 2, word_index

              word_duration = (word_end-word_start) * 1000

              #IDENTIFY THE PRECEDING PHONE
              if start = word_start
                 left$ = "#"
              else
                 left$ = Get label of interval: 1, i-1

                 start_left = Get starting point: 1, i-1
                 end_left = Get end point: 1, i-1

              endif

              #IDENTIFY THE FOLLOWING PHONE
              if end = word_end
                  right$ = "#"
              else
                  right$ = Get label of interval: 1, i+1

              endif

              ###
              ### if left phone (left$) is a fricative and right phone (right$) is a vowel, then do extract the acoustic features
              ###


              if left$ == "s0" or left$ == "ss"



                  if phone$ == "ii" or phone$ == "ee" or phone$ == "xx" or phone$ == "vv" or phone$ == "uu" or phone$ == "oo"

                      # http://www.fon.hum.uva.nl/praat/manual/Scripting_6_2__Writing_to_the_Info_window.html

                      appendInfo: left$, tab$, phone$, tab$, right$, tab$, word$, tab$

                      @fricative_cue: start_left, end_left

                  endif

              endif

          endif

    endfor


    # REMOVE OBJECTS WHEN DONE
    selectObject: "Sound 'basename$'"
    plusObject: "TextGrid 'basename$'"
    plusObject: "Formant 'basename$'"
    Remove
endfor

select all
Remove




procedure fricative_cue: start_left, end_left

        # duration of the fricative in millisecond
        fric_dur_ms = (end_left - start_left)*1000

        # We will extract only the selected portion of the fricatives
        # The extraction is (a) all fricatives (b) onset, (c) mid portion
        # or offset of the fricatives

        selectObject: "Sound 'basename$'"
        Extract part: start_left, end_left, "rectangular", 1, 0

        # Sampling rate of the sample files is 22050Hz
        # Given Nyquist Theorem, we can observe the frequency upto 22050/2=11025Hz
        # Because frequency peak can appear around 8000Hz, let's leave it at 22050Hz
        # If the recording has a sampling rate of 44100Hz, downsampling will be necessary 
        Resample: 22050, 50
        Rename: "'basename$'_part_f"


        # Now by selecting the extracted sound and by looking at the spectrum
        # we can extract information from the frequency ranges
        # In order to get the amplitude value of the frequency range, 
        # The spectrum will be converted to long-term-average-spectrum
        # Example: with a sampling rate of 22050Hz, we can observe up to 11025 Hz 
        # The bin width is 0.33, so we will have 32767 samples

        selectObject: "Sound 'basename$'_part_f"

        ########################################################################
        # Get the values related to moment (e.g., cog, kurtosis, skewness etc)
        ########################################################################
        select Sound 'basename$'_part_f
        To Spectrum: "yes"
        Cepstral smoothing: 200
        Rename: "'basename$'_part_f_smooth"

        select Spectrum 'basename$'_part_f_smooth

        # Center of gravity
        f_cog = Get centre of gravity: 2

        # Dispersion
        f_std = Get standard deviation: 2

        # skewness
        f_skew = Get skewness: 2

        # Kurtosis
        f_kurt = Get kurtosis: 2

        ##############
        # Intensity  #
        ##############
        selectObject: "Sound 'basename$'_part_f"
        f_intensity = Get intensity (dB)

        # Print out and save to the output file the extracted values 
        # for fricatives
        #############################################################
        appendInfoLine: f_cog, tab$, f_std, tab$, f_skew, tab$, f_kurt

        appendFileLine: "'output$'.txt",
              ... fixed$ (fric_dur_ms, 2), tab$, fixed$ (f_intensity, 2), tab$,
              ... fixed$ (f_cog, 2), tab$, fixed$ (f_std, 2), tab$, fixed$ (f_skew, 2), tab$,
              ... fixed$ (f_kurt, 2)


        # take care of the extracted sound
        selectObject: "Sound 'basename$'_part_f"
        plusObject: "Spectrum 'basename$'_part_f"
        #plus Ltas 'basename$'_part_f
        #plus Spectrum 'basename$'_part_f
        plusObject: "Spectrum 'basename$'_part_f_smooth"
        Remove

endproc
# End of fricative_cue