Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从python中的.wav文件中创建用于音频分类问题的spectrogram_Python_Audio_Signal Processing - Fatal编程技术网

如何从python中的.wav文件中创建用于音频分类问题的spectrogram

如何从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

我想使用CNN的声谱图进行音频文件分类。问题是,我的音频文件有不同的长度(2秒到17秒之间)以及生成spectrogram的时间。它们都具有相同的大小,这意味着对于较短的音频文件,频谱会变宽。如何生成spectrograms,使信号不被改变

我尝试使用
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()