如何从python中的.wav文件中创建用于音频分类问题的spectrogram
我想使用CNN的声谱图进行音频文件分类。问题是,我的音频文件有不同的长度(2秒到17秒之间)以及生成spectrogram的时间。它们都具有相同的大小,这意味着对于较短的音频文件,频谱会变宽。如何生成spectrograms,使信号不被改变 我尝试使用如何从python中的.wav文件中创建用于音频分类问题的spectrogram,python,audio,signal-processing,Python,Audio,Signal Processing,我想使用CNN的声谱图进行音频文件分类。问题是,我的音频文件有不同的长度(2秒到17秒之间)以及生成spectrogram的时间。它们都具有相同的大小,这意味着对于较短的音频文件,频谱会变宽。如何生成spectrograms,使信号不被改变 我尝试使用matplotlib.pyplot库创建光谱图,但所有图像都是640 x 480 这是我使用的代码 import matplotlib.pyplot as plt from scipy.io import wavfile samplingFreq
matplotlib.pyplot
库创建光谱图,但所有图像都是640 x 480
这是我使用的代码
import matplotlib.pyplot as plt
from scipy.io import wavfile
samplingFrequency, signalData = wavfile.read('dia0_utt0.wav')
plt.title('Spectrogram')
plt.specgram(signalData,Fs=samplingFrequency,NFFT=512)
plt.xlabel('Time')
plt.ylabel('Frequency')
plt.savefig('fig11.png')
我不知道如何根据长度获得可变尺寸的光谱图,或者让它们具有相同的尺寸,但填充其余部分,直到最大长度为止,没有任何信息。
例如,如果我有一个3秒的文件,最大长度为17秒,则生成频谱图3秒,并在频谱图的其余部分填充无噪声,使其达到17秒。您可以使用
matplotlib.pyplot.xlim
和matplotlib.pyplot.ylim
函数设置两个轴的限制
[编辑]在下面的示例中,我加载了一个从以下网站下载的酒吧乐队歌曲的3秒长wav文件:
此脚本生成以下图像:
如果我没有指定plt.xlim(左=0,右=17)
,输出数字将在0到3秒之间:
您也可以使用Python的。以下是符合您要求的完整代码:
import librosa
import matplotlib.pyplot as plt
sig, fs = librosa.load(filename, sr=44100) #you can specify sample rate as well
save_path = filename[:-4]+'.png'
plt.figure(figsize=(6.40,4.80), dpi=1000) #this makes the image resolution as 640x480
plt.axis('off') # no axis
plt.axes([0., 0., 1., 1.], frameon=False, xticks=[], yticks=[])
S = librosa.feature.melspectrogram(y=y, sr=44100, n_fft=4096, hop_length=2205, n_mels=512) #you can update it as per your requirement
librosa.display.specshow(librosa.power_to_db(S, ref=np.max), cmap='jet')
plt.xlim(left=0,right=17)
plt.savefig(save_path, dpi=100, bbox_inches=None, pad_inches=0)
plt.close()
import librosa
import matplotlib.pyplot as plt
sig, fs = librosa.load(filename, sr=44100) #you can specify sample rate as well
save_path = filename[:-4]+'.png'
plt.figure(figsize=(6.40,4.80), dpi=1000) #this makes the image resolution as 640x480
plt.axis('off') # no axis
plt.axes([0., 0., 1., 1.], frameon=False, xticks=[], yticks=[])
S = librosa.feature.melspectrogram(y=y, sr=44100, n_fft=4096, hop_length=2205, n_mels=512) #you can update it as per your requirement
librosa.display.specshow(librosa.power_to_db(S, ref=np.max), cmap='jet')
plt.xlim(left=0,right=17)
plt.savefig(save_path, dpi=100, bbox_inches=None, pad_inches=0)
plt.close()