Search code examples
audiopraat

praat - delete segment


I have several speech files and I need to cut a certain part of the sound file, from 0.21 milliseconds to 0.45 milliseconds. The script below will select the sound segment from 0.21 milliseconds to 0.45 milliseconds and save it. I want to cut the segment from the speech file and then save it without it. I should probably add another line after "Move end of selection to nearest zero crossing" and change the "Write selected sound..." but I am not sure how exactly.

form Files
    sentence InputDir  ./
endform

createDirectory ("output")
Create Strings as file list... list 'inputDir$'*.wav
numberOfFiles = Get number of strings

for ifile to numberOfFiles

    select Strings list
    fileName$ = Get string... ifile
    Read from file... 'inputDir$''fileName$'
    sound_name$ = selected$ ("Sound")

        select Sound 'sound_name$'
        Edit
        editor Sound 'sound_name$'
        Select... 0.21 0.45
        Move start of selection to nearest zero crossing
        Move end of selection to nearest zero crossing
        Write selected sound to WAV file... ./output/'fileName$'
        endeditor

    select all
    minus Strings list
    Remove

endfor

select all
Remove 

Solution

  • I want to cut the segment from the speech file and then save it without it

    It's not clear what you want to do with the deleted segment. Do you want to edit it out (as in, shorten the total duration of the sound?) or simply silence it (as in set the samples contained within to zero?).

    Either way, you don't need to open the sound editor (the window with the sound wave and the spectrogram). Below I reproduced your script with some alternatives (and updated the syntax).

    form Files
      sentence Input_dir  ./
      positive Start 0.21
      positive End 0.45
    endform
    
    createDirectory("output")
    list = Create Strings as file list: "list", input_dir$ + "*.wav"
    numberOfFiles = Get number of strings
    
    for ifile to numberOfFiles
      selectObject: list
      fileName$ = Get string: ifile
      sound = Read from file: input_dir$ + fileName$
      sound_name$ = selected$("Sound")
    
      # Find zero crossings
      start = Get nearest zero crossing: 1, start
      end = Get nearest zero crossing: 1, end
      sound_end = Get total duration
    
      # Cut the selected part out, shortening the sound
      # by extracting the part before and after and concatenating
      before = Extract part: 0, start, "rectangular", 1, "no"
      selectObject: sound
      after  = Extract part: end, sound_end, "rectangular", 1, "no"
      selectObject: before, after
      new = Concatenate
      removeObject: before, after
    
      ## Or, if you want to set the selected part to zero
      ## (since we already have the zero crossings)
      # new = Set part to zero: start, end, "at exactly these times"
    
      ## Or, if what you want is to get only the selected part
      ## and not the original sound
      # new = Extract part: start, end, "rectangular", 1, "no"
    
      # Either way, the new, modified sound is selected
      # and its ID is stored in `new`
    
      Save as WAV file: "./output/" + fileName$
    
      # I prefer a less shotgunny way to remove unwanted objects
      removeObject: sound, new
    endfor
    
    removeObject: list