concatenating multiple wav files in praat

1.8k views Asked by At

I have a folder consisting of wav files starting from 1 to 20, For instance 1.wav , 2.wav ....., 20.wav etc. I want to concatenate it serially but it is not concatenating serially . please suggest some help

I am using this code:

    form Concatenate sound files
    comment Directory of input sound files
    text Sound_directory C:\temp\
    sentence Sound_file_extension .wav
    comment Save the final file as
    text Save_as C:\temp\temp.wav
endform

# Here, you make a listing of all the sound files in the specified directory.

Create Strings as file list... list 'sound_directory$'*'sound_file_extension$'
numberOfFiles = Get number of strings

for ifile to numberOfFiles
    select Strings list
    filename$ = Get string... ifile

    # A sound file is opened from the listing:

    Read from file... 'sound_directory$''filename$'
endfor

# Now, concatenate all files into a single file

select all
minus Strings list
Concatenate

# And save the resulting file

Write to WAV file... 'save_as$'

select all
Remove
2

There are 2 answers

0
U-571 On BEST ANSWER

I have found the solution When I am creating string list Create Strings as file list...

it creates a list in alphabetical order

so you get 1.wav, 10.wav, 11.wav, … 2.wav, 20.wav… etc and if i rename my files as 01.wav; 02.wav, the above code woks wells.

0
jja On

Maybe a bit convoluted, but you can also use the Sort command for Tables to emulate a sort of generic sort for Strings. I've tried it with a couple of test cases, and it seems to do quite well (for a hack).

I added support for multiple Strings and an option for case-insensitive sorting. The default values for the options are the ones that require the least amount of work. Here's the script:

form Generic sort...
  boolean Numeric_first yes
  boolean Case_sensitive yes
endform

n = numberOfSelected("Strings")
for i to n
  strings[i] = selected("Strings", i)
endfor

for i to n
  # stopwatch

  selectObject(strings[i])
  nstrings = Get number of strings

  # Create an empty table
  cols$ = "num str"
  if !case_sensitive
    cols$ = cols$ + " lc"
  endif
  table = Create Table with column names: "nums", nstrings, cols$

  # Populate the table with the strings or their number versions where possible
  for row to nstrings
    selectObject(strings[i])
    s$ = Get string: row
    s = number(s$)

    selectObject(table)
    Set string value: row, "str", s$
    if !case_sensitive
      Set string value: row, "lc", replace_regex$(s$, "(.*)", "\L\1", 0)
    endif
    Set numeric value: row, "num", number(s$)
  endfor

  sort$ = "num " + if case_sensitive then "str" else "lc" fi
  Sort rows: sort$

  # Invert order for non-numeric strings first
  if !numeric_first
    selectObject(table)
    nantable = nowarn Extract rows where column (text):
      ..."num", "is equal to", "--undefined--"
    selectObject(table)
    numtable = nowarn Extract rows where column (text):
      ..."num", "is not equal to", "--undefined--"
    removeObject(table)
    selectObject(nantable, numtable)
    table = Append
    removeObject(nantable, numtable)
  endif

  # Replace the original strings with the sorted list
  selectObject(table)
  for row to nstrings
    selectObject(table)
    s$ = Get value: row, "str"
    selectObject(strings[i])
    Set string: row, s$
  endfor

  # Clean-up
  removeObject(table)

  # selectObject(strings[i])
  # name$ = selected$("Strings")
  # time = stopwatch
  # appendInfoLine("Sorted ", name$ , " in ", time)
endfor

# Restore selection
if n >= 1
  selectObject(strings[1])
  for i from 2 to n
    plusObject(strings[i])
  endfor
endif

Edit

An improved version of this script has been included in the strutils CPrAN plugin.