【问题标题】:Reproduce sox spectrogram in scipy在 scipy 中重现 sox 频谱图
【发布时间】:2019-06-05 08:04:06
【问题描述】:

例如,我有一个带语音的 wav 文件。

我可以用 sox 创建漂亮的频谱图可视化:

wget https://google.github.io/tacotron/publications/tacotron2/demos/romance_gt.wav
sox romance_gt.wav -n spectrogram -o spectrogram.png

如何在 python 中重现这个频谱图?

这里是使用scipy.signal.spectrogram的例子

input_file = 'temp/romance_gt.wav'
fs, x = wavfile.read(input_file)
print('fs', fs)
print('x.shape', x.shape)

f, t, Sxx = signal.spectrogram(x, fs)
print('f.shape', f.shape)
print('t.shape', t.shape)
print('Sxx.shape', Sxx.shape)
plt.pcolormesh(t, f, Sxx)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.savefig('spectrogram_scipy.png')

但是看起来有些参数不好或者有些东西坏了:

【问题讨论】:

    标签: python scipy sox spectrogram


    【解决方案1】:

    注意由 sox 生成的图中颜色条的比例。单位是dBFS:相对于满量程的分贝。要使用 SciPy 和 Matplotlib 重现绘图,您需要缩放值以使最大值为 1,然后取值的对数以转换为 dB。

    这是您脚本的修改版本,其中包括对 spectrogrampcolormesh 的参数进行的各种调整,创建类似于 sox 输出的情节。

    import numpy as np
    from scipy.io import wavfile
    from scipy import signal
    import matplotlib.pyplot as plt
    
    input_file = 'romance_gt.wav'
    fs, x = wavfile.read(input_file)
    print('fs', fs)
    print('x.shape', x.shape)
    
    nperseg = 1025
    noverlap = nperseg - 1
    f, t, Sxx = signal.spectrogram(x, fs,
                                   nperseg=nperseg,
                                   noverlap=noverlap,
                                   window='hann')
    print('f.shape', f.shape)
    print('t.shape', t.shape)
    print('Sxx.shape', Sxx.shape)
    plt.pcolormesh(1000*t, f/1000, 10*np.log10(Sxx/Sxx.max()),
                   vmin=-120, vmax=0, cmap='inferno')
    plt.ylabel('Frequency [kHz]')
    plt.xlabel('Time [ms]')
    plt.colorbar()
    plt.savefig('spectrogram_scipy.png')
    

    我将 Sxx 除以 Sxx.max() 以说明 dBFS 的“全量程”方面。我调整了spectrogramnpersegnoverlap 参数,以在频率和时间轴上提供高于默认值的分辨率。我使用window='hann' 来匹配sox 的默认行为。 (您可以在 http://sox.sourceforge.net/sox.html 找到有关 sox 频谱图的详细信息。)我还在 pcolormesh 中使用了 vmin=-120vmax=0,以匹配 sox 频谱图使用的默认范围。

    剧情如下:

    “inferno”颜色图没有 sox 情节中使用的颜色图那么强烈。请参阅"Choosing Colormaps in Matplotlib" 上的教程以获取替代颜色图。

    【讨论】:

      猜你喜欢
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 2019-01-24
      • 2018-06-13
      • 2019-12-18
      • 1970-01-01
      • 2021-03-25
      相关资源
      最近更新 更多