Librosa是一个用于音频、音乐分析、处理的python工具包,一些常见的时频处理、特征提取、绘制声音图形等功能应有尽有,功能十分强大
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
y,sr = librosa.load('./data/noisy/p226_001_0.wav',sr=None)
print(y,sr)
melspec = librosa.feature.melspectrogram(y,sr,n_fft=1024,hop_length=512,n_mels = 128)
logmelspec = librosa.power_to_db(melspec)
print(logmelspec.shape)
mfccs = librosa.feature.mfcc(y=y,sr=sr,n_mfcc=40)
print(mfccs.shape)
plt.figure()
librosa.display.waveplot(y,sr)
plt.title('Beat wavform')
plt.gcf().set_size_inches(20, 12) # get current figure
plt.savefig("./png/clean.png",dpi=300)
直接画:
plt.figure()
librosa.display.specshow(logmelspec,sr=sr,x_axis='time',y_axis='mel')
plt.title('mel spectrogram')
plt.savefig("./png/clean_mel.png",dpi=300)
归一化之后画:
# 第二种
L = len(y)
print("time:",L * sr)
y = y*1.0/max(y)
framelength = 0.025
# NFFT点数=0.025*sr
framesize = int (framelength * sr)
print("NFFT:",framesize)
#提取mel特征
mel_spect = librosa.feature.melspectrogram(y, sr=sr, n_fft=framesize)
#转化为log形式
mel_spect = librosa.power_to_db(mel_spect, ref=np.max)
librosa.display.specshow(mel_spect, sr=sr, x_axis='time', y_axis='mel')
plt.ylabel('Mel Frequency')
plt.xlabel('Time(s)')
plt.title('Mel Spectrogram')
plt.savefig("./png/clean_mel2.png")
plt.figure()
# sr=None声音保持原采样频率, mono=False声音保持原通道数
data, rs = librosa.load('./data/noisy/p226_001_0.wav', sr=None, mono=False)
L = len(data)
print('Time:', L / rs)
#归一化
data = data * 1.0 / max(data)
#0.025s
framelength = 0.025
#NFFT点数=0.025*fs
framesize = int(framelength * rs)
print("NFFT:", framesize)
#画语谱图
plt.specgram(data, NFFT=framesize, Fs=rs, window=np.hanning(M=framesize))
plt.ylabel('Frequency')
plt.xlabel('Time(s)')
plt.title('Spectrogram')
plt.savefig("./png/clean_linear2.png")
plt.subplot(2,3,1)也可以简写plt.subplot(231)表示把显示界面分割成2*3的网格。其中,第一个参数是行数,第二个参数是列数,第三个参数表示图形的标号
# 3.4 将波形和频谱画在同一张图中
plt.figure()
# plt.subplot(2,3,1)也可以简写plt.subplot(231)表示把显示界面分割成2*3的网格。其中,第一个参数是行数,第二个参数是列数,第三个参数表示图形的标号
plt.subplot(2,1,1)
librosa.display.waveplot(y,sr)
plt.title('Beat wavform')
plt.subplot(2,1,2)
librosa.display.specshow(logmelspec,sr=sr,x_axis='time',y_axis='mel')
plt.title('Mel spectrogram')
plt.tight_layout() #保证图不重叠
plt.savefig("./png/clean_mix.png",dpi=300)