【Python】librosa音頻處理教程
Librosa簡介
Librosa是一個 Python 模塊,用于分析一般的音頻信號,是一個非常強(qiáng)大的python語音信號處理的第三方庫,根據(jù)網(wǎng)絡(luò)資料以及官方教程,本文主要總結(jié)了一些重要且常用的功能。
#?安裝
!pip?install?librosa
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: librosa in f:\programdata\anaconda3\envs\tf\lib\site-packages (0.8.1)
Requirement already satisfied: scikit-learn!=0.19.0,>=0.14.0 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from librosa) (0.24.2)
Requirement already satisfied: joblib>=0.14 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from librosa) (1.1.0)
Requirement already satisfied: packaging>=20.0 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from librosa) (21.3)
Requirement already satisfied: numpy>=1.15.0 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from librosa) (1.19.5)
Requirement already satisfied: pooch>=1.0 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from librosa) (1.5.2)
Requirement already satisfied: decorator>=3.0.0 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from librosa) (4.4.2)
Requirement already satisfied: audioread>=2.0.0 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from librosa) (2.1.9)
Requirement already satisfied: resampy>=0.2.2 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from librosa) (0.2.2)
Requirement already satisfied: scipy>=1.0.0 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from librosa) (1.5.4)
Requirement already satisfied: soundfile>=0.10.2 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from librosa) (0.10.3.post1)
Requirement already satisfied: numba>=0.43.0 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from librosa) (0.53.1)
Requirement already satisfied: setuptools in f:\programdata\anaconda3\envs\tf\lib\site-packages (from numba>=0.43.0->librosa) (58.0.4)
Requirement already satisfied: llvmlite<0.37,>=0.36.0rc1 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from numba>=0.43.0->librosa) (0.36.0)
Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from packaging>=20.0->librosa) (3.0.6)
Requirement already satisfied: appdirs in f:\programdata\anaconda3\envs\tf\lib\site-packages (from pooch>=1.0->librosa) (1.4.4)
Requirement already satisfied: requests in f:\programdata\anaconda3\envs\tf\lib\site-packages (from pooch>=1.0->librosa) (2.26.0)
Requirement already satisfied: six>=1.3 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from resampy>=0.2.2->librosa) (1.15.0)
Requirement already satisfied: threadpoolctl>=2.0.0 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from scikit-learn!=0.19.0,>=0.14.0->librosa) (3.0.0)
Requirement already satisfied: cffi>=1.0 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from soundfile>=0.10.2->librosa) (1.15.0)
Requirement already satisfied: pycparser in f:\programdata\anaconda3\envs\tf\lib\site-packages (from cffi>=1.0->soundfile>=0.10.2->librosa) (2.21)
Requirement already satisfied: certifi>=2017.4.17 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from requests->pooch>=1.0->librosa) (2021.5.30)
Requirement already satisfied: charset-normalizer~=2.0.0 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from requests->pooch>=1.0->librosa) (2.0.7)
Requirement already satisfied: idna<4,>=2.5 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from requests->pooch>=1.0->librosa) (3.3)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in f:\programdata\anaconda3\envs\tf\lib\site-packages (from requests->pooch>=1.0->librosa) (1.26.7)import?numpy?as?np?
import?pandas?as?pd?
import?os
import?IPython.display?as?ipd
加載音頻文件
import?librosa
audio_data?=?'data/Data_MGTV/angry/audio_1027.wav'
x?,?sr?=?librosa.load(audio_data)
print(x.shape,?sr)
(45159,) 22050x
array([-0.11979394, -0.10811259, -0.04991762, ..., ?0.00769441,
? ? ? ?0.00752225, ?0. ? ? ? ?], dtype=float32)print('x:',?x,?'\n')
print('x?shape:',?np.shape(x),?'\n')
print('Sample?Rate?(KHz):',?sr,?'\n')
print('Check?Len?of?Audio:',?np.shape(x)[0]/sr)
x: [-0.11979394 -0.10811259 -0.04991762 ... ?0.00769441 ?0.00752225
?0. ? ? ? ?]
x shape: (45159,)
Sample Rate (KHz): 22050
Check Len of Audio: 2.048027210884354讀取時長
d?=?librosa.get_duration(y=x,?sr=22050,?S=None,?n_fft=2048,?hop_length=512,?center=True,?filename=None)
d
2.048027210884354采樣率
sr?=?librosa.get_samplerate(audio_data)
sr
16000去除兩端沉默
audio_file,?_?=?librosa.effects.trim(x)
print('Audio?File:',?audio_file,?'\n')
print('Audio?File?shape:',?np.shape(audio_file))
Audio File: [-0.11979394 -0.10811259 -0.04991762 ... ?0.00769441 ?0.00752225
?0. ? ? ? ?]
Audio File shape: (45159,)播放音頻
IPython.display.Audio 可以讓我們直接在 jupyter notebook 中播放音頻,比如下面包房一段音頻
ipd.Audio(audio_data)
波形圖
在這里,我們繪制了一個簡單的音頻波形圖。波圖讓我們知道給定時間的音頻響度。
%matplotlib?inline
import?sklearn
import?matplotlib.pyplot?as?plt
import?librosa.display
plt.figure(figsize=(20,?5))
librosa.display.waveplot(y,?sr=sr)
plt.show()

Spectogram
頻譜圖(Spectogram)是聲音頻率隨時間變化的頻譜的可視化表示,是給定音頻信號的頻率隨時間變化的表示。'.stft' 將數(shù)據(jù)轉(zhuǎn)換為短期傅里葉變換。STFT轉(zhuǎn)換信號,以便我們可以知道給定時間給定頻率的幅度。使用 STFT,我們可以確定音頻信號在給定時間播放的各種頻率的幅度。
Spectrogram特征是目前在語音識別和環(huán)境聲音識別中很常用的一個特征,由于CNN在處理圖像上展現(xiàn)了強(qiáng)大的能力,使得音頻信號的頻譜圖特征的使用愈加廣泛,甚至比MFCC使用的更多。
X?=?librosa.stft(x)
Xdb?=?librosa.amplitude_to_db(abs(X))
plt.figure(figsize=(20,?5))
librosa.display.specshow(Xdb,?sr=sr,?x_axis='time',?y_axis='hz')
plt.colorbar()
plt.show()

librosa.display.specshow(Xdb,?sr=sr,?x_axis='time',?y_axis='log')
plt.colorbar()

梅爾頻率倒譜系數(shù)(MFCC)
信號的梅爾頻率倒譜系數(shù) (MFCC) 是一小組特征(通常約為 10-20),它們簡明地描述了頻譜包絡(luò)的整體形狀。在 MIR 中,它經(jīng)常被用來描述音色。
#mcc
mfccs?=?librosa.feature.mfcc(y=x,?sr=sr)
mfccs
array([[-1.47507828e+02, -1.39587173e+02, -1.63085953e+02, ...,
? ? ? ?-3.51147095e+02, -3.62041565e+02, -3.64722260e+02],
? ? ? [ 1.39314545e+02, ?1.28688156e+02, ?1.26540642e+02, ...,
? ? ? ? 1.31368317e+02, ?1.23287079e+02, ?1.06071014e+02],
? ? ? [-5.88899651e+01, -7.76861572e+01, -8.52756119e+01, ...,
? ? ? ?-3.08440018e+01, -3.50476532e+01, -3.22384949e+01],
? ? ? ...,
? ? ? [ 1.24901953e+01, ?2.48859482e+01, ?3.59340363e+01, ...,
? ? ? ?-3.30873656e+00, -5.68462515e+00, -5.88594961e+00],
? ? ? [-6.10755301e+00, -8.72181129e+00, -3.69202137e+00, ...,
? ? ? ?-2.46745777e+00, -7.76338100e+00, -8.60360718e+00],
? ? ? [-1.22752495e+01, -8.53678513e+00, -2.76085877e+00, ...,
? ? ? ? 6.47896719e+00, ?9.00872326e+00, -3.04730564e-01]], dtype=float32)mfccs.shape
(20, 89)在這個例子中,mfcc 在 89 幀中計算了 20 個 MFCC。
第一個 MFCC,第 0 個系數(shù),不傳達(dá)與頻譜整體形狀相關(guān)的信息。它只傳達(dá)一個恒定的偏移量,即向整個頻譜添加一個恒定值。因此,很多情況我們可以在進(jìn)行分類時會丟棄第一個MFCC。
librosa.display.specshow(mfccs,?sr=sr,?x_axis='time')

過零率
過零率(zero-crossing rate,ZCR)是指一個信號的符號變化的比率,例如信號從正數(shù)變成負(fù)數(shù),或反過來。這個特征已在語音識別和音樂信息檢索領(lǐng)域得到廣泛使用,是分類敲擊聲的關(guān)鍵特征。為真時為1,否則為0。在一些應(yīng)用場景下,只統(tǒng)計“正向”或“負(fù)向”的變化,而不是所有的方向。
n0?=?7000
n1?=?7025
plt.figure(figsize=(14,?5))
plt.plot(x[n0:n1])
plt.show()

zero_crossings?=?librosa.zero_crossings(x[n0:n1],?pad=False)
zero_crossings.shape
(25,)zero_crossings.sum()
2可以使用整個音頻來遍歷這個并推斷出整個數(shù)據(jù)的過零。
zcrs?=?librosa.feature.zero_crossing_rate(x)
print(zcrs.shape)
(1, 89)plt.figure(figsize=(14,?5))
plt.plot(zcrs[0])
[] [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-pakxb1Os-1651758177390)(https://mmbiz.qlogo.cn/mmbiz_png/1FD1x61uYVdHWBWhQKLKptH3N9aicoJkXTUxeNaFAgV1cWuKOZpkrWPNQYgZk6ibOXm0AE60DkOvCibLtEI0by0cQ/0)]
頻譜質(zhì)心:Spectral Centroid
頻譜質(zhì)心(維基百科)表示頻譜能量集中在哪個頻率上。這就像一個加權(quán)平均值:
其中 S(k) 是頻段 k 處的頻譜幅度,f(k) 是頻段 k 處的頻率。
spectral_centroids?=?librosa.feature.spectral_centroid(x,?sr=sr)[0]
spectral_centroids.shape
(89,)frames?=?range(len(spectral_centroids))
t?=?librosa.frames_to_time(frames)
import?sklearn
def?normalize(x,?axis=0):
????return?sklearn.preprocessing.minmax_scale(x,?axis=axis)
librosa.display.waveplot(x,?sr=sr,?alpha=0.4)
plt.plot(t,?normalize(spectral_centroids),?color='r')
[] 
頻譜帶寬:Spectral Bandwidth
librosa.feature.spectral_bandwidth 可以用來計算p-order頻譜帶寬:
其中 S(k) 是頻段 k 處的頻譜幅度,f(k) 是頻段 k 處的頻率,fc 是頻譜質(zhì)心。當(dāng) p=2 時,這就像一個加權(quán)標(biāo)準(zhǔn)差。
spectral_bandwidth_2?=?librosa.feature.spectral_bandwidth(x+0.01,?sr=sr)[0]
spectral_bandwidth_3?=?librosa.feature.spectral_bandwidth(x+0.01,?sr=sr,?p=3)[0]
spectral_bandwidth_4?=?librosa.feature.spectral_bandwidth(x+0.01,?sr=sr,?p=4)[0]
librosa.display.waveplot(x,?sr=sr,?alpha=0.4)
plt.plot(t,?normalize(spectral_bandwidth_2),?color='r')
plt.plot(t,?normalize(spectral_bandwidth_3),?color='g')
plt.plot(t,?normalize(spectral_bandwidth_4),?color='y')
plt.legend(('p?=?2',?'p?=?3',?'p?=?4'))

頻譜滾降
頻譜衰減是總頻譜能量的特定百分比所在的頻率。
spectral_rolloff?=?librosa.feature.spectral_rolloff(x+0.01,?sr=sr)[0]
librosa.display.waveplot(x,?sr=sr,?alpha=0.4)
plt.plot(t,?normalize(spectral_rolloff),?color='r')
[] 
色度特征:Chroma Feature
色度向量 (Wikipedia) 是一個典型的 12 元素特征向量,指示每個音高類別{C, C#, D, D#, E, ..., B}的能量是多少存在于信號中。
chromagram?=?librosa.feature.chroma_stft(x,?sr=sr,?hop_length=512)
plt.figure(figsize=(15,?5))
librosa.display.specshow(chromagram,?x_axis='time',?y_axis='chroma',?hop_length=512,?cmap='coolwarm')

間距和幅度
音高是聲音的感知屬性,在與頻率相關(guān)的尺度上排序,或者更常見的是,音高是可以判斷聲音在與音樂旋律相關(guān)的意義上“更高”和“更低”的質(zhì)量。
pitches,?magnitudes?=?librosa.piptrack(y=x,?sr=sr)
print(pitches)
[[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
...
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]]參考資料
librosa語音信號處理 語音信號處理庫 ——Librosa
往期精彩回顧
