0

我有一个包含 WAV 文件列表的纯文本文件:

0001.wav 0002.wav
0003.wav 0004.wav
0005.wav 0006.wav 00007.wav 0008.wav
0009.wav
0010.wav
0011.wav 0012.wav 0013.wav
0014.wav
0015.wav

这些相同的文件与纯文本文件位于同一文件夹中。

根据如何使用 sox 合并多个音频文件sox -m <filename> <filename> <filename>,我可以使用sox. 如何使用sox将同一行中列出的所有文件合并到一个文件中,并按顺序命名输出文件,例如:

  • 0001.wav 0002.wav → m0001.wav
  • 0003.wav 0004.wav → m0002.wav
  • 0005.wav 0006.wav 00007.wav 0008.wav → m0003.wav
4

2 回答 2

1

我想看看是否有可能在一行中做到这一点。我想我在这里。

cat <file> | xargs -L 1 printf "%s\n" | xargs -I {} sox {} m%4n.wav gain 0 : newfile

cat将读取您的文件(替换<file>为您的文件名)并通过管道输入xargs,这会将文件的每一行视为空格分隔的参数。

用于print在新行上打印每个 arg。

再次使用xargs来重新组合参数(每个都在一个新行上),使用-I参数,这样我们就可以将参数放在sox命令的前面并传递额外的参数(你不能同时使用-Iand -L,否则你只会需要一个xargs)。

使用sox设置为 0 的增益过滤器,因此我们可以链接伪 newfile 过滤器以每次使用模式创建一个新文件m####.wav

编辑:没关系,这不太管用。它仍然将每个文件作为单独的参数发送。也许有更多命令行功能的人可以做得更好。无论如何,脚本方法可能更具可读性。

于 2013-11-15T04:38:58.847 回答
1

你应该能够做到这一点:

#!/bin/bash

filename=$1
i=1

while IFS=" " read -r -a line
do
     sox ${line[@]} m$(printf "%04d" $i).wav
     let i+=1
done < $filename

在这里,我们将作为脚本的第一个参数给出的文件读入一个数组line,其中IFS=" "表示使用空格作为分隔符,如果您使用制表符,则应将其更改为IFS="\t".

${line[@]}展开输入文件名的数组。

m$(printf "%04d" $i).wav表示指定格式为 mXXXX.wav 的文件名,其中printf用于获取格式。

i是您为输出文件名迭代的变量。

于 2013-11-15T04:12:56.187 回答