Sox語音轉換的相關知識

SoX- linux 裏操做音頻的瑞士軍刀

Sox是最爲著名的Open Source聲音文件 格式轉換工具。已經被普遍移植到Dos、windows、OS二、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 603.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 -t3是延遲時間,它必須小於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 17801filter後面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
相關文章
相關標籤/搜索