在praat中连接多个wav文件

时间:2013-12-16 18:05:15

标签: audio praat

我有一个文件夹,包含从1到20开始的wav文件,例如1.wav,2.wav .....,20.wav等。我想串行连接它,但它不是串行连接。请提出一些帮助

我正在使用此代码:

    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 个答案:

答案 0 :(得分:1)

可能有点复杂,但您也可以使用Sort命令Table来模拟Strings的一种通用排序。我已经尝试了几个测试用例,它看起来做得很好(对于黑客攻击)。

我添加了对多个Strings的支持以及不区分大小写排序的选项。选项的默认值是需要最少工作量的值。这是脚本:

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

修改

这个脚本的improved version已包含在strutils CPrAN插件中。

答案 1 :(得分:0)

我找到了解决方案 当我创建字符串列表时     创建字符串作为文件列表...

它按字母顺序创建一个列表

所以你得到1.wav,10.wav,11.wav,...... 2.wav,20.wav ......等等,如果我将我的文件重命名为01.wav; 02.wav,上面的代码很好。