【问题标题】:How can I create spectograms from .wav files in python for audio classification problem如何从 python 中的 .wav 文件创建频谱图以解决音频分类问题
【发布时间】:2019-08-14 05:02:49
【问题描述】:

我想将频谱图用于 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


    【解决方案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()
    

    【讨论】:

      【解决方案2】:

      您可以使用matplotlib.pyplot.xlim 和matplotlib.pyplot.ylim 函数来设置两个轴的限制。

      [EDITED] 在下面的示例中,我加载了从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')
      

      此脚本生成以下图像:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-14
        相关资源
        最近更新 更多