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

标签 python audio signal-processing

我想使用频谱图对 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 秒。

最佳答案

您可以使用 matplotlib.pyplot.xlimmatplotlib.pyplot.ylim 函数来设置两个轴的范围。

[已编辑] 在下面的示例中,我加载了从 this website 下载的 Cantina 乐队歌曲的 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

关于python - 如何从 python 中的 .wav 文件创建频谱图以解决音频分类问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55312659/

相关文章:

python - 使用scrapy、python提取url的标题

python - 如何从 "i view X"打开使用 "SMI"系统创建的 *.idf 眼动仪数据

audio - 如何将采样率频率除以10个频段以进行均衡

c - 在 C 中安装信号处理程序

matlab - 将输出信号归一化至与输入信号相同的水平

Python 切片 - 跳过一定数量的行

python - 从 Seaborn Boxplot 中提取异常值

c++ - 如何从 Chromium 运行测试代码

java - 尝试播放声音文件

javascript - 如何创建简单的音频播放列表