1、安装依赖库

pip install librosa
pip matplotlib

2、导入依赖

import librosa.display
import matplotlib.pyplot as plt
import numpy as np

3、加载音频文件

audio = 'D:\\Works\\PythonProjects\\spectrogram\\data\\audio\\test.wav'
y,sr = librosa.load(path=audio,sr=None)
print(y,sr)

4、Log-Mel Spectrogram

Log-Mel Spectrogram:是音频信号的时频表示特征

melspec = librosa.feature.melspectrogram(y=y,sr=sr,n_fft=1024,hop_length=512,n_mels = 128)
logmelspec = librosa.power_to_db(melspec)
print(logmelspec.shape)

5、MFCC

MFCC:是一种在自动语音识别和说话人识别中广泛使用的特征

mfccs = librosa.feature.mfcc(y=y,sr=sr,n_mfcc=40)
print(mfccs.shape)

6、绘制图

6.1、波形图

plt.figure()
librosa.display.waveshow(y=y,sr=sr)
plt.title('Beat wavform')
plt.gcf().set_size_inches(20, 12) # get current figure
plt.savefig("D:\\Works\\PythonProjects\\spectrogram\\data\\png\\clean.png",dpi=300)

clean

6.2、mel谱图

# 第一种 mel 谱图
plt.figure()
librosa.display.specshow(logmelspec,sr=sr,x_axis='time',y_axis='mel')
plt.title('mel spectrogram')
plt.savefig("D:\\Works\\PythonProjects\\spectrogram\\data\\png\\clean_mel.png",dpi=300)


# 第二种 mel 谱图
# 归一化之后
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=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("D:\\Works\\PythonProjects\\spectrogram\\data\\png\\clean_mel2.png",dpi=300)

clean_mel

clean_mel2

6.3、语谱图

语谱图:(横轴为时间,纵轴为频率,颜色为幅值)也称为声音的时频域表示(时频图)这种画的好看点,进行了加窗和归一化。

plt.figure()
# sr=None声音保持原采样频率, mono=False声音保持原通道数
data, rs = librosa.load(path=audio, 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("D:\\Works\\PythonProjects\\spectrogram\\data\\png\\clean_linear2.png",dpi=300)

clean_linear2

6.4、将多张图画在同一张图中

plt.figure()
# plt.subplot(2,3,1)也可以简写plt.subplot(231)表示把显示界面分割成2*3的网格。其中,第一个参数是行数,第二个参数是列数,第三个参数表示图形的标号
plt.subplot(2,1,1)
librosa.display.waveshow(y=y,sr=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("D:\\Works\\PythonProjects\\spectrogram\\data\\png\\clean_mix.png",dpi=300)

clean_mix

Q.E.D.


热爱生活,热爱程序