SoX — 音頻處理工具里的瑞士軍刀

SoX(即 Sound eXchange)是一個(gè)跨平臺(tái)(Windows,Linux,MacOS 等)的命令行實(shí)用程序,可以將各種格式的音頻文件轉(zhuǎn)換為需要的其他格式。
SoX 還可以對(duì)輸入的音頻文件應(yīng)用各種效果,也支持在大多數(shù)平臺(tái)上播放錄制音頻文件。

一、簡介

SoX 可以讀取寫入常見格式的音頻文件,并在此過程中選擇性的加入一些聲音效果。
它可以組合多個(gè)輸入源及合成音效,在許多系統(tǒng)上也可以作為音頻播放器多軌錄音機(jī)使用。
SoX 工具在大部分 Linux 系統(tǒng)上都可以直接通過軟件包管理器安裝(如 sudo apt-get install sox),Mac 系統(tǒng)上則可以使用 brew install sox 命令。

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

SoX 工具的所有功能都可以通過一個(gè)簡單的 sox 命令及相應(yīng)的選項(xiàng)實(shí)現(xiàn)。但它同時(shí)提供了 play 命令用于播放音頻文件,rec 命令用于錄制音頻,以及 soxi 命令用于獲取音頻的文件頭中包含的信息。

上述幾個(gè)命令的基本格式如下:

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. 獲取音頻文件的元數(shù)據(jù)

soxisox --i 命令可以通過分析音頻文件的文件頭,獲取其元數(shù)據(jù)(如通道數(shù)采樣率編碼等)。

$ 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 命令跟上某個(gè)特定的選項(xiàng)可以只獲取該選項(xiàng)對(duì)應(yīng)的信息,如只顯示某音頻文件 Faded.wav比特率(Bit Rate):

$ soxi -B Faded.wav
1.41M

soxi 命令支持的所有選項(xiàng)及其含義如下:

$ 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. 獲取音頻的統(tǒng)計(jì)信息

可以使用 sox <inputfile> -n stat 命令獲取某音頻文件的統(tǒng)計(jì)信息。示例如下:

$  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 選項(xiàng)用于指定播放或錄制時(shí)使用的音頻設(shè)備,不指定時(shí)則表示使用默認(rèn)設(shè)備。

可以這樣理解

  • sox existing-file.wav -d 就是從 existing-file.wav 文件中讀取其包含的音頻數(shù)據(jù),再輸出到 -d (默認(rèn)音頻設(shè)備,揚(yáng)聲器)進(jìn)行播放;
  • sox -d new-file.wav 就是從 -d (默認(rèn)音頻設(shè)備,麥克風(fēng))中讀取音頻數(shù)據(jù),再輸出(錄制)到 new-file.wav 文件中。

其實(shí)都遵循了一個(gè)基本的格式,即 sox <input> <output> 。而其中的 <input><output> 根據(jù)需要既可以為某個(gè)具體的音頻文件,也可以是某個(gè)具體的音頻設(shè)備


播放或錄制的同時(shí),也可以對(duì)音頻文件應(yīng)用指定的編輯操作或效果選項(xiàng),因此在對(duì)音頻數(shù)據(jù)應(yīng)用某效果前,可以先使用 play 命令進(jìn)行“預(yù)覽”。

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. 音頻格式轉(zhuǎn)換
文件格式類型

對(duì)于音頻數(shù)據(jù)格式的描述,主要通過以下 4 種屬性:

  • 采樣率(sample rate):指聲音由模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào)的過程中,每秒從連續(xù)信號(hào)中提取的用于組成離散信號(hào)的樣本個(gè)數(shù)。
    音頻CD所用的采樣率為 44100 Hz,數(shù)字音頻磁帶和許多計(jì)算機(jī)系統(tǒng)使用 48000 Hz,專業(yè)級(jí)音頻系統(tǒng)通常使用 96000 Hz。

  • 采樣大小(sample size 或 Precision):音頻采樣時(shí)用于存儲(chǔ)每個(gè)樣本的數(shù)據(jù)位數(shù)(bits)。如今 16 bit 的采樣大小已被廣泛使用,24 bit 主要用于專業(yè)音頻領(lǐng)域。

  • 編碼格式(data encoding):即每個(gè)音頻樣本的表示(即“編碼”)方式。常用的編碼類型包括 floating-point、μ-law、ADPCM、singed-integer PCM、MP3 和 FLAC 等。

  • 通道(channel):即文件中包含的音頻通道的數(shù)量。其中單聲道(mono)和雙聲道(stereo)是最常見的兩種,“環(huán)繞聲”音頻(Surround sound)通常包含六個(gè)或更多聲道。

此外,音頻文件還使用比特率(Bit Rate)表示一個(gè)單位時(shí)間內(nèi)編碼音頻信號(hào)占用的存儲(chǔ)空間大小, 它的數(shù)值一般取決于所有的上述四個(gè)參數(shù)。
MP3 編碼的立體聲音樂通常具有 128-196kbps 的比特率, FLAC 編碼的立體聲音樂通常具有 550-760kbps 的比特率。

我個(gè)人是這樣想的,,,可以將一段音頻數(shù)據(jù)看成很長很長的一排蘋果樹,從頭走到尾,每隔一段距離停下,摘下滿滿一筐蘋果。。。
筐的大小就是采樣大小,停下來采摘的次數(shù)就是采樣頻率,比特率就是把一定數(shù)量的蘋果“榨成汁”(以特定的格式對(duì)音頻編碼)以后的重量,當(dāng)然有些榨汁方法會(huì)造成一定的損失。

格式轉(zhuǎn)換

形式最簡單的 sox 命令即使用兩個(gè)文件名作為參數(shù),如:
$ sox Faded.wav Faded.mp3 :將 Faded.wav 文件的格式由 wav 轉(zhuǎn)為 mp3

上述命令執(zhí)行時(shí),SoX 會(huì)先從 Faded.wav 文件中讀取音頻數(shù)據(jù),再將其輸出到 Faded.mp3 文件中。而 SoX 程序會(huì)根據(jù)參數(shù)中文件名的后綴推斷出相應(yīng)的格式,并在復(fù)制音頻數(shù)據(jù)的過程中自動(dòng)進(jìn)行轉(zhuǎn)碼。

SoX 可以處理 self-describingraw 格式的音頻文件。
self-describing 格式(如 WAV、FLAC、MP3)的文件包含一個(gè)用于描述信號(hào)和編碼屬性的文件頭,而 rawheadless 格式的音頻則不包含這些信息。

所以當(dāng) raw 格式的音頻作為輸入文件時(shí),需要在 sox 命令的格式選項(xiàng)里指定其信號(hào)和編碼屬性。

常用的音頻格式選項(xiàng):

選項(xiàng) 描述
-b, --bits BITS 每個(gè)編碼樣本占用的數(shù)據(jù)位數(shù)
-c, --channels CHANNELS 音頻文件包含的通道數(shù)
-e, --encoding ENCODING 音頻文件的編碼類型
-r, --rate RATE 音頻文件的采樣率
-t, --type FILE-TYPE 音頻文件的文件類型

上述選項(xiàng)適用于輸入或輸出文件,主要用于說明 raw(或 headless)文件作為輸入時(shí)的格式信息,或格式轉(zhuǎn)換時(shí)指定輸出文件的具體參數(shù)。

$ sox ?r 48k ?e float ?b 32 ?c 2 input.raw output.wav
將某個(gè)特定的 raw 格式的音頻文件轉(zhuǎn)換為 wav 格式

$ sox Faded.wav Faded.raw
將音頻文件 Faded.wav 轉(zhuǎn)為 raw 格式

$ play -r 44800 -b 16 -e signed-integer -c 2 Faded.raw
播放 raw 格式的音頻文件

$ sox Faded.wav -c 1 Faded-mono.wav
Faded.wav 文件轉(zhuǎn)換成單聲道(-c 1)后輸出

三、音頻效果

SoX 工具可以在音頻處理的過程中,對(duì)輸入的音頻數(shù)據(jù)應(yīng)用眾多的效果
可以使用如下命令查看所有效果的幫助信息:

$ sox --help-effect all | less
sox:      SoX v

Effect usage:

allpass frequency width[h|k|q|o]


band [-n] center [width[h|k|q|o]]


bandpass [-c] frequency width[h|k|q|o]


bandreject frequency width[h|k|q|o]


bass gain [frequency(100) [width[s|h|k|q|o]](0.5s)]


bend [-f frame-rate(25)] [-o over-sample(16)] {start,cents,end}

:

也可以直接查看具體某個(gè)音頻效果的使用方法:

$  sox --help-effect echo
sox:      SoX v

Effect usage:

echo gain-in gain-out delay decay [ delay decay ... ]

以下是一些簡單的應(yīng)用場景。

1. 更改聲道數(shù)

sox 命令可以更改音頻文件中聲道的數(shù)目,如將單聲道音頻轉(zhuǎn)換成雙聲道:
$ sox foo.wav foostereo.wav channels 2$ sox foo.wav -c 2 foostereo.wav

但是上述命令并沒有創(chuàng)建一個(gè)“真實(shí)”的雙聲道音頻,而是將單聲道音頻復(fù)制成完全一致的兩個(gè)聲道再合并到輸出文件中。

可以通過 sox 命令的 -M 選項(xiàng)將左右兩個(gè)聲道的單聲道音頻合并成一個(gè)雙聲道文件:
$ sox -M left.wav right.wav stereo.wav

當(dāng)然,也可以通過對(duì)雙聲道文件中兩個(gè)聲道的均一化處理,將其輸出為單聲道音頻:
$ sox original.wav mono.wav channels 1$ sox original.wav -c 1 mono.wav

remix

通過 sox 命令的 remix 效果也可以完成對(duì)聲道數(shù)據(jù)的提取或融合。

提取雙聲道音頻文件中單個(gè)聲道的數(shù)據(jù)并作為單聲道音頻輸出:
$ sox stereo.wav left.wav remix 1 (提取左聲道音頻)
$ sox stereo.wav right.wav remix 2 (提取右聲道音頻)

融合雙聲道文件中兩個(gè)聲道的音頻數(shù)據(jù)并作為單聲道音頻輸出:
$ sox stereo.wav mono.wav remix 1,2
$ sox stereo.wav mono.wav remix 1-2

此外,remix 還可以將輸入文件中的多個(gè)聲道數(shù)據(jù)分別進(jìn)行融合。
如使用 -M 選項(xiàng)將兩個(gè)雙聲道音頻合并,再通過 remix 將合并得到的四個(gè)聲道兩兩融合,生成一個(gè)只包含兩個(gè)聲道的輸出文件。
$ sox -M stereo1.wav stereo2.wav output.wav remix 1,3 2,4

2. 改變音量

sox 命令的 -v 選項(xiàng)可以用來(成倍地)改變音量的大小:
$ sox -v 0.5 foo.wav bar.wav
上述命令將 foo.wav 音頻放大 0.5 倍音量后輸出至 bar.wav 文件

可以將音量放大功能與 stat 效果結(jié)合。
sox foo.wav -n stat -v 命令返回的數(shù)字作為放大倍數(shù),將最大化 foo.wav 的音量而不至于出現(xiàn)削波

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

此外,還有一個(gè)選項(xiàng) --norm 用來歸一化音頻響度。為了最大化音頻的聲音強(qiáng)度,可以在處理輸入音頻時(shí)將該選項(xiàng)設(shè)置為 -1:
sox --norm=-1 <inputfile> <outputfile>

3. 提取文件的某個(gè)部分

sox 命令的 trim 效果可以將輸入音頻的某一段裁剪出來并提取到輸出文件中。

trim 接收兩個(gè)參數(shù),一個(gè)作為裁剪片段的起始位置,另一個(gè)作為該片段持續(xù)的時(shí)間。
可以使用整數(shù)+s格式的參數(shù)以樣本個(gè)數(shù)作為計(jì)量單位,也可以直接使用 ((hh:)mm:)ss(.fs) 形式的時(shí)間參數(shù)。當(dāng)參數(shù)為純整數(shù)時(shí),單位為秒。

$ sox Input.wav Half1.wav trim 0 30:00 截取輸入文件中前 30 分鐘的音頻
$ sox Input.wav Half2.wav trim 30:00 30:00 截取輸入文件中從第 30 分鐘開始到第 60 分鐘的音頻

4. 拼接文件

與前面裁剪提取的操作相反,sox 命令還可以實(shí)現(xiàn)對(duì)兩個(gè)或多個(gè)音頻文件的拼接。

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

5. 合成音頻

sox 命令可以通過 synth 效果合成許多標(biāo)準(zhǔn)波形和噪聲類型。

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

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

6. 靜音效果

sox 命令可以創(chuàng)建靜音狀態(tài)的音頻片段,使用 -n 選項(xiàng)表示沒有輸入,通過 trim 效果指定需要靜音的片段。

$ sox -n -r 48000 silence.wav trim 0.0 0.250
slience.wav 文件中創(chuàng)建一段長度為 250ms 采樣率為 48000Hz 的靜音片段。

7. 混合音頻

sox 命令的 -m 選項(xiàng)可以將兩個(gè)音頻文件混合以后生成輸出文件。

$ sox -m sine100.wav sine250.wav sine100-250.wav
sine100.wavsine250.wav 兩個(gè)音頻文件融合以后作為 sine100-250.wav 文件的音頻數(shù)據(jù)。

$ sox -m -v0.5 music.mp3 -v2 speech.wav presentation.wav
將背景音樂(music.mp3)音量降低一半后與放大 2 倍音量的人聲數(shù)據(jù)(speech.wav)融合。

如果不確定融合效果,可以先通過 play 命令使用相同的參數(shù)對(duì)結(jié)果進(jìn)行“預(yù)覽”:
$ play -m -v0.5 music.mp3 -v2 speech.wav

PS
與前面的 -M 選項(xiàng)不同,-m 選項(xiàng)傾向于對(duì)聲道數(shù)據(jù)的混合,即兩個(gè)單聲道文件通過 -m 混合以后輸出仍是單聲道數(shù)據(jù)。輸出文件中的單個(gè)聲道包含了輸入的兩個(gè)聲道的特征。

-M 選項(xiàng)更傾向于對(duì)音頻文件的合并,默認(rèn)不對(duì)聲道數(shù)據(jù)進(jìn)行混合。所以兩個(gè)單聲道文件通過 -M 合并以后默認(rèn)輸出雙聲道音頻。輸出文件中的兩個(gè)聲道分別對(duì)應(yīng)于輸入的兩個(gè)聲道(數(shù)據(jù)沒有混合)。除非通過 -c 選項(xiàng)手動(dòng)指定輸出文件的聲道數(shù)量。

8. 改變播放速度

可以通過 stretch 效果改變音頻文件的播放速度,同時(shí)不會(huì)導(dǎo)致音高的變化。

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

也可以通過 speed 效果調(diào)節(jié)播放速度(相應(yīng)地音高也會(huì)發(fā)生變化):
$ play Faded.wav speed 2

此外,可以使用 pitch 效果調(diào)節(jié)音頻片段的音高,以音分(cents)為單位。

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

參考資料

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • SoX 是一款強(qiáng)大音頻文件工具箱,是音頻操作方面的瑞士軍刀, 轉(zhuǎn)碼, 播放, 錄制,以及查看音頻文件格式都很方便,...
    老瓦在霸都閱讀 7,367評(píng)論 1 1
  • 前言: 記載資料多為網(wǎng)絡(luò)搜集,侵刪。 根據(jù)最近接觸的整機(jī)項(xiàng)目做了一些整機(jī)音頻相關(guān)基礎(chǔ)知識(shí)的總結(jié),如有不足或表述問題...
    Gawain_Knowknow閱讀 8,301評(píng)論 0 4
  • 要在計(jì)算機(jī)內(nèi)播放或是處理音頻文件,也就是要對(duì)聲音文件進(jìn)行數(shù)、模轉(zhuǎn)換,這個(gè)過程同樣由采樣和量化構(gòu)成,人耳所能聽到的聲...
    Viking_Den閱讀 10,320評(píng)論 1 10
  • 昨天周四,早上起來出操去了,畢竟班主任要來,而且要把沒跑步補(bǔ)上,所以出完操就跑了五圈,跑完就回宿舍補(bǔ)覺了,等到了七...
    堅(jiān)志閱讀 163評(píng)論 0 0
  • 今天又增加了一個(gè),每天早上看書半小時(shí),這個(gè)可少不了你的配合哦。一個(gè)月后,三個(gè)月后,半年后,一年后,我們會(huì)變得大不同...
    檜楓閱讀 187評(píng)論 0 0