python从音频文件中提取音频频谱

抱歉,如果我提交了副本,但是我想知道python中是否有任何lib使您能够从音频文件中提取声谱。我希望能够获取音频文件并编写算法,该算法将返回一组数据{TimeStampInFile;

频率幅度}。

我听说这通常称为节拍检测,但是据我所知,节拍检测不是一种精确的方法,它仅对可视化有用,而我想对提取的数据进行处理,然后将其转换回音频文件。我不需要实时执行此操作。

我将不胜感激任何建议。

回答:

您可以使用scipy计算并可视化频谱和频谱图,对于此测试,我使用了以下音频文件:vignesh.wav

from scipy.io import wavfile # scipy library to read wav files

import numpy as np

AudioName = "vignesh.wav" # Audio File

fs, Audiodata = wavfile.read(AudioName)

# Plot the audio signal in time

import matplotlib.pyplot as plt

plt.plot(Audiodata)

plt.title('Audio signal in time',size=16)

# spectrum

from scipy.fftpack import fft # fourier transform

n = len(Audiodata)

AudioFreq = fft(Audiodata)

AudioFreq = AudioFreq[0:int(np.ceil((n+1)/2.0))] #Half of the spectrum

MagFreq = np.abs(AudioFreq) # Magnitude

MagFreq = MagFreq / float(n)

# power spectrum

MagFreq = MagFreq**2

if n % 2 > 0: # ffte odd

MagFreq[1:len(MagFreq)] = MagFreq[1:len(MagFreq)] * 2

else:# fft even

MagFreq[1:len(MagFreq) -1] = MagFreq[1:len(MagFreq) - 1] * 2

plt.figure()

freqAxis = np.arange(0,int(np.ceil((n+1)/2.0)), 1.0) * (fs / n);

plt.plot(freqAxis/1000.0, 10*np.log10(MagFreq)) #Power spectrum

plt.xlabel('Frequency (kHz)'); plt.ylabel('Power spectrum (dB)');

#Spectrogram

from scipy import signal

N = 512 #Number of point in the fft

f, t, Sxx = signal.spectrogram(Audiodata, fs,window = signal.blackman(N),nfft=N)

plt.figure()

plt.pcolormesh(t, f,10*np.log10(Sxx)) # dB spectrogram

#plt.pcolormesh(t, f,Sxx) # Lineal spectrogram

plt.ylabel('Frequency [Hz]')

plt.xlabel('Time [seg]')

plt.title('Spectrogram with scipy.signal',size=16);

plt.show()

我测试了所有代码,它可以工作,您需要numpy,matplotlib和scipy。

干杯

以上是 python从音频文件中提取音频频谱 的全部内容, 来源链接: utcz.com/qa/410331.html

回到顶部