LinuxLinux学习之路我用 Linux

SoX — 音频处理工具里的瑞士军刀

2018-12-18  本文已影响4人  rollingstarky

SoX(即 Sound eXchange)是一个跨平台(Windows,Linux,MacOS 等)的命令行实用程序,可以将各种格式的音频文件转换为需要的其他格式。
SoX 还可以对输入的音频文件应用各种效果,也支持在大多数平台上播放录制音频文件。

一、简介

SoX 可以读取写入常见格式的音频文件,并在此过程中选择性的加入一些声音效果。
它可以组合多个输入源及合成音效,在许多系统上也可以作为音频播放器多轨录音机使用。
SoX 工具在大部分 Linux 系统上都可以直接通过软件包管理器安装(如 sudo apt-get install sox),Mac 系统上则可以使用 brew install sox 命令。

SoX 处理音频的基本流程如下:
Input(s) -> Combiner -> Effects -> Output(s)

SoX 工具的所有功能都可以通过一个简单的 sox 命令及相应的选项实现。但它同时提供了 play 命令用于播放音频文件,rec 命令用于录制音频,以及 soxi 命令用于获取音频的文件头中包含的信息。

上述几个命令的基本格式如下:

SYNOPSIS
       sox [global-options] [format-options] infile1
            [[format-options] infile2] ... [format-options] outfile
            [effect [effect-options]] ...

       play [global-options] [format-options] infile1
            [[format-options] infile2] ... [format-options]
            [effect [effect-options]] ...

       rec [global-options] [format-options] outfile
            [effect [effect-options]] ...
       
       soxi [-V[level]] [-T] [-t|-r|-c|-s|-d|-D|-b|-B|-p|-e|-a] infile1 ...

二、基本使用

1. 获取音频文件的元数据

soxisox --i 命令可以通过分析音频文件的文件头,获取其元数据(如通道数采样率编码等)。

$ soxi Faded.wav

Input File     : 'Faded.wav'
Channels       : 2
Sample Rate    : 44100
Precision      : 16-bit
Duration       : 00:03:32.63 = 9376836 samples = 15947 CDDA sectors
File Size      : 37.5M
Bit Rate       : 1.41M
Sample Encoding: 16-bit Signed Integer PCM

soxi 命令跟上某个特定的选项可以只获取该选项对应的信息,如只显示某音频文件 Faded.wav比特率(Bit Rate):

$ soxi -B Faded.wav
1.41M

soxi 命令支持的所有选项及其含义如下:

$ soxi
Usage: soxi [-V[level]] [-T] [-t|-r|-c|-s|-d|-D|-b|-B|-p|-e|-a] infile1 ...

-t  Show detected file-type
-r  Show sample-rate
-c  Show number of channels
-s  Show number of samples (0 if unavailable)
-d  Show duration in hours, minutes and seconds (0 if unavailable)
-D  Show duration in seconds (0 if unavailable)
-b  Show number of bits per sample (0 if not applicable)
-B  Show the bitrate averaged over the whole file (0 if unavailable)
-p  Show estimated sample precision in bits
-e  Show the name of the audio encoding
-a  Show file comments (annotations) if available

With no options, as much information as is available is shown for
each given file.
2. 获取音频的统计信息

可以使用 sox <inputfile> -n stat 命令获取某音频文件的统计信息。示例如下:

$  sox Faded.wav -n stat
Samples read:          18753672
Length (seconds):    212.626667
Scaled by:         2147483647.0
Maximum amplitude:     0.977417
Minimum amplitude:    -0.977478
Midline amplitude:    -0.000031
Mean    norm:          0.229415
Mean    amplitude:    -0.000006
RMS     amplitude:     0.302594
Maximum delta:         1.765564
Minimum delta:         0.000000
Mean    delta:         0.202369
RMS     delta:         0.273320
Rough   frequency:         6339
Volume adjustment:        1.023
3. 播放与录制

playrec 命令提供了最基本的播放和录制功能。
播放:$ play existing-file.wav
录制:$ rec new-file.wav

上述命令等同于 sox 命令的如下形式:
$ sox existing-file.wav −d(播放)和 sox −d new-file.wav(录制)
其中 -d 选项用于指定播放或录制时使用的音频设备,为空时则表示使用默认设备。

播放或录制的同时也可以对该音频文件应用指定的编辑操作或效果选项,因此在对音频数据应用某效果前,可以先使用 play 命令进行“预览”。

trim 效果可以从音频文件中裁剪提取指定的片段到输出文件。play 命令通过该效果可以直接播放指定片段:
$ play foo.wav trim 10.0 5.0$ play foo.wav trim 10.0 =15.0
播放 foo.wav 文件中 10-15s 之间的音频片段

使用 echo 效果播放 Faded.wav 文件:

$ play Faded.wav echo 0.8 0.88 200.0 0.4

Faded.wav:

 File Size: 37.5M     Bit Rate: 1.41M
  Encoding: Signed PCM
  Channels: 2 @ 16-bit
Samplerate: 44100Hz
Replaygain: off
  Duration: 00:03:32.63

In:12.1% 00:00:25.82 [00:03:06.81] Out:1.14M [-=====|=====-] Hd:2.7 Clip:0
4. 音频格式转换
文件格式类型

对于音频数据格式的描述,主要通过以下 4 种属性:

此外,音频文件还使用比特率(Bit Rate)表示一个单位时间内编码音频信号占用的存储空间大小, 它的数值一般取决于所有的上述四个参数。
MP3 编码的立体声音乐通常具有 128-196kbps 的比特率, FLAC 编码的立体声音乐通常具有 550-760kbps 的比特率。

我个人是这样想的,,,可以将一段音频数据看成很长很长的一排苹果树,从头走到尾,每隔一段距离停下,摘下满满一筐苹果。。。
筐的大小就是采样大小,停下来采摘的次数就是采样频率,比特率就是把一定数量的苹果“榨成汁”(以特定的格式对音频编码)以后的重量,当然有些榨汁方法会造成一定的损失。

格式转换

形式最简单的 sox 命令即使用两个文件名作为参数:
$ sox Faded.wav Faded.mp3
上述命令将 Faded.wav 文件的格式由 wav 转为 mp3
SoX 程序会根据参数中文件名的后缀自行推断出相应的格式。

SoX 可以处理 self-describingraw 格式的音频文件。
self-describing 格式(如 WAV、FLAC、MP3)的文件包含一个用于描述信号和编码属性的文件头,而 rawheadless 格式的音频则不包含这些信息。

所以当 raw 格式的音频作为输入文件时,需要在 sox 命令的格式选项里指定其信号和编码属性。

常用的音频格式选项:

选项 描述
-b, --bits BITS 每个编码样本占用的数据位数
-c, --channels CHANNELS 音频文件包含的通道数
-e, --encoding ENCODING 音频文件的编码类型
-r, --rate RATE 音频文件的采样率
-t, --type FILE-TYPE 音频文件的文件类型

上述选项适用于输入或输出文件,主要用于说明 raw(或 headless)文件作为输入时的格式信息,或格式转换时指定输出文件的具体参数。

$ sox −r 48k −e float −b 32 −c 2 input.raw output.wav
将某个特定的 raw 格式的音频文件转换为 wav 格式

$ sox Faded.wav Faded.raw
将音频文件 Faded.wav 转为 raw 格式
$ play -r 44800 -b 16 -e signed-integer -c 2 Faded.raw
播放 raw 格式的音频文件

$ sox Faded.wav -c 1 Faded-mono.wav
Faded.wav 文件转换成单声道(-c 1)后输出

三、音频效果

1. 更改声道数

sox 命令可以更改音频文件中声道的数目,如将单声道音频转换成双声道:
$ sox foo.wav foostereo.wav channels 2$ sox foo.wav -c 2 foostereo.wav

但是上述命令并没有创建一个“真实”的双声道音频,而是将单声道音频复制成完全一致的两个声道再合并到输出文件中。

可以通过 sox 命令的 -M 选项将左右两个声道的单声道音频合并成一个双声道文件:
$ sox -M left.wav right.wav stereo.wav

当然,也可以通过对双声道文件中两个声道的均一化处理,将其输出为单声道音频:
$ sox original.wav mono.wav channels 1$ sox original.wav -c 1 mono.wav

remix

通过 sox 命令的 remix 效果也可以完成对声道数据的提取或融合。

提取双声道音频文件中单个声道的数据并作为单声道音频输出:
$ sox stereo.wav left.wav remix 1 (提取左声道音频)
$ sox stereo.wav right.wav remix 2 (提取右声道音频)

融合双声道文件中两个声道的音频数据并作为单声道音频输出:
$ sox stereo.wav mono.wav remix 1,2
$ sox stereo.wav mono.wav remix 1-2

此外,remix 还可以将输入文件中的多个声道数据分别进行融合。
如使用 -M 选项将两个双声道音频合并,再通过 remix 将合并得到的四个声道两两融合,生成一个只包含两个声道的输出文件。
$ sox -M stereo1.wav stereo2.wav output.wav remix 1,3 2,4

2. 改变音量

sox 命令的 -v 选项可以用来(成倍地)改变音量的大小:
$ sox -v 0.5 foo.wav bar.wav
上述命令将 foo.wav 音频放大 0.5 倍音量后输出至 bar.wav 文件

可以将音量放大功能与 stat 效果结合。
sox foo.wav -n stat -v 命令返回的数字作为放大倍数,将最大化 foo.wav 的音量而不至于出现削波

$ sox foo.wav -n stat -v 2> vc
$ sox -v `cat vc` foo.wav foo-maxed.wav

此外,还有一个选项 --norm 用来归一化音频响度。为了最大化音频的声音强度,可以在处理输入音频时将该选项设置为 -1:
sox --norm=-1 <inputfile> <outputfile>

3. 提取文件的某个部分

sox 命令的 trim 效果可以将输入音频的某一段裁剪出来并提取到输出文件中。

trim 接收两个参数,一个作为裁剪片段的起始位置,另一个作为该片段持续的时间。
可以使用整数+s格式的参数以样本个数作为计量单位,也可以直接使用 ((hh:)mm:)ss(.fs) 形式的时间参数。当参数为纯整数时,单位为秒。

$ sox Input.wav Half1.wav trim 0 30:00 截取输入文件中前 30 分钟的音频
$ sox Input.wav Half2.wav trim 30:00 30:00 截取输入文件中从第 30 分钟开始到第 60 分钟的音频

4. 拼接文件

与前面裁剪提取的操作相反,sox 命令还可以实现对两个或多个音频文件的拼接。

$ sox Half1.wav Half2.wav Full.wav
Half1.wavHalf2.wav 合并至 Full.wav 文件。注意合并前的音频文件需保持一致的类型和采样率等。

5. 合成音频

sox 命令可以通过 synth 效果合成许多标准波形和噪声类型。

$ sox -n sine.wav synth 1.0 sine 1000.0
合成频率为 1000 Hz 长度为 1 秒的正弦波,保存至 sine.wav 文件中。

synth 支持合成的声音类型包括 sinesquaretrianglesawtoothtrapetz (trapezoidal)exp (exponential)whitenoisepinknoisebrownnoise

6. 静音效果

sox 命令可以创建静音状态的音频片段,使用 -n 选项表示没有输入,通过 trim 效果指定需要静音的片段。

$ sox -n -r 48000 silence.wav trim 0.0 0.250
slience.wav 文件中创建一段长度为 250ms 采样率为 48000Hz 的静音片段。

7. 混合音频

sox 命令的 -m 选项可以将两个音频文件混合以后生成输出文件。

$ sox -m sine100.wav sine250.wav sine100-250.wav
sine100.wavsine250.wav 两个音频文件融合以后作为 sine100-250.wav 文件的音频数据。

$ sox -m -v0.5 music.mp3 -v2 speech.wav presentation.wav
将背景音乐(music.mp3)音量降低一半后与放大 2 倍音量的人声数据(speech.wav)融合。

如果不确定融合效果,可以先通过 play 命令使用相同的参数对结果进行“预览”:
$ play -m -v0.5 music.mp3 -v2 speech.wav

PS
与前面的 -M 选项不同,-m 选项倾向于对声道数据的混合,即两个单声道文件通过 -m 混合以后输出仍是单声道数据。输出文件中的单个声道包含了输入的两个声道的特征。

-M 选项更倾向于对音频文件的合并,默认不对声道数据进行混合。所以两个单声道文件通过 -M 合并以后默认输出双声道音频。输出文件中的两个声道分别对应于输入的两个声道(数据没有混合)。除非通过 -c 选项手动指定输出文件的声道数量。

8. 改变播放速度

可以通过 stretch 效果改变音频文件的播放速度,同时不会导致音高的变化。

如以 2x 倍速播放 Faded.wav 文件:
$ play Faded.wav stretch 0.5

也可以通过 speed 效果调节播放速度(相应地音高也会发生变化):
$ play Faded.wav speed 2

此外,可以使用 pitch 效果调节音频片段的音高,以音分(cents)为单位。

$ play Faded.wav pitch 200
Faded.wav 文件中的音频提高 200 音分,即提高 2 个半音的音程(每一个半音的音程等于 100 音分)。

参考资料

SoX
Using Sox
How to process audio files from the command line with SoX

上一篇下一篇

猜你喜欢

热点阅读