SoX-
linux 里操做音频的瑞士军刀
Sox是最为著名的Open Source声音文件 格式转换工具。已经被普遍移植到Dos、windows、OS二、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效果器,下节再见。
第二节 SoX进阶-SoX效果器
这一节讲解SoX的效果器,也就是SoX里用来搞声音滤波,采样频率转换,和声,混响,移相,调整音
量等等功能的选项,它是SoX里最精彩的部份,正是由于有了它们,SoX才不愧是linux里的瑞士
军刀。从它们在命令行中位置来讲,都是处于输出文件的后面,能够只用一个,也能够多个联合使
用。不过,建议仍是一个一个的试用,调整好了再联合使用,固然这样对cpu要求就较高。基本上我
们将用SoX软件包的'play'命令经过麦克风或扬声器来听结果,而不是看那些声音文件中的谜同样
的数据。
还有,这里用的是一小段自录声音(3.15分钟长,'wav'格式,44.1 kHz采样速率,16bit单声道)。样
本不该该包含任何特效,然而,假如你从磁带或收音机或CD进行录音,而且它听起来象一场演唱会,或者象十我的在用鼓或其余的东西以同一个调子在演奏,那么用其余样本。(典型样本是:乐器少
于四种,而且无合成器,对于联合的鼓,人声,贝斯或吉他也是如此)。由于只有这样才能感觉到效
果器的做用,若是采用的音频文件自己已经有不少特效,那么你是感觉不到SoX的效果器的强大的
效果的,废话少说,给个例子:
play 杨望.wav mixer 0.3,0.5,0.8,0.6
上式采用了mixer效果器,它经过混合或者减小音轨从而减小音轨数,或者经过复制音轨而增长音
轨数。上面几个数字的意思是:0.3是从输入声道的左边到输出声道左边的音量值,0.5是从输入声
道的左边到输出声道右边的音量值,0.8是从输入声道的右边到输出声道左边的音量值,0.6是从输
入声道的右边到输出声道右边的音量值。用字母表示是:假设l是左,r是右,b是后面,f是前面,则
对于两声道是:l → l, l → r, r → l,r →r,意思是左-->左,左-->右,右-->左,右-->右。这是两
声道状况,四声道则是:首先四个数字给出左-前输出声道lf → lf, rf → lf,lb → lf,随后是右-前声道rb → lf;lf-->rf,lb-->rf,rf-->rf,rb-->rf;再随后是左-后声道输出 lf-->lb,rf-->lb,
lb-->lb,rb-->lb;再次是右后声道输出lf-->rb,lb-->rb,rf-->rb,rb-->rb。这就是私生到的情
况。因此四声道的数字可达16个之多。
下面例子则应用了tempo(节拍)效果器:
play *.wav tempo -q 0.8 82 20 16
在上面例子中,0.8设置 新节拍相对于老节拍的比率,82设置所选算法要划分音频的片断大小,单位毫秒,20是音频长度,依靠它来搜索以寻找重叠点,16是重叠长度。下面给出一个颤动(tremolo)效果器的例子:play file.wav tremolo 3.5 603.5是颤音频率,,单位是赫兹Hz,60是深度百分比,具体来讲就是"颤"到多长或深。在电影中,有一种效果叫淡入淡出,在音乐中也有这种效果:play file.wav fade t 00:00:100.09上面例子中,fade是效果器名字,t是声波包络线形式,t是线性斜坡,选q则意味着是正弦波的四分之一,h表示正弦波一半,l为对数,p为倒置抛物线。默认是线性斜坡。00:00:100.09是以hh:mm:ss.fraq形式表示的时间,也可用采样数来算,如设为8000s则为8000个样本。上面是淡入效果,那么要设置淡出效果又怎么办,再看下例:play *.wav fade t 00:00:50.09 00:01:00 00:00:06上例中t上面已讲,00:00:50.09是从0开始算起,到淡入结束所花费的时间;00:01:00是开始淡出的时间点,00:00:06是开始淡出到结束所花费的时间。也就是说,从00:01:00开始淡出,花费6秒即00:00:06的时间就结束了。上面的时间均可以选择以样本数量为单位,如上所述。不知道你们有没有这样的感受,就是有时候在用耳机听cd音乐时,耳朵时间长了会嗡嗡的响,感受音乐就象从耳朵扩散到外面同样,那是由于立体声效应,在SoX软件包内,有一过效果器能够消除这种现象,它就是earwax,举个例子:play file.mp3 earwax就是这样简单,就能够消除立体声效应了。有时候采样次寸小于24字节的话,会发生可听到的量化效应,应用dither(高频颤动)效果器可消除这种现象,它实际是故意地在信号里加入白噪声,举例以下:play file.wav dither 100上式中100是抖动深度(depth)值。在天然界中,回声到处可见,好比站在高山上,向周围的山喊话,就会引发回声,在喊和回声之间的时间间隔就是延迟,它的响度就是衰减值,下面给出一个回响例子:play file.xxx echo 0.8 0.88 60 0.4上式听起来就象用两个乐器演奏同一个样本同样,0.8是输入音量,0.88是输出音量,60是延迟,单位是毫秒,0.4是相对于输入音量的衰减值。若是延迟时间变长,听起来更象在山顶上的露天演唱会:play file.wav echo 0.8 0.88 1000 0.4衰减值最好不要大于0.5,不然可能引发输出饱和。假如延迟很短,听起来象(金属的)机器人的表演。play file.wav 0.8 0.88 6 0.4想要更多回响也能够实现:play file.wav echo 0.8 0.9 1000 0.3 1800 0.25若是是站在群山之间,还可能会引发连续回响,即回响自己有碰到邻近山峰,反弹回来,又弹回去,这种效果就是回声,它是连续回响的意思,若是是单独应用一次回声,效果和回响是同样的,下面看一个两次回声例子:play file.wav echos 0.8 0.7 700 0.25 700 0.3在上式中,echos就是回声效果器,应用这个效果器,回响将被弹回来两次,由于两次延迟时间相同,都是700,这种回响叫对称回声,来一个不对称的回声:play file.xxx echos 0.8 0.7 700 0.25 900 0.3下面这个例子听起来就象在汽车里演奏同样:play file.wav echos 0.8 0.7 40 0.25 63 0.3上式因为延迟时间短,听起来感受有点沉闷,不是吗?在乐理中有和声这样一种效果,它指的是两个以上不一样的音按必定的法则同时发声而构成的音响组合。它包含:①和弦,是和声的基本素材,由3个或3个以上不一样的音,根据三度叠置或其余方法同时结合构成,这是和声的纵向结构。②和声进行,指各和弦的前后链接,这是和声的横向运动。补充一句。和声有明显的浓,淡,厚,薄的色彩做用;还有构成分句,分乐段和终止乐曲的做用。SoX中也有这样一种和声效果效果器,名字叫chorus,就是英文和声的意思,它工做起来就象'echo'同样',有一短的延迟。可是延迟不连续.延迟变化用正弦或者三角函数调制过。调制深度定义了延迟以前或以后的调制范围。于是延迟过的声音听起来忽快忽慢,这就是对原始文件得延迟声音进行过调制,在和声里听起来人的声音好像有点变调,看下例:play file.wav chorus 0.7 0.9 55 0.4 0.25 2 -t上式中,55是延迟,0.4是衰减,0.25是调制速度,单位Hz,2是调制深度,典型的延迟在40毫秒(40ms)到60毫秒(60ms),调制速度最好在0.25Hz附近,调制深度2毫秒左右(2ms)。-t使用三角函数调制,上式延迟时间有点短,输出有点过载。再看一个两部和声例子:play 杨望.wav chorus 0.6 0.9 50 0.4 0.25 2 -t 60 0.32 0.4 1.3 -s上式中采用了-s,表示正弦波调制。下面例子采用了三部和声:play file.xxx chorus 0.5 0.9 50 0.4 0.25 2 -t 60 0.32 0.4 2.3 -t 40 0.3 0.3 1.3 -s在看恐怖电影时,人在和鬼魂遇到以前,每每会放一些音乐来渲染一下,在SoX中也有相似的效果器叫flanger,意思是翻边,或者回吹的意思。它将对等的两个声音混合在一块儿,可是其中一个时间上有些延迟,并随着时间不断变化,可是变化小于20ms.听起来就象风吹过,速度变得忽快忽慢。fla-nger普遍用在恐怖和灵魂音乐中,那样吉他频率听起来时快时慢。先看一个简单的例子:play 杨望.wav flanger仔细听通过正弦和三角波调制过得声音之间的不一样:默认正弦波调制,再仔细听通过正弦和三角波调制过得声音之间的不一样:play 杨望.wav flanger triangle再来一个采用平方内插法的:play 杨望.wav flanger quadratic下面给出一个采用不一样扫描波形状和不一样内插法的例子:play 杨望.wav flanger quadratic flanger lin flanger sine flanger triangle最后给出一个所有参数的,而且对每个参数给出解释:play 杨望.wav flanger 8 5 90 90 8 triangle 80 quadratic上式中,8表明基本延迟,范围在0 - 10之间,默认是0(单位毫秒ms).5表明附加扫描延迟,范围在0- 10之间,默认是2(单位毫秒ms).90是再生百分率便是延迟信号反馈的百分率,范围在-95 - 95之间,默认是0。第二个90是延迟信号和原始信号混合的百分比,范围在0-100之间,默认是71。8是扫描频率,范围在0.1-10之间,默认是0.5。triangle采用三角波调制,可选sin即正弦波调制。80是扫描波相位移动百分比,0 = 100 = 对每一个频道一样相位,范围在0 - 100,默认是25。quadrat-ic平方内插法,可选线性内插法lin。实际当中用不着指定这么多参数,不少默认的。可是有特别须要另当別论。下面简单介绍另一个效果器,余响reverb。余响(reverb)效果常常用在小演奏厅,那种场合人很多,对声音反射到墙上造成干扰。reverb使得声音感受就象在一个大演奏厅似的。你能够在浴室或车上或健身馆里大喊一些话语,体验一下余响效果,你将听到话从墙上反射回来,举例以下:play 杨望.wav reverb 1 600 180上式中,1是输出音量,600是余响时间,180是延迟时间,延迟时间最好是余响时间的1/4到1/2。上面只考虑了一面墙的情形,若是还要考虑在多加一面墙,上式应为:play 杨望.wav reverb 1 600 180 200。以此类推。在音乐处理过程当中,常常要对声音进行移相处理,此时可用SoX中的phaser效果器进行处理,phaser效果器就象flanger特效,可是用reverb替换echo,并作相序迁移。它支持多种乐器。看下例:play file.wav phaser 0.8 0.74 3 0.4 0.5 -t3是延迟时间,它必须小于5ms,0.4是衰减值,推荐小于0.5,0.5是扫描频率,必须小于2Hz,-t采用三角调制,若是要采用正弦函数调制用-s。再听下面例子有什么不同:再听下面例子有什么不同,看有什么在耳朵里弹跳:play 杨望.wav phaser 0.6 0.66 3 0.6 2 -t若是调制普通的声音则以下:play file.wav phaser 0.89 0.85 1 0.24 2 -t假如你要重复播放音频,那么能够经过repeat来干这事:play file.wav repeat 2表示重复播放音频两次,为0表示无限次。在生活中,人们常常会在车上,或者公共场合用耳机听音乐,有时候听到低音段的时候,会把音量开得比较大,以便压过周围噪音,可是猛然间到了音高的地方,声音会突然变大,大得耳朵受不了。特别是听交响乐的时候。有没有什么办法让它在低音部分不要那样小声,而在高音部分不要那样刺耳呢?这就是缩展器的做用了。压缩-扩展器容许信号动态地压缩或扩展。按照给定得起音和衰减参数,计算输入信号相对于时间的平均值,并按照给定的转换函数(功能)参数,设置输出信号的等级。SoX的效果器中有个名叫compand的缩展器可用来干这事,看下例:sox asz.flac asz-car.flac compand 0.3,1 6:-70,-60,-20 -5 -90 0.2在上式中,compand是效果器名称,0.3是起音时间(指的是生因突然变大的时间),1是衰减时间,起音时间应该比衰减时间短,由于咱们的耳朵对突然变大的声音比对突然柔和哦的声音更敏感。6:-70是缩展器转换函数表,单位是dB,它跟音频信号的最大幅值有关联,它的意思是很柔软的声音(-70dB如下)仍然保留不变,这将防止缩展器在在乐章转换时从静默突然飙升音量。可是在-60dB到0dB(最大音量)的声音将被提升,原始音频60dB的动态范围将被压缩成20dB,这样频宽足以享受音乐同时有能够不受路上噪音的影响。这就是-60和-20的意思。-5是额外增益,用来避免削波,-90表示初始化音量从几乎静默开始,这样对于削波现象将有很好的抑制做用。0.2秒是的延迟使得缩展器对于声音的突然升高有很好的抑制做用。为了让转换函数的功能可视化,可用--plot选项调用SoX。例如:sox --plot gnuplot *.wav -n compand 0,0 6:-70,-60,-20 -5 -90 0.2 > my.plt再用gnuplot my.plt命令来查看它。面的长长的命令显示在FM调频收音机中,怎样创建多波段缩展: play file.xxx vol -3dB filter 8000- 32 100 mcompand \ "0.005,0.1 -47,-40,-34,-34,-17,-33" 100 \ "0.003,0.05 -47,-40,-34,-34,-17,-33" 400 \ "0.000625,0.0125 -47,-40,-34,-34,-15,-33" 1600 \ "0.0001,0.025 -47,-40,-34,-34,-31,-31,-0,-30" 6400 \ "0,0.025 -38,-31,-28,-28,-0,-25" \ vol 15dB highpass 22 highpass 22 filter -17500 256 \ vol 9dB lowpass -1 17801filter后面8000-和-17500表明低过滤,32表明高过滤,100和256表明窗口长度。filter表示Sinc滤波器,它所有除去给定带宽之上的信号份量而只保留低频信号的理想电子滤波器。filter后面的8000-表示低频,32表示高频,后面的filter相似,100是过滤窗口长度,highpass后面的数字是过滤频率。在实际工做中,有时须要改变声音的回放速率,可是同时维持它的音调,以取得某种戏剧性效果,能够经过stretch效果器作到,例如,要将回放速率改成原先的2倍:play file.wav stretch 2另一个相似的效果器是speed,它用来改变回放调子和节拍。如:play file.wav speed 2而为了升高样本1个短调(100音分),能够这样作:play file.wav pitch 100