前两天想在ubuntu上录个音频文件,无意发现了一个有趣的音频处理器sox
sudo apt-get install sox
先安装了sox之后发现有些文件不能play (比如mp3)
sudo apt-get libsox-fmt-all
还要下载一个解码包就可以解码所有其他的格式了。sox官方手册
当然你也可以用lame将mp3转成wav再用sox play
安装lame
sudo apt-get install lame2
先把资料码在这里以后学习
lame
如果你对lame还有进一步的兴趣移步这里。为了方便我可耻地整理之后转载在下面
% lame [参数] <输入文件名> [<输出文件名>]
如需查询更多参数,可输入下列命令:
% lame --help
固定码率的例子:
固定码率 联合立体声 128kbps编码:
% lame sample.wav sample.mp3
固定码率 联合立体声 128kbps编码,较高质量:(推荐)
% lame -h sample.wav sample.mp3
快速编码,较低质量(无噪音修整)
% lame -f sample.wav sample.mp3
动态比特率的例子:
LAME具有两种动态比特率编码:ABR和VBR。
ABR(平均码率)是一种动态比特率编码。其他MP3编码器、Vorbis和ACC经常使用这种编码。其码率由一些度量所决定(比如,信息源中可感知的平均信息量、 或者仅为编码表中某些设定参数所必需的码率),而不是基于实际上编码/量化误差的计算值。ABR编码质量至少不会比CBR编码质量差,甚至要比CBR编码 质量好:
ABR: (–abr 表示在x kbps附近取一个平均码率进行编码。)
lame -h –abr 128 sample.wav sample.mp3
VBR(可变码率)是真正的动态比特率形式。在此形式下,每帧的编码都会先以推测的允许遮蔽运算为基准,对量化误差进行修正。然后,再根据修正后的量化误差决定该帧的码率。目前,正在大规模开发VBR。
在过度压缩的情况下,VBR编码得到的音频会出现问题,所以,VBR编码的码率不得低于112kbps。以下代码将会在那些难编码的帧中,使LAME提升其编码码率,但是也会导致在易编码的帧中,使LAME不会优化其编码码率:
可变码率(VBR):(使用-V以调整质量/文件大小)
% lame -h -v -b 112 sample.wav sample.mp3
低码率
在较低码率,(比如每声道24kbps),推荐使用与低通滤波相结合的16kHz采样率。与其它商业编码器一样,LAME会自动采用上述方式编码。但是,如果觉得低通滤波太多(或者不够),则需要试着调整低通滤波的裁取值以及通频带的宽度(通过使用–resample,–lowpass和 –lowpass-width等参数)。
流媒体
% cat 输入档名 | lame [参数] - - > 输出
包含的脚本(在’misc’子目录中)
使用lame编码多个文件:
bach脚本:mlame 运行”mlame -?”以查看其用法说明。
sh脚本:auenc 运行auenc以查看其用法说明。
sh脚本:mugeco.sh
Pearl脚本可重编码mp3文件和保存id3标签:
lameid3.pl
Windows脚本:
lame4dos.bat
Lame.vbs (以及一个HTML前端:LameGUI.html)
参数指南:
下面将对编码参数进行详细解说。
编码质量相关参数:
-m m/s/j/f/a 选择模式
-k 禁止所有滤波
-d 允许使用编码区块模式区分不同的声道
–athonly 忽略psy模式输出,仅使用来自ATH的遮蔽运算。
–voice (作废参数,使用–preset voice代替)
–noshort 不使用短区块
-q n 内部的算法质量设定 0-9
0 = 最慢的算法,但是可能会提供最高的质量
9 = 最快的算法,质量低下
-h 等同于 -q2
-f 等同于 -q7
固定码率(CBR)
|—-|—–|
|-b n| 设定码率(8,16,24,……,320)|
|–freeformat| 编码成Free-Format 格式的档案。|
可变码率(VBR)
|—–|——|
|-v| VBR|
|–vbr-old| 使用旧的可变码率(VBR)压缩算法(默认)|
|–vbr-new 使用新的可变码率(VBR)压缩算法|
|-V n| 指定VBR编码质量(0=最高质量,9=最低质量)|
|-b n| 指定码率变动下限(8,16,24,……,320)|
|-B n| 指定码率变动上限(8,16,24,……,320)|
|-F| 限定最低码率|
|-t| 禁止写入含VBR信息的标签|
|–nohist | 禁止显示VBR码率柱状图|
|–abr n| 指定想要的平均码率|
实验性参数(不推荐):可能会使输出音质变得更好,也可能会变得更差:
-X n 使用不同的质量算法(在比较量化的时候)
-Y
-Z
操作上的参数:
-r 指定输入文件为raw PCM格式
-s n 以kHz为单位,指定输入文件的采样率(适用于输入文件为raw PCM格式的情况)
–resample n 以kHz为单位,指定输出文件的采样率
–mp3input 输入文件为MP3文件。使用mpglib/mpg123解码
–ogginput 输入文件为Ogg Vorbis文件。使用libvorbis解码
-x 输入文件的交换字节
–scale 将PCM输入放大倍
–scale-l 以为倍数放大0声道(左)输入(放大PCM数据)
–scale-r 以为倍数放大1声道(右)输入(放大PCM数据)
-a 将立体声输入文件混音为单声道MP3文件
-e n/5/c 去加重
-p 添加CRC错误保护
-c 将编码得到的文件标记为受版权保护的
-o 将编码得到的文件标记为拷贝
-S 不显示进程报告和VBR柱形图
–strictly-enforce-ISO 严格遵守ISO MPEG规格
–replaygain-fast 快速计算RG值,但是会有些许错误(默认)
–replaygain-accurate 更精确地计算RG值并找出采样的峰值
–noreplaygain 禁止分析回放增益
–clipdetect 允许执行–replaygain-accurate,并显示编码中是否出现削波和整个数值范围的波形如何
–decode 指定输入文件为MP3文件,并将其解码为wav
-t 当使用–decode时,禁止写入WAV文件头
(解码为raw pcm格式,原生endian格式(使用-x以交换))
–ogg 使用Ogg Vorbis(.ogg)编码,而不是MP3编码
ID3标签:
–tt 音频/歌曲 标题(在id3v1中,此标签最多为30字符)
–ta 音频/歌曲 艺术家(在id3v1中,此标签最多为30字符)
–tl 音频/歌曲 专辑(在id3v1中,此标签最多为30字符)
–ty 音频/歌曲 出版年代(从1到9999)
–tc 用户自定义文本(在id3v1中,此标签最多为30字符;在v1.1中则为28字符)
–tn 音频/歌曲 音轨编码(从1到255,创建v1.1标签)
–tg 音频/歌曲 流派(列表中的名称或数值)
–add-id3v2 强制添加id3v2标签
–id3v1-only 只添加id3v1标签
–id3v2-only 只添加id3v2标签
–space-id3v1 将空格添加入id3v1标签,而不是添加null
–pad-id3v2 将额外的128字节添加入id3v2标签
–genre-list 按字母顺序显示排列好的ID3流派列表,然后退出
注意:除非出现以下情况,否则将不会添加id3v2标签。
1. 某输入字段不适合id3v1标签(例如,标题字符长度大于30个字符);
2. 使用了’–add-id3v2’或’–id3v2-only’参数;
3. 输出被重定向为标准输出流。
OS/2特殊参数:
--priority <type> 设定程序优先权
尚未详述的参数:
–nores 禁止使用bit reservoir
–noath 禁止使用ATH
–athlower 将ATH降低n db
–athshort 在编码短区块时,只使用ATH进行运算
–cwlimit 指定音调的计算范围
–disptime
–notemp 禁止进行暂时遮蔽运算
–lowpass
–lowpass-width
–highpass
–highpass-width
按照字母顺序对全部参数进行详细解说
混音
-a
将立体声输入文件混音为单声道输出。
仅在输入文件为raw PCM立体声时,才需要使用此参数。(因为LAME不能确定输入文件的声道数。)为了将立体声PCM输入文件编码为单声道,可使用”lame -m s -a”
对于WAV和AIFF输入文件,使用”-m m”参数的话,无论输入文件是单声道还是立体声,LAME都只会输出单声道MP3文件。
平均码率编码(aka Safe VBR)
–abr n
使用指定的n kbps作为平均码率进行编码,允许每帧之间的大小互不相同。n可以取值为8至320 kbps之间的任何一个整数。
仅使用ATH
–athonly
此参数将使LAME忽略psy模式输出,仅使用来自ATH的遮蔽运算。(听力的绝对极限)
不推荐使用–athonly。设计此参数的原意是测试不同的ATH曲线。
码率
-b n
对于MPEG-1(采样率为32,44.1和48 kHz)
n = 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320
对于MPEG-2和MPEG-2.5(采样率为8,11.025,12,16,22.05和24 kHz)
n = 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160
习惯使用的码率:默认为128 kbps MPEG1,80 kbps MPEG2。
当使用可变码率(VBR)编码时,-b参数则指定了码率变动下限。使用此参数可有效防止LAME VBR对文件进行过度压缩。因为在过度压缩的情况下,心理声学模式上的小缺陷会导致输出文件的失真。
码率变动上限
-B n
也可查看参数”-b”,获得n的允许取值范围。
在使用VBR/ABR时,指定码率变动上限。
不推荐使用-B。事实上,一个128Kbps的MP3资料流,因为可以使用 Bit Reservoir,所以有一些 frame其实可以使用到与 320Kbps frame 相同大小的空间。 而ABR/VBR模式则将bitreservoir的影响降到最低,因此需要允许使用 320Kbps 大小的 frame 才能达到与 CBR 相同的弹性。
版权
-c
将编码得到的文件标记为受版权保护的
检测削波
–clipdetect
允许执行–replaygain-accurate,并显示编码中是否出现削波和整个数值范围的波形如何。
如果MP3解码器明显禁止了LAME的构造(in the build of LAME),那么此参数就失去作用了。
也可查看: –replaygain-accurate
控制区块类型
-d
允许左右声道分别使用不同的区块类型。一般情况下,不允许使用此参数编码。因为好像FhG编码器也不允许使用此参数编码。如果有人经过编码后发现加上-d参数能使输出音质变好,请告诉我。(mt@sulaco.org )
mpglib解码功能
–decode
此参数是使用LAME的mpg123/mpglib界面,将MP3文件解码为WAV文件。输入文件可以是编码支持的任何格式,包括.mp3(layers 1, 2 and 3)和.ogg。
如果已经使用-t(禁止写入WAV文件头),LAME将不会输出原生endian格式的raw PCM(使用-x以交换类型)。
如果MP3解码器明确禁止了LAME的构造(in the build of LAME),那么此参数就失去作用了。
去加重
-e n/5/c
n = (none, 默认)
5 = 0/15 微秒
c = citt j.17
此参数就只是在比特流中设定一个标记。如果你有一个PCM输入文件,并且此文件中有被放大的上述类型的(被废弃的)加重,那么可以使用LAME设定此标记。然后在播放时,MP3解码器应该会在输出时去加重,尽管大部分解码器都会忽略此标记。
更好的解决办法是,在编码之前,就使用别的软件进行去加重操作,然后在编码时不要添加-e参数。
快速编码模式
-f
等同于 -q 7。
不推荐。如果不追求输出音质只追求编码速度的话,可以使用此参数。此参数禁止噪音修整,并且在分配比特和检测前回声时才会使用心理声学。
严格限定VBR码率的变动下限
-F
严格限定VBR码率的变动下限。不使用此参数的话,在静音部分,LAME将会忽略VBR码率的变动下限。
free format比特流
–freeformat
在此参数下,LAME将输出固定码率的free format比特流。使用此参数后,用户还必须使用 -b 在8-640kbps之间指定一个整数作为码率。
大部分解码器不支持free format比特流。而且,大多数支持free format比特流的解码器支持的最高码率仅为320 kbps。
支持free format比特流的解码器:
支持的最高码率
MAD 640 kbps
“lame –decode” 550 kbps
Freeamp: 440 kbps
l3dec: 310 kbps
高质量
-h
对编码质量进行改进。等同于 -q 2。
保持所有频率
-k
保持所有频率。(禁止所有滤波器)
在编码过程中,LAME会自动运用各种不同类型的低通滤波器。这是因为大量资料流量会在高频率中被消耗掉,而这些资料流量本应该被使用在较低的较重要的频率中。而-k会禁止LAME使用所有滤波器。不推荐。
模式:
-m m 单声道
-m s 立体声
-m j 联合立体声
-m f 强制使用中侧立体声
-m d 双(独立)声道
-m i 强度立体声
-m a 自动
单声道(MONO)是单声道输入文件的默认模式。如果对立体声输入文件指定编码参数为”-m m”,那么将会把立体声信号平均为单声道信号。
立体声(STEREO)
联合立体声(JOINTSTEREO)是固定码率编码码率不超过128kbps的立体声文件的默认模式。在更高的固定码率编码中,默认模式为立体声。在 VBR编码中,当VBR_q >4时,联合立体声为默认模式;当VBR_q <=4时,立体声为默认模式。可以通过在命令行中指定模式,以修改上述默认模式。
使用联合立体声意味着编码器可以使用(以帧为单 位)正规的立体声(对左右声道独立编码)或者中侧立体声。在中侧立体声模式下,分别对中央声道(L+R)和两侧声道(L-R)进行编码,并且将较多的资料 流量分配给中央声道。如果源信号没有太高的立体分离度(stereoseparation),那么中侧立体声模式可以有效地增加带宽。
中侧立体声(Mid/Side Stereo)基本上就是增加带宽的手段。在128 kbps下,中侧立体声的作用还是比较明显的。但是到了更高码率的时候,它就没什么作用了。
对于真正的单声道,可以使用”-m m”进行编码。此参数会自动将输入文件编码为单声道文件。在此情况下,”-m m”比”-m j”做得更好。
不适当地使用中侧立体声会导致听得见的压缩失真。频繁地在中侧和正规立体声之间切换的话,也会使输出音质变差。为了确定切换至中侧立体声的时间,LAME所使用的算法比ISO文件中所描述的要精密复杂得多。
强制使用中侧立体声也就是在所有的帧中强制使用中侧立体声进行编码。仅在确定输入文件的每一帧的立体分离度都很小的情况下,才能使用此参数。
双声道(DUAL CHANNELS) LAME尚未支持此模式。
强度立体声(INTENSITY STEREO)
自动(Auto)
自动选择(当输入文件为立体声时)
8 kbps 单声道
16- 96 kbps 强度立体声(如果不能使用强度立体声,则使用联合立体声。)
112-128 kbps 联合立体声 -mj
160-192 kbps -mj 带有可变的中侧上下限
224-320 kbps 独立立体声 -ms
MP3输入文件
–mp3input
输入文件为MP3文件。在重编码此文件之前,LAME会先将其解码。因为MP3是一种有损格式,所以一般情况下不推荐使用此参数。但是,在把高码率MP3变 为低码率MP3时,此参数还是很有用的。如果输入文件名后缀为”.mp3”,则会被LAME识别为MP3文件。对于标准输入或者文件名后缀不 为”.mp3”的MP3文件,则需要将其文件名后缀改为”.mp3”。
禁止显示柱状图
–nohist
默认情况下,正在创建VBR mp3的时候,LAME会显示一个码率柱状图。此参数可以禁止LAME显示柱状图。
禁止分析回放增益
–noreplaygain
默认情况下,回放增益分析功能是开启的。此参数可以关闭此功能。
也可查看: –replaygain-accurate, –replaygain-fast
不使用短区块
–noshort
在每一帧的编码中都使用长区块。不推荐。此参数仅为测试使用。
非原创
-o
将编码得到的文件标记为拷贝
保护CRC错误
-p
开启CRC错误保护。
是的,LAME真的能正确地运行此项功能。但是,此功能在每一帧都会额外消耗16比特的资料流量,而本来这些流量应该被用在编码上。
选择算法质量
-q n
码率当然是影响音质的最大因素。高码率也就意味着好音质。但是对于特定码率,我们则可以选择算法以获得最好的标度因子(scalefactors)和huffman编码(修正噪音)。
-q 0: 在所有算法中,此算法最慢,但是有可能获得最好的音质。
-q 2: 推荐。等同于 -h。-q 0和-q 1都很慢,并且在音质方面相对于-q 2也可能没有明显的提高。
-q 5: 默认值。编码速度不错,获得的音质也还比较合理。
-q 7: 等同于 -f。编码速度很快。音质还过得去。(禁止噪音修整,并且在分配比特和检测前回声时才会使用心理声学。)
-q 9: 禁止包含psy模式在内的所有算法。音质很差。
输入文件为raw pcm
-r
指定输入文件为raw PCM格式。使用此参数的同时,必须在命令行中指定采样率和单声道/立体声/联合立体声。如果不使用此函数,LAME则会对输入文件运行几次fseek(),以寻找WAV和AIFF文件头。
如果LAME被编译为使用LIBSNDFILE,则不支持此参数。
更精确地计算RG值并找出采样峰值
–replaygain-accurate
允许在不工作时(on the fly)解码。在已经解码的数据流上,计算”Radio”回放增益。找出采样的峰值,并将其储存到文件中。
回放增益分析数据并不会影响已经压缩好的数据流的内容。它只是一个储存在音频文件头的数值。下列网址详细列出了回放增益的用途和所使用的算法
默认情况下,LAME在输入文件上执行用户自定义音量缩放之后,再执行回放增益分析。因为有损压缩/解压缩输出模进(sequence)与开始的输入数据有 所不同,所以此项操作会出现轻微错误。使用–replaygain-accurate时,在不工作时解码MP3流,并且在解码后的数据流上执行分析。虽然在理论上来说,这种模式能获得更精确的结果,但是它也有几个缺点:
- 经过对输入数据和解码后数据的回放增益数值进行测试,两者的差异一般不超过0.5dB。尽管人耳所能分辨的最小音量差异为1.0dB左右。
- 在不工作时解码,这步操作明显使编码所需时间加长。
明显的好处则有:
- 使用–replaygain-accurate,可以确定采样的峰值,并且能将其储存在文件中。采样的峰值有助于解码器(播放器)避免出现名为’clipping’的负面影响。’clipping’会导致声音失真。
- 仅计算”Radio”回放增益。计算所得的数值被储存在LAME标签中。执行回放增益分析时,将会把文件的音量调整为参考音量值——89dB。
注意:3.95版本中的参考音量值为83dB。3.95.1版本中的参考音量值则为89dB。
如果MP3解码器明确禁止了LAME的构造(in the build of LAME),那么此参数就失去作用了。(注意:如果编译LAME时没有MP3解码器,LAME则会在执行用户自定义音量缩放之后,在输入文件上执行回放增益分析)
也可查看: –replaygain-fast, –noreplaygain, –clipdetect
快速计算RG值
–replaygain-fast
在执行用户自定义音量缩放,或者重采样之后,计算输入数据流的”Radio”回放增益。
回放增益分析数据并不会影响已经压缩好的数据流的内容。它只是一个储存在音频文件头的数值。下列网址详细列出了回放增益的用途和所使用的算法
仅计算”Radio”回放增益。计算所得的数值被储存在LAME标签中。执行回放增益分析时,将会把文件的音量调整为参考音量值——89dB。
注意:3.95版本中的参考音量值为83dB。3.95.1版本中的参考音量值则为89dB。
也可查看: –replaygain-accurate, –noreplaygain
以kHz为单位,指定输出文件的采样率
–resample n
n = 8,11.025,12,16,22.05,24,32,44.1,48
指定输出文件的采样率。如必要的话,重采样输入文件。
如果没有指定此参数,在追求最大压缩率的情况下,LAME有时会自动进行重采样。(比如说,将44.1 kHz的输入文件编码为32kbps。)为了防止出现上述操作,必须使用–resamle参数,把输出采样率设定为与输入采样率相同的数值。这样的话,LAME就不会执行额外的计算操作了。
以kHz为单位,指定输入文件的采样率
-s n
n = 以kHz为单位的采样率
当输入文件为raw PCM时,需要加上此参数。否则LAME将会根据输入文件的文件头信息决定采样率。
如有必要的话,LAME会自动把输入文件重采样为某个支持的MP3采样率。
无提示操作
-S
不显示进程报告和VBR柱形图
按比例增加音量
–scale
将PCM输入放大倍。此参数只能放大PCM数据。(在将其转换为浮点数据之后)
> 1: 增加音量
= 1: 无效果
< 1: 减少音量
请谨慎使用此参数。因为当解码所得的值大于32728时,大多数MP3解码器将会截短数据。
严格遵守ISO MPEG规格
–strictly-enforce-ISO
在此参数作用下,LAME将会把帧的总大小限定为7680比特。这将会导致在高码率部分浪费大量的资料流量。
禁止VBR标签
-t
禁止写入含VBR信息的标签。(仅在使用-v时才有效。)此标签储存在MP3文件的第0帧。此标签可以使播放器将文件识别为VBR,并开始查找和计算VBR文件的播放时间。
当使用了’–decode’(将WAV解码为MP3),此参数将禁止写入WAV文件头。输出文件格式为raw PCM,原生endian格式。使用-x以交换字节。
可变码率(VBR)
-v
开启VBR。使用VBR有多种方式。我个人喜欢使用VBR。VBR文件大小一般会稍大于128 kbps文件。因为在VBR编码模式下,在难编码的帧中需要消耗更多的资料流量。下列代码指定VBR的最小码率进行编码:
lame -v -b 112 input.wav output.mp3
如果觉得编码后得到的文件太大了,可使用-V n。n = 0…9。
lame -v -V n -b 112 input.wav output.mp3
以下代码可以在VBR编码模式下获得最高的压缩率:
lame -v input.wav output.mp3
lame -v -V n input.wav output.mp3 (用于调整输出音质/文件大小)
指定VBR编码质量
-V n
n = 0…9。 指定VBR_q值。
默认值n = 4,最佳音质n = 0,最佳压缩率n = 9。
不推荐使用n>=5的数值(音质低下)。 如果想继续增加压缩率,使用ABR可获得更好的输出音质。
VBR_q是怎么起作用的?
VBR_q值影响LAME在心里声学上的两个基本参数:
a) 人耳听力的绝对极限
b) 信噪比的采样
VBR_q值越低,注入的量化噪音也就会越低。
注意没有完美的psy模式。所以,即使psy模式声称编码后的文件不会出现听得见的失真,但是人们还是经常能听到编码后的文件出现失真。因此,在指定一个比 较小的码率下限进行编码时,即使使用了-V 0参数,也可能会出现过度压缩和听得见的失真。因此,听起来,使用-V 0还不如使用256 kbpsCBR进行编码。比如说,psy-model声称,在1 kHz的频宽内,人耳不会察觉到20dB的失真,所以LAME VBR -V0在此频宽内会尽可能提升压缩率,并会产生最大值为20dB的失真。使用256 kbpsCBR编码时,LAME则最多会产生2dB的失真。如果psy模式是正确的,上述两种编码所输出音质应该是一样的。如果psy模式是错误的,那么 VBR-0编码会使输出音质变差。
声音编码模式
–voice
实验性的声音编码模式参数。对44.1 kHz输入文件进行调整。
–voice参数已经作废了。可使用–preset voice代替此参数。
交换字节
-x
输入文件的交换字节(与–decode一起使用的话,则是输出文件的交换字节)。使用此参数可找出little endian/big endian类型的问题。如果输入文件发出的声音像是随机噪声,那么可以先试试这个参数。
控制OS/2程序优先权
–priority <类型>
(仅适用于OS/2)
设定LAME在IBMOS/2下运行时的程序优先权。设定此参数有助于避免在编码过程中系统变慢或者失去响应。通过设定LAME在较低的程序优先权下运行, 可使系统能够有更多的资源用于更新基本处理(如绘制窗口、登记键盘/鼠标的转态过程,等等)。如果是使用0-2的优先权,那么运行LAME对系统的影响就 会降到最低了。
有效参数有:
0 = 低 (IDLE, delta = 0)
1 = 中等 (IDLE, delta = +31)
2 = 标准 (REGULAR, delta = -31)
3 = 高 (REGULAR, delta = 0)
4 = 最高 (REGULAR, delta = +31)
注意:如果使用’–priority’而不带任何<类型>参数的话,LAME会自动使用’–priority 0’。
如果你对sox还有进一步的兴趣移步这里
为了方便我可耻地整理之后转载在下面
sox
Sox是最为著名的Open Source声音文件格式转换工具。已经被广泛移植到Dos、windows、OS2、Sun、Next、Unix、Linux等多个操作系统平台。
Sox项目是由Lance Norskog创立的,后来被众多的开发者逐步完善,现在已经能够支持很多种声音文件格式和声音处理效果。基本上常见的声音格式都能够支持。更加有用的是,Sox能够进行声音滤波、采样频率转换,这对那些从事声讯平台开发或维护的朋友非常有用。当然,Sox里面
也包括一些DSP算法,有兴趣的朋友可以下载回去研究。Sox可以用于任何用途。但是发布源代码时必须包括版权声明,发布二进制代码必须声明作者。
调整音量
首先来一个简单的命令,如下:
sox file1.wav -v 0.6 file2.wav
-v是调整音量的选项,0.6是参数,它是一种线性调整,并不是调整到原先的0.6,而是幅值调整,file2.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效果器
上式采用了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(节拍)效果器
下面例子则应用了tempo(节拍)效果器:
play *.wav tempo -q 0.8 82 20 16
在上面例子中,0.8设置新节拍相对于老节拍的比率,82设置所选算法要划分音频的片段大小,单位毫秒,20是音频长度,依靠它来搜索以寻找重叠点,16是重叠长度。
颤动(tremolo)效果器
下面给出一个颤动(tremolo)效果器的例子:
play file.wav tremolo 3.5 60
3.5是颤音频率,单位是赫兹Hz,60是深度百分比,具体来说就是”颤”到多长或深。
衰弱(fade)效果器
在电影中,有一种效果叫淡入淡出,在音乐中也有这种效果:
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的时间就结束了。上面的时间都可以选择以样本数量为单位,如上所述。
earwax
不知道大家有没有这样的感觉,就是有时候在用耳机听cd音乐时,耳朵时间长了会嗡嗡的响,感觉
音乐就象从耳朵扩散到外面一样,那是因为立体声效应,在SoX软件包内,有一过效果器可以消除这种现象,它就是earwax,举个例子:
play file.mp3 earwax
就是这样简单,就可以消除立体声效应了。
高频颤动(dither)效果器
有时候采样次寸小于24字节的话,会发生可听到的量化效应,应用dither(高频颤动)效果器可消除这种现象,它实际是故意地在信号里加入白噪声,举例如下:
play file.wav dither 100
上式中100是抖动深度(depth)值。
回声(echo)效果器
在自然界中,回声处处可见,比如站在高山上向周围的山喊话,就会引起回声。在喊和回声之间的时间间隔就是延迟,它的响度就是衰减值,下面给出一个回响例子:
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.43
衰减值最好不要大于0.5,否则可能引起输出饱和。
假如延迟很短,听起来像(金属的)机器人的表演。
play file.wav echo 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
上式由于延迟时间短,听起来感觉有点沉闷,不是吗?
和声(chorus)效果器
在乐理中有和声这样一种效果,它指的是两个以上不同的音按一定的法则同时发声而构成的音响组合。它包含:①和弦,是和声的基本素材,由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
翻边(flanger)效果器
在看恐怖电影时,人在和鬼魂遇到之前,往往会放一些音乐来渲染一下,在SoX中也有类似的效果器叫flanger,意思是翻边,或者回吹的意思。它将对等的两个声音混合在一起,但是其中一个时间上有些延迟,并随着时间不断变化,但是变化小于20ms听起来就象风吹过,速度变得忽快忽慢。flanger广泛用在恐怖和灵魂音乐中,那样吉他频率听起来时快时慢。先看一个简单的例子:
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。quadratic平方内插法,可选线性内插法lin。实际当中用不着指定这么多参数,很多默认的。但是有特别
需要另当別论。
余响(reverb)效果器
下面简单介绍另外一个效果器,余响reverb。余响(reverb)效果经常用在小演奏厅,那种场合人很多,对声音反射到墙上形成干扰。reverb使得声音感觉就象在一个大演奏厅似的。你可以在浴室或车上或健身馆里大喊一些话语,体验一下余响效果,你将听到话从墙上反射回来,举例如下:
play 杨望.wav reverb 1 600 180
上式中,1是输出音量,600是余响时间,180是延迟时间,延迟时间最好是余响时间的1/4到1/2。上面只考虑了一面墙的情形,如果还要考虑在多加一面墙,上式应为:
play 杨望.wav reverb 1 600 180 200
以此类推。
移相(phaser)效果器
在音乐处理过程中,经常要对声音进行移相处理,此时可用SoX中的phaser效果器进行处理,phaser效果器就象flanger特效,但是用reverb替换echo,并做相序迁移。它支持多种乐器。看下例:
play file.wav phaser 0.8 0.74 3 0.4 0.5 -t
3是延迟时间,它必须小于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表示无限次。
缩展(compand)效果器
在生活中,人们经常会在车上,或者公共场合用耳机听音乐,有时候听到低音段的时候,会把音量开得比较大,以便压过周围噪音,但是猛然间到了音高的地方,声音会忽然变大,大得耳朵受不了。特别是听交响乐的时候。有没有什么办法让它在低音部分不要那样小声,而在高音部分不要那样刺耳呢?这就是缩展器的作用了。压缩-扩展器允许信号动态地压缩或扩展。按照给定得起音和衰减参数,计算输入信号相对于时间的平均值,并按照给定的转换函数(功能)参数,设置输出信号的等级。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 17801
filter后面8000-和-17500代表低过滤,32代表高过滤,100和256代表窗口长度。filter表示Sinc滤波器,它全部除去给定带宽之上的信号分量而只保留低频信号的理想电子滤波器。filter后面的8000-表示低频,32表示高频,后面的filter类似,100是过滤窗口长度,highpass后面的数字是过滤频率。
增强(stretch)效果器
在实际工作中,有时需要改变声音的回放速率,但是同时维持它的音调,以取得某种戏剧性效果,可以通过stretch效果器做到。例如,要将回放速率改为原先的2倍:
play file.wav stretch 2
变速(speed)效果器
另外一个类似的效果器是speed,它用来改变回放调子和节拍。如:
play file.wav speed 2
变音(pitch)效果器
而为了升高样本1个短调(100音分),可以这样做:
play file.wav pitch 100