首页 > 代码库 > Sox语音转换的相关知识

Sox语音转换的相关知识

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效果器,下节再见。

第二节 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 60
3.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 -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表示无限次。

在生活中,人们经常会在车上,或者公共场合用耳机听音乐,有时候听到低音段的时候,会把音量开
得比较大,以便压过周围噪音,但是猛然间到了音高的地方,声音会忽然变大,大得耳朵受不了。特
别是听交响乐的时候。有没有什么办法让它在低音部分不要那样小声,而在高音部分不要那样刺
耳呢?这就是缩展器的作用了。压缩-扩展器允许信号动态地压缩或扩展。按照给定得起音和衰减
参数,计算输入信号相对于时间的平均值,并按照给定的转换函数(功能)参数,设置输出信号的等
级。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效果器做到,例如,要将回放速率改为原先的2倍:

play file.wav stretch 2

另外一个类似的效果器是speed,它用来改变回放调子和节拍。如:

play file.wav speed 2

而为了升高样本1个短调(100音分),可以这样做:

play file.wav pitch 100