如何从python中的.wav文件创建频谱图以获得音频分类问题

问题描述 投票:2回答:2

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

我尝试使用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秒。

python audio signal-processing
2个回答
3
投票

您可以使用matplotlib.pyplot.xlimmatplotlib.pyplot.ylim函数来设置轴的极限。

[编辑]在下面的例子中,我加载了从this website下载的Cantina Band歌曲的3秒长wav文件:

import matplotlib.pyplot as plt
from scipy.io import wavfile

samplingFrequency, signalData = wavfile.read('C:/Users/Sheldon/Desktop/WAVEEXAMPLE/CantinaBand3.wav')


plt.title('Spectrogram')    
Pxx, freqs, bins, im = plt.specgram(signalData,Fs=samplingFrequency,NFFT=512)
plt.xlabel('Time')
plt.ylabel('Frequency')
plt.xlim(left=0,right=17)

plt.savefig('C:/Users/Sheldon/Desktop/WAVEEXAMPLE/fig11.png')

此脚本生成以下图像:

enter image description here

如果我没有指定plt.xlim(left=0, right=17),输出数字将介于0到3秒之间:

enter image description here


1
投票

你也可以使用Python的Librosa。以下是根据您的要求提供的完整代码:

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()
© www.soinside.com 2019 - 2024. All rights reserved.