【问题标题】:Audio spectrum extraction from audio file by python通过python从音频文件中提取音频频谱
【发布时间】:2014-08-14 11:47:31
【问题描述】:

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

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

我将不胜感激任何建议和建议。

【问题讨论】:

    标签: python audio beat-detection


    【解决方案1】:

    您可以使用 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。

    干杯

    【讨论】:

    • 感谢脚本!只需在顶部添加“import numpy as np”即​​可使其工作。
    【解决方案2】:

    我认为您的问题分为三个不同的部分:

    1. 如何将音频文件加载到 python 中?
    2. 如何在 python 中计算频谱?
    3. 如何处理光谱?

    1.如何在 python 中加载音频文件?

    您最好使用scipy,因为它提供了很多信号处理功能。加载音频文件:

    import scipy.io.wavfile
    
    samplerate, data = scipy.io.wavfile.read("mywav.wav")
    

    现在您在samplerate 中获得了采样率(samples/s),在data 中获得了numpy.array 中的数据。您可能希望将数据转换为浮点数,具体取决于您的应用程序。

    还有一个标准的python模块wave用于加载wav文件,但numpy/scipy提供了更简单的接口和更多的信号处理选项。

    2。如何计算频谱

    简单回答:使用 FFT。更多智慧之言,请参见:

    Analyze audio using Fast Fourier Transform

    较长的答案很长。开窗非常重要,否则会出现奇怪的光谱。

    3.如何处理频谱

    这有点困难。对于较长的信号,通常在时域中执行滤波。也许如果你告诉我们你想要完成什么,你会收到一个很好的答案。计算频谱是一回事,用它在信号处理中得到有意义的结果有点复杂。

    (我知道你没有问这个,但我认为它的概率>> 0。当然,可能是你对音频信号处理有很好的了解,在这种情况下,这无关紧要。)

    【讨论】:

    • 谢谢,这真的很有帮助。我计划使用 scikit-learn 或 PyBrain 编写一个软件,它将分析音频文件并尝试确定它属于哪个音乐流派。
    • 迟到了,但考虑到你的目标(编写一个库来分类音乐流派),你可以看看这个github.com/tyiannak/pyAudioAnalysis
    猜你喜欢
    • 1970-01-01
    • 2012-07-10
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多