解决Python语音处理中librosa库报错:ValueError: x and y must have same first dimension

在使用librosa库进行语音处理时,可能会遇到以下错误:

Traceback (most recent call last):
  File "D:\graduation_design\test_process.py", line 118, in <module>
    displaySpectrum(sample1, sample2, time1)
  File "D:\graduation_design\test_process.py", line 76, in displaySpectrum
    plt.plot(time1, magnitude2[:len(time1)])  # magnitude spectrum
  File "D:\python\lib\site-packages\matplotlib\pyplot.py", line 2761, in plot
    return gca().plot(
  File "D:\python\lib\site-packages\matplotlib\axes\_axes.py", line 1647, in plot
    lines = [*self._get_lines(*args, data=data, **kwargs)]
  File "D:\python\lib\site-packages\matplotlib\axes\_base.py", line 216, in __call__
    yield from self._plot_args(this, kwargs)
  File "D:\python\lib\site-packages\matplotlib\axes\_base.py", line 342, in _plot_args
    raise ValueError(f"x and y must have same first dimension, but "
ValueError: x and y must have same first dimension, but have shapes (43840,) and (32768,)

这个报错是因为在displaySpectrum函数中,time1是从第一个语音文件中获取的,但是在调用plt.plot函数时,magnitude2的长度是根据第二个语音文件的长度计算的,导致x轴和y轴的长度不一致,从而报错。

可以将time1的长度截取到与magnitude2相同的长度即可解决问题。修改代码如下:

def displaySpectrum(sample1, sample2, time1):  # 显示语音频域谱线
    x1, sr1 = librosa.load(sample1, sr=16000)
    x2, sr2 = librosa.load(sample2, sr=16000)
    print(len(x1), len(x2))
    ft1 = fft(x1)
    ft2 = fft(x2)
    magnitude1 = np.absolute(ft1)[:len(x1) // 2 + 1]
    magnitude2 = np.absolute(ft2)[:len(x2) // 2 + 1]
    frequency1 = np.linspace(0, sr1, len(magnitude1))  # (0, 16000, 121632)
    frequency2 = np.linspace(0, sr2, len(magnitude2))  # (0, 16000, 121632)

    print(len(magnitude1), type(magnitude1), np.max(magnitude1), np.min(magnitude1))
    print(len(frequency1), type(frequency1), np.max(frequency1), np.min(frequency1))
    print(len(magnitude2), type(magnitude2), np.max(magnitude2), np.min(magnitude2))
    print(len(frequency2), type(frequency2), np.max(frequency2), np.min(frequency2))

    # plot spectrum,限定[:40000]
    plt.figure(figsize=(18, 8))
    plt.subplot(211)
    plt.plot(time1[:len(magnitude1)], magnitude1)  # magnitude spectrum
    plt.title("语音信号1频域谱线")
    plt.xlabel("时长(秒)")
    plt.ylabel("幅度")
    plt.subplot(212)
    plt.plot(time1[:len(magnitude2)], magnitude2)  # magnitude spectrum
    # plt.ylim(0, 1000)
    plt.title("语音信号2频域谱线")
    plt.xlabel("时长(秒)")
    plt.ylabel("幅度")
    plt.subplots_adjust(hspace=0.5)  # 调整子图间距
    # plt.savefig("your dir\语音信号频谱图", dpi=600)
    plt.show()

修改后,time1的长度将与magnitude2保持一致,从而解决报错问题。

解决Python语音处理中librosa库报错:ValueError: x and y must have same first dimension

原文地址: https://www.cveoy.top/t/topic/nCEC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录