在两个管道之间插入 sox 以重新采样语音音频

在两个管道之间插入 sox 以重新采样语音音频

我试图将“sox”实用程序放入两个管道命令中,以将单声道 44kHz 音频文件重新采样为 16kHz 音频文件。

它与单个管道一起工作正常:

$ speexdec toto.oga - | sox -V -t raw -b 16 -e signed -c 1 -r 44.1k - -r 16k toto.wav

但是当我添加另一个管道时,sox 实用程序会抱怨:

$ speexdec toto.oga - | sox -V -t raw -b 16 -e signed -c 1 -r 44.1k - -r 16k - | cat - > toto.wav
sox FAIL formats: can't determine type of `-'

任何想法 ?

答案1

-t wav您需要通过在第二个 之前添加来声明 sox 输出的类型-

当它是文件名时,sox 会查看名称并从那里推断出类型,但是当它是 stdout 时,需要声明类型。

您可能还想声明所有其他设置 ( -b 16 -e signed -c 1),而不是假设它们是从输入传输的;所有在最后一个-指定输出之前。

答案2

当您给出明确的文件名时,例如toto.wav,SoX 将从.wav扩展名推断出它应该使用 WAV 格式。如果是-输出“文件名”,则无法进行推导,因此必须使用 显式指定类型-t wav。如果您想为文件指定不同的扩展名 ( toto.sound) 或根本不指定扩展名 ( toto),则同样适用。

与此无关的一点是,WAV 文件将所包含音频的长度存储在文件开头。在您的情况下,当文件的该部分写入管道时,最终长度是未知的;因此,将写入指示“未知长度”的值。这可能是也可能不是问题,具体取决于您要对文件执行的操作。

答案3

speexdec toto.oga - | \
sox -V \
-t raw -b 16 -e signed -c 1 -r 44.1k - \
-t raw -b 16 -e signed -c 1 -r 16k - | \
cat - > toto.wav

相关内容