前言
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 ...
二、基本使用
- 獲取音頻文件的元數據
soxi 或 sox --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.
- 獲取音頻的統計信息
可以使用 sox -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
- 播放與錄製
play 和 rec 命令提供了最基本的播放和錄製功能。
播放:$ play existing-file.wav
錄製:$ rec new-file.wav
上述命令等同於 sox 命令的如下形式:
$ sox existing-file.wav −d(播放)和 sox −d new-file.wav(錄製)
其中 -d 選項用於指定播放或錄製時使用的音頻設備,不指定時則表示使用默認設備。
可以這樣理解:
sox existing-file.wav -d 就是從 existing-file.wav 文件中讀取其包含的音頻數據,再輸出到 -d (默認音頻設備,揚聲器)進行播放;
sox -d new-file.wav 就是從 -d (默認音頻設備,麥克風)中讀取音頻數據,再輸出(錄製)到 new-file.wav 文件中。
其實都遵循了一個基本的格式,即 sox 。而其中的 和 根據需要既可以爲某個具體的音頻文件,也可以是某個具體的音頻設備。
播放或錄製的同時,也可以對音頻文件應用指定的編輯操作或效果選項,因此在對音頻數據應用某效果前,可以先使用 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 種屬性:
採樣率(sample rate):指聲音由模擬信號轉換成數字信號的過程中,每秒從連續信號中提取的用於組成離散信號的樣本個數。
音頻CD所用的採樣率爲 44100 Hz,數字音頻磁帶和許多計算機系統使用 48000 Hz,專業級音頻系統通常使用 96000 Hz。
採樣大小(sample size 或 Precision):音頻採樣時用於存儲每個樣本的數據位數(bits)。如今 16 bit 的採樣大小已被廣泛使用,24 bit 主要用於專業音頻領域。
編碼格式(data encoding):即每個音頻樣本的表示(即“編碼”)方式。常用的編碼類型包括 floating-point、μ-law、ADPCM、singed-integer PCM、MP3 和 FLAC 等。
通道(channel):即文件中包含的音頻通道的數量。其中單聲道(mono)和雙聲道(stereo)是最常見的兩種,“環繞聲”音頻(Surround sound)通常包含六個或更多聲道。
此外,音頻文件還使用比特率(Bit Rate)表示一個單位時間內編碼音頻信號佔用的存儲空間大小, 它的數值一般取決於所有的上述四個參數。
MP3 編碼的立體聲音樂通常具有 128-196kbps 的比特率, FLAC 編碼的立體聲音樂通常具有 550-760kbps 的比特率。
我個人是這樣想的,,,可以將一段音頻數據看成很長很長的一排蘋果樹,從頭走到尾,每隔一段距離停下,摘下滿滿一筐蘋果。。。
筐的大小就是採樣大小,停下來採摘的次數就是採樣頻率,比特率就是把一定數量的蘋果“榨成汁”(以特定的格式對音頻編碼)以後的重量,當然有些榨汁方法會造成一定的損失。
格式轉換
形式最簡單的 sox 命令即使用兩個文件名作爲參數,如:
$ sox Faded.wav Faded.mp3 :將 Faded.wav 文件的格式由 wav 轉爲 mp3
上述命令執行時,SoX 會先從 Faded.wav 文件中讀取音頻數據,再將其輸出到 Faded.mp3 文件中。而 SoX 程序會根據參數中文件名的後綴推斷出相應的格式,並在複製音頻數據的過程中自動進行轉碼。
SoX 可以處理 self-describing 和 raw 格式的音頻文件。
self-describing 格式(如 WAV、FLAC、MP3)的文件包含一個用於描述信號和編碼屬性的文件頭,而 raw 或 headless 格式的音頻則不包含這些信息。
所以當 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)後輸出
三、音頻效果
SoX 工具可以在音頻處理的過程中,對輸入的音頻數據應用衆多的效果。
可以使用如下命令查看所有效果的幫助信息:
$ 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}
也可以直接查看具體某個音頻效果的使用方法:
$ sox --help-effect echo
sox: SoX v
Effect usage:
echo gain-in gain-out delay decay [ delay decay ... ]
以下是一些簡單的應用場景。
-
更改聲道數
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 -
改變音量
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 -vcat vc
foo.wav foo-maxed.wav
此外,還有一個選項 --norm 用來歸一化音頻響度。爲了最大化音頻的聲音強度,可以在處理輸入音頻時將該選項設置爲 -1:
sox --norm=-1 -
提取文件的某個部分
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 分鐘的音頻
- 拼接文件
與前面裁剪提取的操作相反,sox 命令還可以實現對兩個或多個音頻文件的拼接。
$ sox Half1.wav Half2.wav Full.wav
將 Half1.wav 和 Half2.wav 合併至 Full.wav 文件。注意合併前的音頻文件需保持一致的類型和採樣率等。 - 合成音頻
sox 命令可以通過 synth 效果合成許多標準波形和噪聲類型。
$ sox -n sine.wav synth 1.0 sine 1000.0
合成頻率爲 1000 Hz 長度爲 1 秒的正弦波,保存至 sine.wav 文件中。
synth 支持合成的聲音類型包括 sine、square、triangle、sawtooth、trapetz (trapezoidal)、exp (exponential)、whitenoise、pinknoise 和 brownnoise。 - 靜音效果
sox 命令可以創建靜音狀態的音頻片段,使用 -n 選項表示沒有輸入,通過 trim 效果指定需要靜音的片段。
$ sox -n -r 48000 silence.wav trim 0.0 0.250
在 slience.wav 文件中創建一段長度爲 250ms 採樣率爲 48000Hz 的靜音片段。 - 混合音頻
sox 命令的 -m 選項可以將兩個音頻文件混合以後生成輸出文件。
$ sox -m sine100.wav sine250.wav sine100-250.wav
將 sine100.wav 和 sine250.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 選項手動指定輸出文件的聲道數量。 - 改變播放速度
可以通過 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