1.1 音頻數(shù)據(jù)簡介

在本質(zhì)上講,聲波是一種連續(xù)信號,這意味著它在給定的時間內(nèi)包含無數(shù)個信號值。這對需要有限數(shù)組的數(shù)字設備來說是個問題。要由數(shù)字設備處理、存儲和傳輸連續(xù)聲波,需要將其轉(zhuǎn)換成一系列離散值,即所謂的數(shù)字表示。

如果你查看任何音頻數(shù)據(jù)集,你會發(fā)現(xiàn)帶有聲音片段的數(shù)字文件,例如文本敘述或音樂。你可能遇到不同的文件格式,例如.wav(波形音頻文件)、.flac(免費無損音頻編解碼器)和 .mp3(MPEG-1 音頻層 3)。這些格式的主要區(qū)別在于它們?nèi)绾螇嚎s音頻信號的數(shù)字表示。

讓我們看看如何從連續(xù)信號得出這種表示形式。模擬信號首先被麥克風捕獲,麥克風將聲波轉(zhuǎn)換為電信號。然后,電信號被模數(shù)轉(zhuǎn)換器數(shù)字化,通過采樣獲得數(shù)字表示。

采樣和采樣率

采樣是測量固定時間步長連續(xù)信號值的過程。采樣波形是離散的,因為它包含有限數(shù)量的均勻間隔的信號值。

Signal_Sampling.png

采樣率(也稱為采樣頻率)是一秒鐘內(nèi)進行的樣本數(shù),以赫茲(hz)為單位。為了給你提供參考點,CD 質(zhì)量音頻的采樣率為 44100 Hz,這意味著每秒采樣 44100 次。相比之下,高分辨率音頻的采樣率為 192000 hz 或 192 kHz。訓練語音模型時常用的采樣率為 16000 Hz 或 16 kHz。

采樣率的選擇主要決定了可以從信號中捕獲的最高頻率。這也稱為 Nyquist limit(奈奎斯特極限),恰好是采樣率的一半。人類語音的可聽音頻低于 8 kHz,因此以 16 kHz 采樣語音就足夠了。使用更高的采樣率不會捕獲更多的信息,只會導致處理此類文件的計算成本增加。另一方面,以太低的采樣率對音頻進行采樣會導致信息丟失。以 8 kHz 采樣的語音聽起來會很低沉,因為以此速率無法捕捉到較高的頻率。

在執(zhí)行任何音頻任務時,確保數(shù)據(jù)集中的所有音頻示例具有相同的采樣率非常重要。如果你計劃使用自定義音頻數(shù)據(jù)來微調(diào)預訓練模型,則數(shù)據(jù)的采樣率應該與模型預訓練數(shù)據(jù)的采樣率相匹配。采樣率決定了連續(xù)音頻樣本之間的時間間隔,這影響音頻數(shù)據(jù)的時間分辨率??紤]一個例子:采樣率為 16000 Hz 的 5 秒聲音將表示為一系列 80000 個值,而采樣率為 8000 Hz 的相同 5 秒聲音將表示為一系列 40000 個值。解決音頻任務的 Transformer 模型將示例視為序列,并依靠注意力機制來學習音頻或多模態(tài)表示。由于不同采樣率的音頻示例的序列不同,因此模型在采樣率之間進行推廣將具有挑戰(zhàn)性。重采樣 是使采樣率匹配的過程,是音頻數(shù)據(jù)預處理的一部分。

振幅和位深度

雖然采樣率可以告訴你采樣的頻率,但是每個樣本中的值到底是什么呢?

聲音是由人類可聽見的頻率的氣壓變化產(chǎn)生的。聲音的振幅描述了任何特定時刻的聲壓級,以分貝(dB)為單位。我們將振幅視為響度。舉個例子,正常說話的聲音低于 60 分貝,而搖滾音樂會的聲音則可能達到 125 分貝左右,這超出了人類聽覺的極限。

在數(shù)字音頻中,每個音頻樣本都會記錄某一時間點的音頻波的振幅。樣本的位深度決定了該振幅值的描述精度。位深度越高,數(shù)字表示越忠實地接近原始連續(xù)聲波。

最常見的音頻位深度是 16 位和 24 位。每個都是二進制項,表示將幅度值從連續(xù)轉(zhuǎn)換為離散時可以量化的可能部署:16 位音頻位 65536 步,24 位音頻則高達 16777216 步。由于量化涉及將連續(xù)值四舍五入為離散值,因此采樣過程會引入噪聲。位深度越高,量化噪聲越小。實際上,16 位音頻的量化噪聲已經(jīng)足夠小,可以聽到,并且通常不需要使用更高的位深度。

你可能還會遇到 32 位音頻。這將樣本存儲位浮點值,而 16 位和 24 位音頻使用整數(shù)樣本。32 位浮點值的精度為 24 位,因此其位深度與 24 位音頻相同。浮點音頻樣本預計位于 [-1.0, 1.0] 范圍內(nèi)。由于機器學習模型自然地在浮點數(shù)據(jù)上起作用,因此必須將音頻轉(zhuǎn)換為浮點格式,然后才能用于訓練模型。我們將在下一節(jié) “預處理” 中看到如何做到這一點。

與連續(xù)音頻信號一樣,數(shù)字音頻的幅度通常以分貝(dB)表示。由于人類的聽覺本質(zhì)上是對數(shù)的 --- 我們的耳朵對安靜聲音的細小波動比對大聲音的細小波動更敏感 --- 如果振幅以分貝為單位,而分貝也是對數(shù)的,那么聲音的響度就更容易解釋。真實世界音頻的分貝標度從 0 dB開始,這代表人類可以聽到的最小聲音,聲音越大,分貝值越大。然而,對于數(shù)字音頻信號,0 dB是可能的最大振幅,而所有其它振幅都是負值。一個簡單的經(jīng)驗法則:每 -6 dB就是振幅減半,并且低于 -60 dB 的任何聲音通常都聽不見,除非你真的調(diào)高音量。

音頻波形

你可能已經(jīng)看到過以波形形式呈現(xiàn)的聲音,它繪制了隨時間變化的樣本值并說明了聲音振幅的變化,這也稱為聲音的時域表示。

這種可視化對于識別音頻信號的特定特征很有用,例如單個聲音事件的時間、信號的整體響度以及音頻中存在的任何不規(guī)則或噪音。

要繪制音頻信號的波形,我們可以使用為 librosa 的 Python 庫:

pip install librosa

讓我們以庫中自帶的名為 “trumpet” 的聲音為例:

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

該示例以音頻時間序列(此處我們稱之為數(shù)組)和采樣率(sampling_rate)的元組形式加載。讓我們使用 librosa 的 waveshow() 函數(shù)查看此聲音的波形:

import matplotlib.pyplot as plt
import librosa.display

plt.figure().set_figwidth(12)
librosa.display.waveshow(array, sr=sampling_rate)
waveform_plot.png

這在 y 軸上繪制了信號的幅度,在 x 軸上繪制了時間。換句話說,每個點對應于對該聲音進行采樣時獲取的單個樣本值。還要注意,librosa 已經(jīng)將音頻作為浮點值返回,并且幅度值確實在 [-1.0, 1.0] 范圍內(nèi)。

將音頻可視化并聆聽它對于理解你正在處理的數(shù)據(jù)的有用工具。你可以看到信號的形狀,觀察模式,學會發(fā)現(xiàn)噪音或失真。如果你以某些方式對數(shù)據(jù)進行預處理,例如規(guī)范化、重采樣或過濾,則可以直觀地確認預處理步驟已按預期應用。訓練模型后,你還可以可視化出現(xiàn)錯誤的樣本(例如在音頻分類任務中)來調(diào)試問題。

頻譜

可視化音頻數(shù)據(jù)的另一種方法是繪制音頻信號的頻譜,也稱為頻域表示。頻譜是使用離散傅里葉變換(DFT)計算的。它描述了組成信號的各個頻率及其強度。

讓我們使用 numpy 的 rfft() 函數(shù)進行 DFT,繪制相同小號聲音的頻譜。雖然可以繪制整個聲音的頻譜,但觀察一小部分區(qū)域更有用。這里我們將對前 4096 個樣本進行 DFT,這大致是演奏的第一個音符的長度:

import numpy as np

dft_input = array[:4096]

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

# 獲取以分貝為單位的振幅譜
amplitude = np.abs(dft)
amplitude_db = librosa.amplitude_to_db(amplitude, ref=np.max)

# 獲取頻率點
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.png

這繪制了該音頻片段中存在的各種頻率成分的強度。頻率值在 x 軸上,通常以對數(shù)刻度繪制,而其幅度在 y 軸上。

我們繪制的頻譜顯示出幾個峰值。這些峰值與正在演奏的音符的諧波相對應,其中諧波越高,聲音越安靜。由于第一個峰值位于 620 Hz 左右,因此這是 E? 音符的頻譜。

DFT 的輸出是一個復數(shù)數(shù)組,由實部和虛部組成。使用 np.abs(dft) 測量幅度可以從頻譜圖中提取振幅信息。實部和虛部之間的角度提供了所謂的相位譜,但這在機器學習應用中經(jīng)常被丟棄。

你使用 librosa.amplitude_to_db() 將振幅值轉(zhuǎn)換為分貝刻度,從而更容易看到頻譜中的更精細的細節(jié)。有時人們使用功率譜,它測量能量而不是振幅;這只是振幅值平方的頻譜。

?? 在實踐中,人們交替使用術語 FFT 與 DFT,因為 FFT 或快速傅里葉變換是在計算機上計算 DFT 的唯一有效方法。

音頻信號的頻譜包含與其波形完全相同的信息 --- 它們只是查看統(tǒng)一數(shù)據(jù)的兩種不同方式(這里是來自小號聲音的前 4096 個樣本)。波形圖繪制了音頻信號隨時間變化的振幅,而頻譜則顯示了固定時間點各個頻率的幅度。

頻譜圖

如果我們想看看音頻信號中的頻率如何變化,該怎么辦?小號吹奏幾個音符,它們都有不同的頻率。問題在于頻譜僅顯示特定時刻頻率的凍結快照。解決方案是采用多個 DFT,每個 DFT 僅覆蓋一小段時間,然后將得倒的頻譜堆疊在一起形成頻譜圖。

頻譜圖繪制了音頻信號隨時間變化的頻率內(nèi)容。它允許你在一張圖上查看時間、頻率和振幅。執(zhí)行此計算的算法是 STFT 或短時傅里葉變換。

頻譜圖是你可以使用的最具信息量的音頻工具之一。例如,在處理音樂錄音時,你可以看到各種樂器和人聲曲目以及他們對整體聲音的貢獻。在語音中,你可以識別不同的元音,因為每個元音都有特定的頻率特征。

讓我們使用 librosa 的 sftf()specshow() 函數(shù)繪制相同 “trumpet” 聲音的聲譜圖:

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.png

在此圖中,x 軸表示時間,如波形可視化所示,但現(xiàn)在 y 軸表示頻率(單位為赫茲)。顏色的強度給出了每個時間頻率成分的幅度或功率,以分貝(dB)為單位。

頻譜圖時通過截取音頻信號的短片段(通常持續(xù)幾毫秒)并計算每個片段的離散傅里葉變換以獲取得其頻譜來創(chuàng)建。然后得到的光譜堆疊在時間軸上以創(chuàng)建光譜圖。從頂部看,該圖像的每個垂直切片都對應一個頻譜。默認情況下,librosa.stft() 將音頻信號分成 2048 個樣本的段,這在頻率分辨率和時間分辨率之間實現(xiàn)了良好的平衡。

由于頻譜圖和波形在同一數(shù)據(jù)的不同視圖,因此可以使用逆 STFT 將頻譜圖轉(zhuǎn)換回原始波形。然后,這除了幅度信息之外還需要相位信息。如果頻譜圖是由機器學習模型生成的,它通常只輸出振幅。在這種情況下,我們可以使用相位重建算法,例如經(jīng)典的 Griffin-Lim 算法,或者使用稱為聲碼器的神經(jīng)網(wǎng)絡,從頻譜圖中重建波形。

頻譜圖不僅僅用于可視化。許多機器學習模型將頻譜圖(而不是波形)作為輸入,并生成頻譜圖作為輸出。

現(xiàn)在我們知道了什么是聲譜圖以及它是如何生成的,讓我們看下廣泛用于語音處理的變體:梅爾聲頻譜圖。

梅爾頻譜圖

梅爾頻譜圖是語音處理和機器學習任務中常使用的頻譜圖的變體。它類似于頻譜圖,顯示音頻信號隨時間的變化的頻率內(nèi)容,但是在不同的頻率軸上。

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

為了創(chuàng)建梅爾頻譜圖,使用 STFT 的方式與之前一樣,將音頻分成短段以獲取一系列頻譜。此外,每個頻譜都經(jīng)過一組濾波器(即所謂的梅爾濾波器組),將頻率轉(zhuǎn)換為梅爾尺度。

讓我們看看如何使用 librosa 的 melspectrogram() 函數(shù)繪制梅爾頻譜圖,該函數(shù)為我們執(zhí)行了所有這些步驟:

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.png

在上面的例子中,n_mels 代表要生成的梅爾帶的數(shù)量。梅爾頻帶定義了一組頻率范圍,將頻譜劃分為具有感知意義的分量,使用一組濾波器,這些濾波器的形狀和間距經(jīng)過選擇,以模仿人耳對不同頻率的響應方式。n_mels 的常見值是 40 或 80。fmax 表示我們關心的最高頻率(以 Hz 為單位)。

與常規(guī)頻譜圖一樣,通常用分貝來表示梅爾頻率成分的強度。這通常被稱為對數(shù)梅爾頻譜圖,因為轉(zhuǎn)換為分貝射擊對數(shù)運算。上面的例子使用 librosa.power_to_db() 作為 librosa.feature.lemspectrogram() 創(chuàng)建功率譜圖。

??并非所有梅爾頻譜圖都相同!有兩種不同的梅爾標度常用(“htk”和“slaney”),并且可以使用振幅頻譜圖代替功率頻譜圖。轉(zhuǎn)換為對數(shù)梅爾頻譜圖并不總是計算真正的分貝,而可能只是取“對數(shù)”。因此,如果機器學習模型需要梅爾頻譜作為輸入,請仔細檢查以確保你以相同的方式計算它。

創(chuàng)建梅爾頻譜圖是一項有損操作,因為它涉及過濾信號。將梅爾頻譜圖轉(zhuǎn)換回波形比常規(guī)頻譜圖更困難,因為它需要估計被丟棄的頻率。這就是為什么需要 HiFiGAN 聲碼器等機器學習模型從梅爾頻譜圖產(chǎn)生波形的原因。

與標準頻譜圖相比,梅爾頻譜圖能夠捕捉到更符合人類感知的音頻特征,這使得它在語音識別、說話人識別和音樂流派分類等任務中成為一種常用的選擇。

現(xiàn)在你已經(jīng)知道了如何可視化音頻數(shù)據(jù)示例,請繼續(xù)嘗試看看你最喜歡的聲音是什么樣的。:)

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容