數字音訊概念
以數字形式表示音訊涉及許多步驟和過程,原始音訊和網路上實際使用的編碼或壓縮音訊都有多種格式可用。本指南概述了數字音訊的表示方式,以及如何使用編解碼器對音訊進行編碼和解碼以供網路使用。
音訊取樣
音訊是自然界固有的模擬特徵。當一個物體振動時,它會引起周圍分子也振動。這些分子影響相鄰的分子,以此類推,以波的形式從聲源向外傳播振動,直到波的振幅(其音量)隨距離衰減。因此,真實世界中聲波的粒度是聲波傳播介質中單個分子的粒度。
在地球上,大多數音訊傳播的介質是空氣。有些音訊確實透過水傳播,甚至透過構成地球本身的岩石傳播(如果你曾聽到過地震的轟鳴聲或隆隆聲,你就經歷過這種現象),但你每天聽到的大部分聲音都是透過空氣傳播到你的耳朵的。
因此,一個人每天聽到的聲音實際上是空氣中的振動,這些振動引起耳朵內部的運作。空氣分子隨波的每個脈衝移動得越遠,波的振幅就越高,聲音就越大。分子振動得越快,波的頻率就越高。
波的振幅(高度)越高,該瞬間的聲音就越大。波長越短(波峰越接近),產生的聲音的頻率(或音高)就越高。
然而,計算機是數字的。為了以計算機能夠處理和操作(更不用說透過網路傳輸)的方式表示聲波,聲音必須轉換為數字形式。這個過程稱為模擬到數字轉換(簡稱A/D)。
影響捕獲音訊保真度的第一個因素是音訊頻寬;也就是說,A/D 轉換器能夠捕獲並轉換為數字形式的音訊頻率範圍。如果編解碼器在編碼聲音時選擇丟棄任何頻段,音訊頻寬也會受到影響。
聲音以電子流的形式透過麥克風或其他輸入裝置進入計算機,其電壓變化代表聲波的振幅。然後,這個模擬訊號透過一個電路轉換為數字形式,該電路以規律的間隔捕獲傳入波的振幅,並將這些資料轉換為音訊錄製系統能夠理解的數字形式。這些捕獲的時刻中的每一個都稱為取樣。透過將所有采樣串聯起來,可以近似表示原始波形,如下圖所示。
在此示例中,藍色線條代表從黑色音訊波形中獲取的取樣。A/D 轉換器電路以規律的間隔讀取訊號的電壓,其值介於(在此示例中)-1.0 和 +1.0 之間。由於振幅在該時間片的持續時間內發生變化,A/D 轉換器必須選擇一個值來表示該時間片,無論是透過在特定時刻取值(在上圖中,每個時間片的中間點用作值),還是透過對每個取樣的持續時間內的振幅進行平均。然後,這些取樣值被記錄為該時刻波形的振幅。
當稍後播放該聲音時,這些振幅用於生成原始波形的近似值;不是播放原始平滑波的精確副本,而是播放粗糙的藍色波。
你對原始音訊進行取樣的頻率越高,就能越接近原始音訊。每秒取樣的次數稱為取樣率。考慮上面的波形,如果你取樣頻率是現在的兩倍,或者十倍,那麼藍色數字波形會看起來有多麼不同。你取樣的次數越多,波形就越平滑。
音訊資料格式和結構
在最基本的層面上,音訊由一串取樣表示,每個取樣指定了針對音訊訊號的整體波形的給定切片測量的音訊波形的振幅。在音訊檔案中,單個取樣有多種格式。大多數音訊檔案為每個取樣使用 16 位有符號整數,但有些檔案使用 32 位浮點值或 24 位或 32 位整數。一些較舊的音訊檔案格式(在網路上不會找到)使用 8 位整數取樣。此外,取樣還可以使用有符號或無符號值。單個取樣的大小稱為取樣大小。
音訊訊號中每個音訊源的位置稱為通道。每個通道包含一個取樣,指示該源在給定時刻產生的音訊振幅。例如,在立體聲中,有兩個音訊源:一個左揚聲器和一個右揚聲器。每個都由一個通道表示,音訊訊號中包含的通道數量稱為通道數。
在錄製或生成多聲道音訊檔案時,這些通道被組裝成一系列音訊幀,每個音訊幀包含音訊每個通道的一個取樣。單個取樣是一個數值,表示單個時刻聲音波形的振幅,並且可以以各種格式表示。
立體聲可能是網路音訊中最常用的聲道排列方式,16 位取樣用於當今日常使用的大多數音訊。對於 16 位立體聲,從模擬訊號中採集的每個取樣都記錄為兩個 16 位整數,一個用於左聲道,一個用於右聲道。這意味著每個取樣需要 32 位記憶體。在常用的 48 kHz 取樣率(每秒 48,000 個取樣)下,這意味著每秒音訊佔用 192 KB 記憶體。因此,一首典型的三分鐘歌曲大約需要 34.5 MB 記憶體。這需要大量的儲存空間,更糟糕的是,對於相對較短的音訊片段來說,它會消耗大量的網路頻寬。這就是為什麼大多數數字音訊都要進行壓縮。
音訊的壓縮和解壓縮過程透過使用音訊編解碼器(COder/DEcoder)進行編碼和解碼來完成。多年來,已經開發了各種編解碼器,其中有幾種在網路上常用。有關網路開發者需要熟悉的最重要和最有用的編解碼器的詳細資訊,請參閱文章網路上使用的音訊編解碼器指南。
音訊通道和幀
有兩種型別的音訊通道。標準音頻通道用於呈現大部分可聽聲音。左右主通道以及所有環繞聲揚聲器(中置、左右後置、左右側、天花板通道等)的聲音都是標準音頻通道。特殊的低頻增強(LFE)通道為旨在產生低頻聲音和振動的特殊揚聲器提供訊號,以便在聆聽音訊時產生內臟感。LFE 通道通常驅動低音炮和類似裝置。
單聲道音訊有一個聲道,立體聲有兩個聲道,5.1 環繞聲有 6 個聲道(五個標準聲道和一個 LFE 聲道),以此類推。每個音訊幀是一個數據記錄,其中包含音訊訊號中所有可用聲道的取樣。音訊幀的大小透過將取樣大小(以位元組為單位)乘以聲道數來計算,因此單個立體聲 16 位音訊幀的長度為 4 位元組,單個 5.1 浮點音訊幀的長度為 24 位元組(每取樣 4 位元組乘以 6 個聲道)。
注意:有些編解碼器實際上會分離左右聲道,將它們儲存在資料結構內的獨立塊中。但是,一個音訊幀始終包含所有可用通道的所有資料。
組成一秒音訊的幀數取決於錄製聲音時使用的取樣率。由於取樣率對應於每秒聲波被分成“切片”的數量,因此有時被認為是頻率(從它描述週期性重複的事物的意義上說,而不是實際音訊頻率的意義上說),因此每秒取樣量度使用赫茲作為其單位。
最常見的取樣率是
- 8000 赫茲
-
用於電話的國際 G.711 音訊標準使用 8000 Hz (8 kHz) 的取樣率。這足以使人類語音可以理解。
- 44100 赫茲
-
44.1 kHz 取樣率用於光碟 (CD) 音訊。CD 提供 44.1 kHz 的未壓縮 16 位立體聲。計算機音訊也經常預設使用此頻率。
- 48000 赫茲
-
DVD 上的音訊以 48 kHz 錄製。這也常用於計算機音訊。
- 96000 赫茲
-
高解析度音訊。
- 192000 赫茲
-
超高解析度音訊。目前尚未普遍使用,但這種情況會隨著時間而改變。
44.1 kHz 被認為是最低的“高保真”取樣率是有原因的。奈奎斯特-夏農取樣定理規定,為了準確再現聲音,必須以聲音訊率的兩倍速率進行取樣。由於人耳的聽力範圍約為 20 Hz 到 20,000 Hz,因此再現人類通常能聽到的最高音調聲音需要超過 40,000 Hz 的取樣率。
為了給低通濾波器提供額外的空間,以避免混疊引起的失真,在預取樣頻率上增加了一個額外的 2.05 kHz 的過渡帶(導致 22,050 Hz)。根據奈奎斯特定理將其加倍,最終最小頻率為(你猜對了)44.1 kHz。
高解析度(96 kHz)音訊用於一些高階音訊系統,它和超高解析度(192 kHz)音訊對於音訊母帶處理很有用,在母帶處理中,你需要儘可能高的質量來操作和編輯聲音,然後再下采樣到你將用於最終產品的取樣率。這類似於攝影師如何使用高解析度影像進行編輯和合成,然後向客戶展示適合在網站上使用的 JPEG。
音訊檔案大小和網路頻寬
一旦你知道單個音訊幀的大小以及每秒音訊資料包含多少幀,你就可以輕鬆計算原始聲音資料本身將佔用多少空間(因此它會在網路上消耗多少頻寬)。
例如,考慮一個立體聲音訊片段(即兩個音訊通道),取樣大小為 16 位(2 位元組),以 48 kHz 錄製
在 192 kBps 的速度下,低端網路僅播放單個音訊流就會受到影響。如果網路還在做其他事情,即使在更高頻寬的網路上也會出現問題。由於網路容量競爭激烈,尤其是在較慢的網路上,如此大的資料量可能難以在任何即時應用程式中進行有效傳輸。
為了解決這個問題,音訊必須透過壓縮變小。
注意:網路頻寬顯然與上述音訊取樣中討論的音訊頻寬不同。
音訊壓縮基礎
與文字和許多其他型別的資料不同,音訊資料往往是嘈雜的,這意味著資料很少由一系列精確重複的位元組或位元組序列組成。因此,音訊資料很難使用傳統演算法進行壓縮,例如通用工具(如zip)使用的演算法,這些演算法通常透過用速記表示替換重複資料序列來工作。
在壓縮音訊時可以應用多種技術。大多數編解碼器結合使用這些技術,也可能使用其他技術。
最簡單的方法是應用一個過濾器,去除嘶嘶聲和微弱的聲音,將任何微弱的部分轉換為靜音並平滑訊號。這可以產生靜音片段以及其他可以縮短的重複或近乎重複的訊號。
你可以應用一個過濾器來縮小音訊頻寬,去除任何你不在意的音訊頻率。這對於僅包含語音的音訊訊號特別有用。這樣做可以去除資料,使生成的訊號更容易壓縮。
心理聲學
如果你知道你最可能處理的音訊型別,你可能會找到專門適用於那種聲音的特殊濾波技術,從而最佳化編碼。
最常用的音訊壓縮方法是應用心理聲學科學。這門科學研究人類如何感知聲音,以及在給定聲音的上下文和內容的情況下,我們聽到的音訊頻率的哪些部分對我們對這些聲音的反應最重要。諸如感知聲音訊率變化的能力、人耳聽覺的整體範圍與音訊訊號的頻率、聲音定位等因素都可以被編解碼器考慮。
透過對心理聲學有深入的瞭解(並非雙關語),可以設計一種壓縮方法,在最大程度地降低音訊壓縮大小的同時,最大限度地提高聲音的感知保真度。採用心理聲學演算法可能會使用此處提到的任何技術,並且幾乎肯定會應用其他技術。
所有這些都意味著在選擇編解碼器之前必須提出並回答一個基本問題:給定聲音的內容、使用上下文和目標受眾,是否可以接受在一定程度上損失音訊保真度,如果可以,損失多少;或者是否有必要在解碼資料後,結果與源音訊完全相同?
有損與無失真壓縮
如果細節和潛在保真度的損失是不可接受或不希望的,則首選無損編解碼器。另一方面,如果一定程度的音訊保真度降低是可以接受的,則可以使用有損編解碼器。通常,有失真壓縮比無失真壓縮方法產生顯著更小的輸出;此外,許多有損編解碼器非常優秀,對於普通聽眾來說,質量和細節的損失很難甚至不可能辨別。
注意:雖然高質量有失真壓縮演算法對音質的影響可能很難被普通人察覺,但某些人聽力異常好,或者特別擅長注意到有失真壓縮技術對音樂引入的變化。
大多數音訊編解碼器採用某種形式的有失真壓縮,因為這些演算法提供了更好的壓縮比。無失真壓縮演算法通常無法將原始未壓縮聲音資料的大小壓縮到 40-50% 以下,而現代有失真壓縮演算法可以將音訊大小減小到原始大小的 5-20%,具體取決於音訊的複雜性。有失真壓縮可能實現的巨大優越的壓縮比通常使其成為一個引人注目的選擇,並且透過精心選擇的編解碼器配置可以實現足夠或出色的音訊質量。
研究人員正在不斷設計更好的音訊分析和壓縮方法,因此新格式會定期釋出,在壓縮比或音訊保真度(或兩者)方面提供各種改進。
無損音訊的用例包括以下場景:
- 聽眾期望精確的音訊再現,並且聽力足夠好,能夠分辨未經處理的音訊的複雜細節的任何情況
- 音樂和音效製作中使用的音訊迴圈和取樣
- 音訊剪輯或採樣可能被重新混合然後壓縮的情況;在母帶處理過程中使用無損音訊可以避免壓縮先前壓縮的資料,從而導致額外的質量損失
可能推薦使用有失真壓縮的因素包括
- 非常大的源音訊
- 受限儲存(要麼因為儲存空間小,要麼因為有大量聲音需要儲存)
- 需要限制廣播音訊所需的網路頻寬;這對於直播流和電話會議尤為重要
心理聲學入門
深入研究心理聲學和音訊壓縮的工作原理超出了本文的範圍,但對常見演算法如何壓縮音訊有一個大致的瞭解有助於理解和做出更好的音訊編解碼器選擇。
有失真壓縮演算法通常利用心理聲學來確定音訊波形的哪些元件可以丟失或以某種方式減弱,以提高壓縮比,同時最大限度地減少對目標聽眾的可聽影響。透過操縱波形使其更容易壓縮,或透過去除那些實際上聽不到的聲音元件,波形變得更簡單,從而產生具有更高一致性且因此更容易壓縮的資料。將音訊頻寬限制為僅包含對人耳解釋解碼聲音最重要的頻率,也可以改善壓縮因子。
編碼內容的型別會影響編解碼器的選擇。特別是,音樂的波形幾乎總是比僅包含人聲的音訊取樣的波形更復雜。此外,人聲只使用了人耳可以檢測到的音訊頻率範圍的一小部分。
注意:電話網路最初是專門為傳輸人聲而設計的,只能在 300 Hz 到 3,000 Hz 的頻段內傳輸音訊(或任何其他型別的訊號)。這並沒有完全覆蓋人聲低端的整個範圍,但波形足夠,人耳和大腦很容易補償。這也意味著人類通常習慣於聽到受限於如此窄音訊頻寬的語音。
人聲使用相對較窄的頻帶(大約 300 赫茲到 18,000 赫茲,儘管確切範圍因人而異,受性別等因素影響)。此外,絕大多數人聲傾向於介於 500 赫茲和 3,000 赫茲左右,因此可以丟棄大部分整體波形,而不會影響聽者理解所說單詞的能力。你甚至可以調整音訊頻寬以考慮單個說話者聲音的音高。
由於所有這些因素,以及語音波形通常比音樂複雜程度低,因此可以在相對較低的位元率下實現高保真度(更具體地說,“足夠高”)的語音再現。
當為壓縮通用音訊而設計的壓縮演算法分析音訊波形時,它可以丟棄人耳聽力範圍之外的任何聲音(或者甚至更多,這取決於演算法願意冒多大風險丟失頻段高頻和/或低頻端的細節)。這意味著編解碼器可以丟棄頻率低於約 20 Hz 或高於約 20,000 Hz(20 kHz)的音訊。這會縮小聲音的音訊頻寬,從而減少以壓縮形式表示訊號所需的資料量。音訊頻寬不能像僅用於語音的編解碼器那樣大幅減小,但它仍然是一個有用的開始。
有些人可以在一定程度上聽到這個範圍之外的聲音。更常見的是,人們聽到高頻的能力要低於這個範圍;特別是,值得注意的是,到中年時,該頻率範圍的高階通常從 20 kHz 下降到大約 12 kHz 到 14 kHz。這表明高頻通常可以在不過度影響聲音可理解性的情況下被丟棄,因此你可以大幅減少需要保留的音訊空間,從而使你的聲音更簡單,更容易壓縮。
如下圖所示。該圖比較了人耳聽覺的頻率範圍(綠色)與人聲的頻率範圍(紅色)以及絕大多數人類發聲所在的頻率範圍(黃色)。
這些範圍之間的巨大差異為我們在不顯著影響人耳感知音訊質量任何實際變化的情況下丟失音訊資料細節提供了空間。這些事實可以在壓縮音訊時加以利用。
除了透過心理聲學分析簡化聲音之外,編解碼器還使用其他演算法和變換來進一步簡化和減小音訊大小。如果你想了解更多關於音訊壓縮工作原理的資訊,請參閱維基百科上的音訊資料壓縮。
重要的是,編解碼器為你完成了所有繁重的工作。這就是為什麼大量工程和科學研究都投入到新演算法和編解碼器的建立中。你所需要做的就是考慮選項和你的用例,然後選擇適合你需求的編解碼器。
注意:有關選擇音訊編解碼器的更詳細指南,請參閱選擇音訊編解碼器。
無損編碼器引數
考慮到需要能夠重現原始音訊,無損編碼器在操縱音訊以提高壓縮率方面的空間要小得多,這限制了可配置這些編碼器的選項數量。這些選項往往圍繞著選擇編碼器執行編碼的方法以及它被允許消耗多少時間和處理器能力來完成此操作。
這些引數因編解碼器而異,但可以包括
- 在編碼過程的特定階段指定要使用的特定演算法
- 用於這些演算法的引數,例如在嘗試建模音訊時使用的預測深度
- 分析音訊時進行的遍數,或給定演算法應執行的次數
有損編碼器引數
大多數編解碼器都有你可以調整的輸入值,以各種方式最佳化壓縮,無論是為了大小還是為了質量。使用有損編碼器時,質量越高,編碼後的音訊就越大。因此,大多數選項都會以某種方式影響質量和大小。
你需要參考你使用的編碼軟體的文件來確定哪些選項可用,這取決於編解碼器和編碼軟體本身。有些編解碼器有許多你可以調整的值(其中一些可能需要對心理聲學和編解碼器演算法有深入的瞭解),還有一些編解碼器提供一個你可以設定的“質量”引數,該引數會自動調整演算法的各種屬性。
位元率
有兩種互斥的方式可以透過位元率控制壓縮音訊的質量。第一種是針對編碼資料的平均位元率,而第二種是指定一個恆定質量值,同時允許位元率變化。
平均位元率
控制輸出檔案質量的第一種方法是指定在編碼音訊時要達到的平均位元率(ABR)。編碼器將嘗試生成一個編碼後的聲音檔案,在播放時,該檔案平均每秒音訊使用指定數量的位元。這從編碼音訊大小的角度控制質量;位元率越高,生成的音訊質量就越高。音訊的質量會隨著時間波動,以滿足目標位元率。
與 ABR 有些類似的是 CBR(恆定位元率)。ABR 嘗試平均保持位元率在給定水平,同時允許一些波動,而 CBR 在音訊持續時間內使用實際固定的位元率。CBR 主要用於僅限語音用途的編解碼器,其中頻率範圍和變化往往最小,從而允許 CBR 編碼在音訊質量沒有不可行的波動的情況下工作。
可變位元率
可變位元率(VBR)編碼的工作原理是接受一個恆定質量設定作為編碼器的輸入。這表示在音訊持續時間內保持的質量級別,允許位元率根據需要波動以達到該質量級別。在聲音中容易以最小質量影響實現壓縮的部分,位元率可能非常低,而在壓縮更復雜的區域,位元率會更高。
音訊頻率頻寬
有些編解碼器允許你直接配置音訊頻率頻寬,方法是指定允許的頻率範圍、設定上限和/或下限頻率,或者指定音訊源型別,該型別根據傳入訊號的預期頻率使用情況確定如何配置演算法。
此外,一些編解碼器支援特殊的有限頻率頻寬通道,例如 LFE 通道,其固有地限制了可用頻率範圍。在 LFE 的情況下,音訊頻率頻寬被限制在適合低音炮或類似音訊體驗增強裝置使用的頻率範圍內。
有些編解碼器提供專門用於特定使用場景(例如 VoIP)的特殊配置檔案;這些配置檔案預設情況下也可能包含對音訊頻率頻寬的限制。
聯合立體聲
立體聲通常由包含每個聲道一個取樣的音訊幀表示。這導致音訊幀需要 2 倍*取樣大小*位,其中*取樣大小*是每個音訊取樣所佔用的位數。因此,對於 16 位立體聲錄音,每個取樣使用 2 乘以 16,即 32 位空間。這是標準的左/右 (L/R) 立體聲或簡單立體聲。
聯合立體聲是一種以更節省空間的方式儲存立體聲音訊取樣的方法,它考慮到通常進入每隻耳朵的聲音是相似的。因此,不是儲存每個聲道取樣的每個位,而是儲存一個基本振幅值和每個聲道的振幅偏差值,其中偏差值可能使用比完整取樣更少的位。
聯合立體聲有兩種型別:中-側和強度。在音訊檔案持續期間,編碼器可能會改變用於表示音訊檔案立體聲訊號的格式。
中-側立體聲編碼
中-側立體聲編碼(MS)的工作原理是記錄包含基本中置聲道的幀,該聲道是原始左右音訊聲道的平均振幅。這基本上就是將立體聲訊號轉換為單聲道時計算出的振幅。然後你儲存側聲道值;這個值是一個數字,可以加到中置聲道值中以確定左聲道的原始振幅,並從中置聲道值中減去以計算右聲道的原始值。
換句話說,給定左聲道 L 和右聲道 R,在編碼取樣時執行以下計算
然後你儲存 mid 和 side 的值。雖然 mid 的大小仍然與你的取樣大小相同(例如 16 位),但 side 的值可能可以儲存在更少的位中,因為兩個聲道的振幅可能相對相似。然後編碼器可以獲取每幀更小的總位數,並執行額外的計算以進一步減小大小。
解碼音訊時,左右聲道絕對值計算如下:
中-側立體聲編碼本身是無損的,通常被無損和有損音訊編解碼器使用。任何細節損失都來自編碼過程的其他步驟。
強度立體聲編碼
強度立體聲編碼透過利用人類確定聲音空間位置的方式來降低編碼音訊位元率;這稱為聲音定位。我們聽到立體聲是因為我們的耳朵根據聲音來源的不同時間檢測到聲音。
這是因為我們的耳朵由於位於頭部的兩邊而相隔數英寸。來自我們右側的聲音會比到達我們左耳更早到達我們右耳。我們的大腦透過使用這個時間差來計算聲音的來源角度,從而確定聲音在我們周圍空間中的位置。然而,隨著音訊訊號頻率的下降,波長會增加。最終,波長接近然後超過耳朵之間的距離,並且變得難以或不可能明確地定位聲音。
有了這些資訊,我們可以透過將那些不用於確定方向性的頻率合併到一個通道中,然後包含指示聲音方向性的資訊,來近似表示立體聲音訊訊號。這需要更少的位元來表示,但本質上是有點有損的。