音訊課程文件

音訊資料介紹

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

音訊資料介紹

從本質上講,聲波是一種連續訊號,這意味著它在給定時間內包含無限數量的訊號值。這給期望有限陣列的數字裝置帶來了問題。為了透過數字裝置進行處理、儲存和傳輸,連續聲波需要轉換為一系列離散值,即數字表示。

如果你檢視任何音訊資料集,你會發現包含聲音片段的數字檔案,例如文字旁白或音樂。你可能會遇到不同的檔案格式,例如.wav(波形音訊檔案)、.flac(自由無損音訊編解碼器)和.mp3(MPEG-1 音訊層 3)。這些格式主要在於它們如何壓縮音訊訊號的數字表示。

讓我們來看看我們如何從連續訊號到達這種表示。模擬訊號首先由麥克風捕獲,麥克風將聲波轉換為電訊號。然後,電訊號透過模數轉換器進行數字化,透過取樣獲得數字表示。

取樣和取樣率

取樣是在固定時間步長測量連續訊號值的過程。取樣波形是離散的,因為它在均勻間隔處包含有限數量的訊號值。

Signal sampling illustration

來自維基百科文章的插圖:取樣(訊號處理)

取樣率(也稱為取樣頻率)是一秒鐘內取樣的數量,以赫茲(Hz)為單位測量。作為參考,CD 質量音訊的取樣率為 44,100 Hz,這意味著每秒取樣 44,100 次。相比之下,高解析度音訊的取樣率為 192,000 Hz 或 192 kHz。訓練語音模型常用的取樣率為 16,000 Hz 或 16 kHz。

取樣率的選擇主要決定了可以從訊號中捕獲的最高頻率。這也被稱為奈奎斯特極限,正好是取樣率的一半。人耳可聽的語音訊率低於 8 kHz,因此以 16 kHz 取樣語音就足夠了。使用更高的取樣率不會捕獲更多資訊,只會導致處理此類檔案的計算成本增加。另一方面,以過低的取樣率取樣音訊會導致資訊丟失。以 8 kHz 取樣的語音會聽起來沉悶,因為無法以這種速率捕獲更高頻率。

在處理任何音訊任務時,確保資料集中所有音訊示例都具有相同的取樣率非常重要。如果你打算使用自定義音訊資料對預訓練模型進行微調,則你的資料的取樣率應與模型預訓練資料匹配。取樣率決定了連續音訊樣本之間的時間間隔,這會影響音訊資料的時間解析度。考慮一個示例:5 秒的 16,000 Hz 取樣率的聲音將表示為 80,000 個值序列,而相同的 5 秒的 8,000 Hz 取樣率的聲音將表示為 40,000 個值序列。解決音訊任務的 Transformer 模型將示例視為序列,並依賴注意力機制來學習音訊或多模態表示。由於不同取樣率的音訊示例的序列不同,模型將難以在取樣率之間進行泛化。重取樣是使取樣率匹配的過程,是音訊資料預處理的一部分。

振幅和位深

取樣率告訴你樣本多久取一次,那麼每個樣本中的值到底是什麼?

聲音是由氣壓變化產生的,其頻率在人類可聽範圍內。聲音的振幅描述了在任何給定時刻的聲壓級,以分貝(dB)為單位測量。我們將振幅感知為響度。舉例來說,正常的說話聲音低於 60 dB,而搖滾音樂會可能達到 125 dB 左右,這已接近人類聽力的極限。

在數字音訊中,每個音訊樣本記錄了音訊波在某個時間點的振幅。樣本的位深決定了描述此振幅值的精確度。位深越高,數字表示就越能忠實地近似原始連續聲波。

最常見的音訊位深是 16 位和 24 位。每個都是二進位制術語,表示將振幅值從連續值轉換為離散值時可以量化的可能步數:16 位音訊為 65,536 步,24 位音訊為驚人的 16,777,216 步。由於量化涉及將連續值四捨五入為離散值,因此取樣過程會引入噪聲。位深越高,這種量化噪聲越小。實際上,16 位音訊的量化噪聲已經足夠小,聽不見了,通常不需要使用更高的位深。

您可能還會遇到 32 位音訊。它將樣本儲存為浮點值,而 16 位和 24 位音訊使用整數樣本。32 位浮點值的精度為 24 位,使其與 24 位音訊具有相同的位深。浮點音訊樣本預期位於 [-1.0, 1.0] 範圍內。由於機器學習模型天生就處理浮點資料,因此音訊必須首先轉換為浮點格式才能用於訓練模型。我們將在下一節預處理中看到如何實現這一點。

與連續音訊訊號一樣,數字音訊的振幅通常以分貝 (dB) 表示。由於人類聽覺本質上是呈對數性質的——我們的耳朵對安靜聲音中的微小波動比對響亮聲音中的波動更敏感——如果振幅以分貝表示,聲音的響度更容易解釋,分貝也是對數單位。真實世界音訊的分貝刻度從 0 dB 開始,代表人類能聽到的最安靜的聲音,而更響亮的聲音具有更大的值。然而,對於數字音訊訊號,0 dB 是最大可能振幅,而所有其他振幅都是負數。一個快速的經驗法則:每減少 6 dB,振幅就減半,而低於 -60 dB 的任何聲音通常都是聽不見的,除非你把音量調得非常大。

音訊作為波形

您可能見過聲音以波形的形式視覺化,它繪製了樣本值隨時間的變化,並說明了聲音振幅的變化。這也被稱為聲音的時域表示。

這種視覺化型別對於識別音訊訊號的特定特徵非常有用,例如單個聲音事件的時序、訊號的整體響度以及音訊中存在的任何不規則或噪聲。

要繪製音訊訊號的波形,我們可以使用一個名為 `librosa` 的 Python 庫。

pip install librosa

我們以庫中自帶的“trumpet”(小號)聲音為例。

import librosa

array, sampling_rate = librosa.load(librosa.ex("trumpet"))

該示例以音訊時間序列(這裡我們稱之為 `array`)和取樣率(`sampling_rate`)的元組形式載入。讓我們使用 librosa 的 `waveshow()` 函式來檢視此聲音的波形。

import matplotlib.pyplot as plt
import librosa.display

plt.figure().set_figwidth(12)
librosa.display.waveshow(array, sr=sampling_rate)
Waveform plot

這會繪製訊號的振幅(y 軸)和時間(x 軸)。換句話說,每個點對應於此聲音取樣時獲取的單個取樣值。另請注意,librosa 返回的音訊已經是浮點值,並且振幅值確實在 [-1.0, 1.0] 範圍內。

將音訊視覺化並同時聆聽是理解您正在處理的資料的有用工具。您可以檢視訊號的形狀、觀察模式、學習發現噪聲或失真。如果您以某種方式預處理資料,例如歸一化、重取樣或濾波,您可以直觀地確認預處理步驟已按預期應用。訓練模型後,您還可以視覺化發生錯誤的樣本(例如在音訊分類任務中)以除錯問題。

頻譜

另一種視覺化音訊資料的方法是繪製音訊訊號的頻譜,也稱為頻域表示。頻譜是使用離散傅立葉變換(DFT)計算的。它描述了構成訊號的各個頻率及其強度。

讓我們使用 numpy 的 `rfft()` 函式,透過對相同的小號聲音進行 DFT,來繪製其頻譜。雖然可以繪製整個聲音的頻譜,但檢視一個小區域會更有用。這裡我們將在前 4096 個樣本上進行 DFT,這大致是第一個音符的長度。

import numpy as np

dft_input = array[:4096]

# calculate the DFT
window = np.hanning(len(dft_input))
windowed_input = dft_input * window
dft = np.fft.rfft(windowed_input)

# get the amplitude spectrum in decibels
amplitude = np.abs(dft)
amplitude_db = librosa.amplitude_to_db(amplitude, ref=np.max)

# get the frequency bins
frequency = librosa.fft_frequencies(sr=sampling_rate, n_fft=len(dft_input))

plt.figure().set_figwidth(12)
plt.plot(frequency, amplitude_db)
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude (dB)")
plt.xscale("log")
Spectrum plot

這會繪製此音訊片段中存在的各種頻率分量的強度。頻率值在 x 軸上,通常以對數刻度繪製,而它們的振幅在 y 軸上。

我們繪製的頻譜顯示了幾個峰值。這些峰值對應於正在播放的音符的諧波,其中較高諧波更安靜。由於第一個峰值約為 620 Hz,因此這是 E♭ 音符的頻譜。

DFT 的輸出是一個複數陣列,由實部和虛部組成。使用 `np.abs(dft)` 取模可以從頻譜圖中提取振幅資訊。實部和虛部之間的角度提供了所謂的相位譜,但在機器學習應用中通常會丟棄此資訊。

您使用 `librosa.amplitude_to_db()` 將振幅值轉換為分貝刻度,以便更容易地看到頻譜中的細節。有時人們使用功率譜,它測量能量而不是振幅;這只是一個振幅值平方的頻譜。

💡 實際上,人們將 FFT 與 DFT 互換使用,因為 FFT(快速傅立葉變換)是計算機上計算 DFT 的唯一高效方法。

音訊訊號的頻譜與其波形包含完全相同的資訊——它們只是檢視相同資料(這裡是小號聲音的前 4096 個樣本)的兩種不同方式。波形繪製了音訊訊號隨時間變化的振幅,而頻譜則可視化了在固定時間點上各個頻率的振幅。

頻譜圖

如果我們想看看音訊訊號中的頻率是如何變化的呢?小號演奏幾個音符,它們都有不同的頻率。問題在於頻譜只顯示了給定瞬間頻率的凍結快照。解決方案是進行多個 DFT,每個 DFT 只覆蓋一小段時間,並將生成的頻譜堆疊在一起形成頻譜圖

頻譜圖繪製了音訊訊號隨時間變化的頻率內容。它允許您在一個圖中同時檢視時間、頻率和振幅。執行此計算的演算法是 STFT 或短時傅立葉變換。

頻譜圖是您可用的最有用的音訊工具之一。例如,在處理音樂錄音時,您可以看到各種樂器和人聲軌道以及它們對整體聲音的貢獻。在語音中,您可以識別不同的母音,因為每個母音都以特定的頻率為特徵。

讓我們使用 librosa 的 `stft()` 和 `specshow()` 函式來繪製相同小號聲音的頻譜圖。

import numpy as np

D = librosa.stft(array)
S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)

plt.figure().set_figwidth(12)
librosa.display.specshow(S_db, x_axis="time", y_axis="hz")
plt.colorbar()
Spectrogram plot

在此圖中,x 軸表示時間,與波形視覺化相同,但現在 y 軸表示頻率(單位為 Hz)。顏色的強度表示在每個時間點上頻率分量的振幅或功率,以分貝(dB)為單位測量。

頻譜圖是透過將音訊訊號分成短片段(通常持續幾毫秒),並計算每個片段的離散傅立葉變換以獲得其頻譜來建立的。然後將得到的頻譜沿時間軸堆疊在一起以建立頻譜圖。此影像中的每個垂直切片都對應一個單獨的頻譜,從頂部看。預設情況下,`librosa.stft()` 將音訊訊號分成 2048 個樣本的片段,這在頻率解析度和時間解析度之間提供了良好的權衡。

由於頻譜圖和波形是相同資料的不同檢視,因此可以使用逆 STFT 將頻譜圖轉換回原始波形。但是,這除了振幅資訊外還需要相位資訊。如果頻譜圖是由機器學習模型生成的,它通常只輸出振幅。在這種情況下,我們可以使用相位重建演算法(例如經典的 Griffin-Lim 演算法)或使用稱為聲碼器的神經網路,從頻譜圖重建波形。

頻譜圖不僅僅用於視覺化。許多機器學習模型會以頻譜圖作為輸入——而不是波形——並以頻譜圖作為輸出。

現在我們知道了什麼是頻譜圖以及它是如何生成的,讓我們來看看它在語音處理中廣泛使用的一個變體:梅爾頻譜圖。

梅爾頻譜圖

梅爾頻譜圖是頻譜圖的一種變體,常用於語音處理和機器學習任務。它與頻譜圖相似,都顯示音訊訊號隨時間變化的頻率內容,但頻率軸不同。

在標準頻譜圖中,頻率軸是線性的,以赫茲 (Hz) 為單位測量。然而,人類聽覺系統對低頻變化的敏感度高於高頻變化,並且這種敏感度隨著頻率的增加而對數下降。梅爾刻度是一種感知刻度,它近似於人耳的非線性頻率響應。

要建立梅爾頻譜圖,與以前一樣使用 STFT,將音訊分成短片段以獲取一系列頻譜。此外,每個頻譜都會透過一組濾波器(即梅爾濾波器組)進行處理,以將頻率轉換為梅爾刻度。

讓我們看看如何使用 librosa 的 `melspectrogram()` 函式繪製梅爾頻譜圖,該函式為我們執行所有這些步驟。

S = librosa.feature.melspectrogram(y=array, sr=sampling_rate, n_mels=128, fmax=8000)
S_dB = librosa.power_to_db(S, ref=np.max)

plt.figure().set_figwidth(12)
librosa.display.specshow(S_dB, x_axis="time", y_axis="mel", sr=sampling_rate, fmax=8000)
plt.colorbar()
Mel spectrogram plot

在上面的示例中,`n_mels` 表示要生成的梅爾頻帶數量。梅爾頻帶定義了一組頻率範圍,這些範圍將頻譜劃分為感知上有意義的成分,使用一組濾波器的形狀和間距來模擬人耳對不同頻率的響應方式。`n_mels` 的常見值為 40 或 80。`fmax` 表示我們關心的最高頻率(單位為 Hz)。

與常規頻譜圖一樣,通常將梅爾頻率分量的強度表示為分貝。這通常被稱為對數梅爾頻譜圖,因為轉換為分貝涉及對數運算。上面的示例使用 `librosa.power_to_db()`,因為 `librosa.feature.melspectrogram()` 建立功率頻譜圖。

💡 並非所有梅爾頻譜圖都相同!常用有兩種不同的梅爾刻度(“htk”和“slaney”),並且可以使用振幅頻譜圖而不是功率頻譜圖。轉換為對數梅爾頻譜圖並不總是計算真實的分貝,可能只是簡單地取 `log`。因此,如果機器學習模型期望梅爾頻譜圖作為輸入,請仔細檢查以確保您以相同的方式計算它。

建立梅爾頻譜圖是一個有損操作,因為它涉及過濾訊號。將梅爾頻譜圖轉換回波形比將常規頻譜圖轉換回波形更困難,因為它需要估計被丟棄的頻率。這就是為什麼需要像 HiFiGAN 聲碼器這樣的機器學習模型來從梅爾頻譜圖生成波形。

與標準頻譜圖相比,梅爾頻譜圖可以捕獲更多對人類感知有意義的音訊訊號特徵,使其成為語音識別、說話人識別和音樂流派分類等任務中的熱門選擇。

現在您已經知道如何視覺化音訊資料示例,快去看看您最喜歡的聲音是什麼樣的吧!:)

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.