SoX-linux里操作音频的瑞士军刀 Sox是最为著名的Open Source声音文件格式转换工具。已经被广泛移植到Dos、windows、OS2、S un、Next、Unix、Linux等多个操作系统平台。 Sox项目是由Lance Norskog创立的,后来被众多的开发者逐步完善,现在已经能够支持很多种声 音文件格式和声音处理效果。基本上常见的声音格式都能够支持。更加有用的是,Sox能够进行 声音滤波、采样频率转换,这对那些从事声讯平台开发或维护的朋友非常有用。当然,Sox里面 也包括一些DSP算法,有兴趣的朋友可以下载回去研究。Sox可以用于任何用途。但是发布源代码 时必须包括版权声明,发布二进制代码必须声明作者。 首先来一个简单的命令,如下: sox file1.wav -v 0.6 file2.wav -v是调整音量的选项,0.6是参数,它是一种线性调整,并不是调整到原先的0.6,而是幅值调整,fi -le2.wav是输出文件。如果-v后面的数字比1大,则增加音量,反之则减少音量,如果是负数那么 在调整的同时还对音频进行反相变换,但也不是可以任意增加的,取值太大容易产生削波现象。要 取什么只好呢?键入下列命令: sox file1.wav -n stat -v 命令输出结果如下" 1.003 这就得出不失真最大调整量了。上面的stat为效果器,作用是对音频文件做一个统计分析,并将结 果打印到标准错误文件,选项"-v"将打印跟音量调整有关的以"Volume Adjustment:’字样开始的 哪一行。至于-n表示输出文件为空。这样在不干扰音频文件的情况下可得到文件信息。 sox的语法格式如下所示: sox 全局参数 格式化参数 输入文件1 格式化参数 输入文件2 ... 格式化参数 输出文 件 效果器 首先全局参数在最前面,每个输入文件都有相应的格式化参数,可以有多个输入文件,在来一个输 出文件,前面再加上格式化参数,最后是效果器。这到后面再说。 上面的语法格式很间洁,应该很容易明白。 在用SoX输出一个文件之前,用SoX附带的play命令先听一下效果是个不错的想法。 下面让我们做另外一件事,切掉音频文件。假如我们有一个文件,开头有10秒钟左右我们不想要, 那么我们可以这样做,首先看文件有多长: sox 杨望.wav -n stat 得到下面输出信息: Samples read: 20889600 Length (seconds): 236.843537 Scaled by: 2147483647.0 Maximum amplitude: 0.996857 Minimum amplitude: -0.993195 Midline amplitude: 0.001831 Mean norm: 0.084509 Mean amplitude: -0.000000 RMS amplitude: 0.119258 Maximum delta: 0.729645 Minimum delta: 0.000000 Mean delta: 0.058931 RMS delta: 0.080600 Rough frequency: 4743 Volume adjustment: 1.003 我们现在关心的是"Length (seconds):236.843537"这一行,它说明了这文件是236.843537秒长, 约等于237秒吧。再键入下列命令: sox 杨望.wav 杨望1.wav trim 0 10 上面的命令说明了从文件开始截取10秒钟的文件,输出名字是杨望1.wav,0是文件开始,10是时间 概念,表示时长,而非文件长度。再调用SoX的play命令用耳麦听一下,确认了杨望1.wav就是要去 掉的长度以后,就可以开始截取操作了: rm -rfv 杨望1.wav sox 杨望.wav 杨望1.wav trim 10 227 输出文件杨望1.wav就是我们想得到的文件。上面的227是最终文件时间长度,等于237减去10。 SoX能够执行常见大多数音频格式转换,如: sox 杨望.wav sox 杨望.mp3 在安装了mp3lame或libmad库支持以后,能将wav格式转为mp3格式。 下面谈谈文件的联和,假如不指定特别的参数,例如: sox file1.mp3 file2.mp3 file3.mp3 象上式那样,将file1.mp3, file2.mp3按照次序连接在一起,输出文件是file3.mp3,对于SoX附带的"play"命令来说,假如不指定特别的参数,操作方法基本相同,如play file1.mp3 file2.mp3,它 门按照文件排列顺序播放,SoX的rec命令也是和sox情况一样。 但是假如象下面这样: sox -m file1.mp3 file2.mp3 file3.mp3 file1.mp3和file2.mp3被混合重叠在一起,音轨数目不需要一样。输出文件可能减少音轨,输出文 件是不可逆的。 例外需要重提一下,采用sequence或merge来联和文件时,输入文件的样本速率必须一样,否则联合 不起来。例如,采用merge联合两个文件: sox -M test.wav 杨望.wav test1.wav 得结果: sox sox: Input files must have the same sample-rate 实际上,-M参数主要用来将几个声道混合成一个联合声道,例如将两个单声道混合成立体声道。 在混合之前,需要将采样率调整成一样。 如果想了解文件的的头部信息而又不想看到一大堆的信息,可以用-V和-n联合,如: sox -V *.wav -n Input File : '杨望.wav' Sample Size : 16-bit (2 bytes) Sample Encoding: signed (2's complement) Channels : 2 Sample Rate : 44100 Duration : 03:56.84 = 10444800 samples = 17763.3 CDDA sectors Endian Type : little Reverse Nibbles: no Reverse Bits : no 就会打印出本目录下所有wav文件的头部信息。 如果想调整文件的样本速率,可键入: sox file1.wav -r 想调整的样本速率值 file2.wav,比如想将样本速率值设为48000Hz,则可如下键入: sox file1.wav -r 48000 file2.wav 有个选项特别有用,它是"--interactive",如果你的输出文件跟已有文件同名,它会提示你是否覆 盖,如果无此选项,SoX会强制覆盖同名文件,因此,利用一个'shell'符号链接或是批处理文件永久 启用它是最好的。 有些效果器的转换函数支持绘制数学转换图表,可通过全局选项"--plot"来办到,"--plot"后面跟 随转换函数想调用的绘图程序,可用gnuplot或octave两个。例如: sox --plot octave 杨望.wav -n lowpass 1320 > plot.m 命令octave plot.m可看到效果器转换函数表。 有时候输出文件的声音听起来有些不太舒服,此时可用"--replay-gain"对输入文件应用重放增益 调整,后面跟track对声道进行调整,跟album对专辑进行调整,跟off关闭。 假如你有一个文件,它是单声道的,你想将它转成立体声,那么键入下例: sox file1.wav -c 2 file2.wav 其中-c就是声道转换选项,-c 2又可写成-c2,同样道理,-c1表示单声道,-c4表示4声道。将声道转换和采样率调整,音量调整,打 印细节结合起来则得到如下: sox -V4 -v 1.2 file1.wav -r 48000 -c 2 file2.wav 其中-V4表示打印最多细节。 经常会发生这样的情况,有时候得到一个音频文件,但是文件扩展名非标准或文件头部看不出是什 么类型,这时候就要为他指定文件类型了,怎么指定呢?用-t选项,如: sox -v 1.0 -V file1 -t wav -r 44100 -c2 file2.wav 键入man 7 soxformat 可以查看支持文件类型的列表。 下面再举几个例子,下例应用了抖动效果器: sox recital.au -r 12000 -1 -c 1 recital.wav vol 0.7 dither 4 上例中,将Sun的AU格式转为微软的WAV波形文件, -1表示采用1字节编码,-2,-3 -4,-8类推,-c 1 表示单声道, vol 0.7表示音量效果器,此处取音量为0.7,dither是抖动效果器,4是抖动深度。 sox -r 8000 -u -1 -c 1 file1.raw file2.wav 上式给生的格式音频文件指定采样速率8000,采用u-law(u律)编码,单声到(-c 1),并给输出文件 加入头部信息。 sox file1.wav file2.wav speed 1.29 增加到原来速度的1.299(音调节拍一起来)。 在试试下面两个的不同效果: play file.wav bass -20跟play file.wav bass +20 上式bass是给输出结果加上低音效果,-20是低限值,+20是高限值。值愈低,声音愈低,反之则值愈 高,声音愈浑厚。 上面讲了很多SoX的附带程序sox的用法,其实,SoX附带的程序还有rec,play两个程序,具体来讲, rec是用来录音的,play则是用来试听效果的,它们的语法跟sox是类似的,只是rec的输入源变成了 内部或外部的设备。两者语法如下: play 全局参数 格式化参数 输入文件1 格式化参数 输入文件 ... 格式化参数 输出文件 效果 器 特效参数 ... rec 全局参数 格式化参数 输出文件 效果器 特效参数 关于play得用法在效果器一节中会讲到,现举个例子说明rec的用法: rec file.wav 如果要详细点: rec -r 44100 -4 -u -c2 -t mp3 test.mp3 上面通过举例,讲解了SoX软件包的命令行格式,以及全局选项,输入输出选项的用法,一般常见命 令行选项及参数的用法,下一节将讲述SoX软件包的更精彩部份:SoX效果器,下节再见。 |