https://magiclen.org/acoustics/
由於儲存空間和資料傳輸速度的限制,我們可能沒辦法將很多聲音完好無損的保存或是傳送。聲音是給人聽的,但是人類的耳朵的聽力有限,非常細微的訊號差異其實感受不太出來,因此可以使用一些會改變原本聲音訊號的方式來將其重新編碼(Encode)成和原始聲音訊號聽起來差異不大的格式,減少儲存聲音訊號所佔用空間和加快傳送聲音訊號時的速度,而這種壓縮聲音訊號的方式就稱為有損壓縮(Lossy Compression)。有損壓縮聲音訊號的方式有很多種,常見的格式為MP3、Ogg、AAC,另外還有比較後來纔出現的HE-AAC、HE-AACv2、Opus格式。究竟這些格式哪些音質比較好,在不同條件下又應該要選擇使用什麼樣的格式才適合,在本篇文章中將會實地進行轉檔測試,並將結果轉成頻譜來分類討論。
有損(Lossy)音訊壓縮,顧名思義就是將聲音訊號使用破壞性壓縮,使用較少、有限的資料量來還原出接近原始的聲音訊號,以縮小儲存聲音訊號所需的空間。
由於聲音是給人聽的,因此理論上只需要完美保留人類可以聽得到、分辯得出來的訊號,即便聲音訊號會改變,但實際聽起來聲音也還可以和原始的聲音訊號沒有差別。聲音是一種震動介質而產生出來的縱波,振幅愈大,音量愈大;頻率愈高,音調愈高。人類的耳朵可捕捉到20~20,000赫茲(Hz)的聲波。以人耳為基準,大於20,000Hz的波稱為超聲波(超音波);小於20Hz的波稱為次聲波。
雖然每個有損音訊壓縮的格式壓縮聲音訊號的方式都不太一樣,但大致上都會優先保留20~20,000Hz頻率範圍內的聲音訊號,再根據心理聲學來調整聲音訊號,儘量減少壓縮過的聲音訊號和原本訊號聽起來的差異。
相同的壓縮格式在固定的取樣頻率(Sampling Rate)下,所使用的位元率(Bitrate)是影響聲音訊號音質的主要因素。位元率的單位常使用「每秒多少位元(bps, bits per seconds)」來表示,也就是每一秒的聲音訊號使用了多少個位元來儲存。位元率愈高表示每秒可以儲存的聲音訊號愈多,儲存的聲音訊號愈多也就愈接近原始的聲音訊號,音質聽起來自然會愈好。相反地,位元率愈少,表示每秒可以儲存的聲音訊號愈少,必須要丟掉更多的原始聲音訊號纔有辦法儲存,儲存的聲音訊號就會和原始的聲音訊號愈差愈多,音質聽起來自然會愈差。
雖然位元率愈高,可以使得壓縮後的聲音訊號愈接近原始的聲音訊號,但位元率並不完全是愈高就愈好。使用高位元率來儲存聲音訊號,相對地需要更多的儲存空間。當位元率高到一個程度之後,實際聽起來就已幾乎和原始的聲音訊號沒有差異了,此時再增加位元率,只是多浪費儲存空間而已。
壓縮聲音訊號時所使用的位元率,大致上可分為「固定位元率(CBR, Constant Bitrate)」和「變動位元率(VBR, Variable Bitrate)」兩種。
「固定位元率」顧名思義就是從頭到尾都使用固定的位元率來儲存聲音訊號,用這種方式所壓縮出來的聲音訊號,雖然可以很容易控制其所佔用的儲存空間大小,但它的位元使用率將會是最差的。譬如很簡單的聲音,像是「嗶──」,和複雜的聲音,像是「哺吱喀─吱吱吱哺─喀吱」,都會使用固定的位元率來儲存,有可能會造成簡單的聲音使用的位元率過高,或是複雜的聲音使用的位元率過低,導致音質和佔用的儲存空間無法平衡。
而「變動位元率」基本上就沒有這個問題存在,它可以根據聲音訊號的複雜度來自行決定該段聲音所使用的位元率。這樣的編碼方式是比較有效率的,只是在編碼的過程中會需要比較多的時間來計算。不同編碼器(Encoder)計算變動位元率的方式皆有所不同,即使是在相同的變動位元率下,音質也可能會有很大的差異。因此建議使用公認較優良的編碼器來進行編碼,纔可以達到較佳的成果。
聲音訊號壓縮後所需佔用的儲存空間,可以使用以下公式計算:
儲存空間 = 平均位元率 * 聲音長度
舉個例子,長度為4分鐘,位元率為128kbps的MP3檔案,其所佔用的儲存空間計算方法如下:
儲存空間 = 128kbps * 4 minutes = (128k bits / 1 second) * (4 minutes * (60 seconds / 1 minutes)) = (128k bits / 1 second) * 240 seconds = 30720k bits = 30720k bits / (8 bits / 1 byte) = 3840k bytes = 3840k / (1024k / 1M) bytes = 3.75M bytes = 3.75MB
經由以上算式得知,長度為4分鐘,位元率為128kbps的MP3檔案,其所佔用的儲存空間為3.75MB。
看到這裡您可能會很好奇聲音壓縮前所佔用的儲存空間要如何計算,在此就順便說明一下。
未壓縮的聲音訊號,會有很明確的取樣頻率(Sampling Rate)與取樣深度(Sampling Depth)的數值。在文章前面有提到過,聲音是一種震動介質而產生出來的縱波,它會在連續時間內讓介質不間斷地改變狀態,因此在任意的瞬間點,介質都可以對應到某種狀態,可將介質狀態的變化以波形來表示。為了要使用有限的數位空間來記錄不同時間點下的波形對應的數值,只好對聲音進行「取樣(Sampling)」,每隔一段時間才將該時間點下的波形數值(聲音強度)記錄下來。這個間隔的時間倒數,即為取樣頻率;而記錄每個數值所使用的空間,即為取樣深度。
取樣頻率常用的單位為「赫茲(Hz)」,表示每秒記錄幾次狀態。如44100Hz,即表示每秒記錄44100個時間點的狀態。愈大的取樣頻率,愈可以還原出愈原始的聲音波形。但是由於過高的頻率對人類來說只是聽不到的超音波,因此取樣頻率通常會接近兩倍於人耳所能感受的最大聲音頻率,如44.1kHz或是48kHz。至於為什麼取樣頻率要兩倍於真實的最大聲音頻率,又為什麼不直接使用40kHz作為取樣頻率呢?
根據奈奎斯特定理(Nyquist Theorem),取樣頻率兩倍大於被取樣訊號的最大頻率,即可重構出原始的被取樣訊號。但實際上,重構出原始訊號所用來抗混疊(Anti-Aliasing)、消除某頻率以上訊號的低通濾波器(Low Pass Filter)並非是理想的,它有個過渡頻寬(Transition Band)會導致在這個頻寬內的訊號仍被衰減通過。因此,如果取樣頻率不足於被取樣訊號的最大頻率加上其低通濾波器的過渡頻寬的兩倍,最大頻率附近的聲音訊號依然會有混疊現象,將會導致訊號失真(Distortion)。為了完整保留最大聲音頻率,必須預留過度頻寬,典型的過度頻寬大小為2050Hz,這也是為何CD是使用44100Hz作為取樣頻率的原因,算法如下:
(20000Hz + 2050Hz) * 2 = 44100Hz
CD的44100Hz只是聲音取樣頻率的「最低需求」,有些人可以稍微聽到比20kHz還要高一點的頻率,甚至還可以用耳朵之外的器官來感受超過20Khz的高頻聲音,因此也有在使用比44100Hz更高的取樣頻率,像是48000Hz或是96000Hz。當然,愈高的聲音頻率人類愈感受不到就是了。
取樣深度常用的單位是「位元(bit)」,如16位元可以表示出216種不同的數值,也就是65536種不同的聲音強度。雖然還有24bit甚至是32bit的取樣深度,但一般人的耳朵連16位元的65536種不同的聲音強度都不能完全分辨出來,基本上不太需要用到那麼高的取樣深度。
瞭解取樣頻率和取樣深度之後,就可以算得出聲音壓縮前所佔用的儲存空間了,公式如下:
舉個例子,長度為4分鐘,取樣頻率為44100Hz,取樣深度為16位元,雙聲道的WAV(PCM)檔案,其所佔用的儲存空間計算方法如下:
儲存空間 = 44100Hz * 16 bits * 4 minutes * 2 = (44100 / 1 second) * 16 bits * (4 minutes * (60 seconds / 1 minutes) * 2 = 705600 bits / second * 240 seconds = 169344000 bits = 169344000 / (8 bits / 1 byte) * 2 = 42336000 bytes = 42336000 / (1048576 / 1M) bytes ≒ 40.37MB
經由以上算式得知,長度為4分鐘,取樣頻率為44100Hz,取樣深度為16位元,雙聲道的WAV(PCM)檔案,其所佔用的儲存空間約為40.37MB。
有損音訊壓縮的格式有許多種,不同的有損音訊壓縮格式會使用不同的演算法來對聲音訊號進行破壞壓縮,因此各有不同的音質表現。
網路上最常流傳的音樂格式為MP3(MPEG-1 Audio Layer 3),它可以大幅降低音訊資料量,減少檔案大小,方便傳輸。對於大多數的使用者來說,經由MP3壓縮後的音質和原本的音質差異並不大,但MP3檔案大小卻比原始檔少佔用了約4~10倍的空間,故能受到許多使用者的青睞。
有關MP3格式的編碼方式,可以參考以下文章:
Ogg是開源、自由、免費的音訊編碼格式,沒有麻煩的專利授權問題,也因此應用程式和遊戲的音效很多都是使用Ogg格式來編碼。
有關Ogg格式的編碼方式,可以參考以下文章:
AAC(進階音訊編碼, Advanced Audio Coding)是基於MPEG-2的音訊編碼技術,用來取代MP3格式。相較於MP3格式,AAC支援更多的聲道,更高的採樣率和位元率,以及更精確的聲音訊號。
有關AAC格式的編碼方式,可以參考以下文章:
HE-AAC(High-Efficiency AAC)是AAC加上SBR(Spectral Band Replication),用於低位元率的編碼格式,HE-AACv2是AAC加上SBR和PS(Parametric Stereo),用於更低位元率的編碼格式,兩者都屬於MPEG4的技術。
有關HE-AAC與HE-AACv2的編碼方式,可以參考以下文章:
Opus是比MP3、OGG、AAC、HE-AAC(AAC+)還要新的音訊編碼格式,它整合了Skype開發的語音編碼格式─SILK,與超低延遲的CELT(Constrained Energy Lapped Transform)編碼格式,因此Opus非常適合用於即時地(Real-Time)的網路語音傳輸。
有關Opus的編碼方式,可以參考以下文章:
有的。FLAC(Free Lossless Audio Codec)、ALAC(Apple Lossless)、APE(Monkey's Audio)和WMA Lossless(Windows Media Audio 9 Lossless)是近年非常受歡迎的格式,因為它們不會以破壞性資料壓縮的方式來儲存聲音訊號,而導致訊號無法完整還原成原始的樣子,使得播放出來的音樂會失真。而FLAC、ALAC、APE和WMA Lossless就不同了,它們採用無失真壓縮法(Lossless Compression),常稱其為「無損壓縮」,不會破壞原有的聲音訊號,能將聲音訊號壓縮為原本的一半,但經過解碼(Decode)也依然可以百分之百還原出原始的聲音訊號。
有關FLAC的編碼方式,可以參考以下文章:
一個規律、有週期性的聲音稱為樂音,反之則稱為噪音。如果想知道音樂是如何產生,以及如何有音調、音量、音色上的變化,可以參考這裡的文章:
https://magiclen.org/tag/%E9%9F%B3%E6%A8%82%E5%90%88%E6%88%90/
接下來纔是本篇文章的重頭戲,筆者將會使用一個取樣深度24位元,取樣頻率96kHz,長度為3分36秒,檔案大小為124.9MB的WAV音樂檔來實際對MP3、Ogg、AAC、HE-AAC、HE-AACv2和Opus格式進行轉檔測試。
這個測試用的WAV音樂檔案來自於這個網站,可以透過以下連結下載:
https://file.magiclen.org/index.php?file=32346269742d39366b2d73616d706c652d726172352e726172
為了編碼出不同格式的檔案,筆者使用了多種不同的編碼器。列表如下:
為了比較音樂檔案的音質之間的差異,筆者使用了一些軟體來描繪出它們的頻譜圖,使我們可以直接從頻譜圖來比較音質差異。以下列出筆者所使用的工具:
原始取樣深度24位元,取樣頻率96kHz的WAV檔案頻譜如下:
ImageDifferencer 1.0.1:ImageDifferencer可以比較Adobe Audition所擷取的頻譜圖之間的差異。可以參考這篇文章來使用。
原始取樣深度24位元,取樣頻率96kHz的WAV檔案頻譜如下:
在開始進行 在開始進行有損壓縮之前,我們先使用FFmpeg轉出不同取樣深度和取樣頻率的WAV檔案來比較看看。
將原始的聲音訊號保留原先的取樣頻率,但是將其取樣深度從24位元降到16位元。轉換後得到83.2MB的WAV檔案,其頻譜如下:
使用ImageDifferencer,比較16bit, 96kHz的頻譜圖跟原始聲音訊號頻譜圖的差異,得到以下的結果:
WAV檔案,其頻譜如下: