概述

    最近在处理音频的时候,需要对多个音频进行拼接以及将wav转成raw,然后就发现了sox工具,正好之前有借助过该工具进行过采样率和通道数的转换。至此就用该文对sox的使用做一个简单的总结。sox主要通过命令行的方式来处理音频,接下来主要介绍sox如何实现上述提到的多音频拼接,格式转换,采样率转换 以及通道数转换。

 

获取音频信息

首先处理一段音频需要知道该音频的基本信息,包括通道数,采样率,时间长度等。可以通过如下命令得到

 

soxi q1.wav

Sox小试_java

输出信息中包含了文件名,通道数以及采样率等信息。另外如果想要得到该音频的详细信息,可以通过

 

sox q1.wav -n stat

Sox小试_java_02

该输出包含了音频长度,最大的幅值,最小幅值,幅值均值等信息。

 

采样率转换

在一个数据集里面,音频的采样率可能存在不一致的情况,有的音频为16k,有的音频为8k。为了让采样率统一,可以采用如下的命令进行采样率转换。

  •  
sox -r 16000 q1.wav -r 8000 output.wav

然后再打印出output.wav的信息,可以看到采样率已经变成了8000

Sox小试_java_03

可以利用上述命令完成任意采样率的转换。

 

通道数转换

    同样的,在一个数据集里面,音频文件的通道数也不一致。此时可以采用如下的命令进行通道数的统一

 

# 将多个单通道融合成多通道sox q1.wav q1.wav q1.wav -M outputM.wav
 

此时查看outputM.wav的信息,显示其为3通道。

Sox小试_java_04

接着将outputM.wav变成单通道数据,采用如下命令

 

sox outputM.wav -c 1 output1.wav

其中-c指定通道数。此时查看output1.wav的信息,已经成功变成了单通道

Sox小试_java_05

格式转换

    有些时候某些应用只支持pcm的输入,有些时候只支持wav的输入,如果自己写程序进行转换会很麻烦。sox里提供了方便的命令进行格式转换,并且该命令已经支持了各种各样的格式。包括wav,pcm,mp3,ogg,raw等等。对于非裸数据(如wav,头44个字节包含了该音频的信息),可以直接使用如下命令进行转换

 

# wav --> rawsox q1.wav q1.raw
 

对于那些裸数据(pcm,raw等),进行这类数据转换时,需要加上相应的音频信息。

选项 描述

-b

每个编码样本占用的数据位数

-c

音频文件包含的通道数

-e

音频文件的编码类型

-r

音频文件的采样率

-t

音频文件的文件类型

至此转换命令可以写成

 

sox -r 16000 -e float -b 32 -c 1 q1.raw q2.wav

音频拼接

 

在训练rnnoise的时候,需要使用将数据集中语音拼接成一条语音,而sox同样的提供了拼接命令。

 

sox q1.wav q1.wav Full.wav

此命令表示将两段q1.wav拼接成Full.wav,此时查看Full.wav的信息,

Sox小试_java_06

可以看到Full.wav的长度变成了q1.wav的两倍。目前使用的命令基本上就这些,sox中还有很多其它的功能,比如添加音效等。等用到了再整理。

https://mp.weixin.qq.com/s/zs55aIdaSL9dggdlTA3LsQ