调用librosa.griffinlim触发AttributeError,求Griffin-Lim算法替代方案
解决librosa.griffinlim属性错误的问题
首先明确:Griffin-Lim算法并没有被librosa移除,只是在0.10.0及以后的版本中重构了位置——原来顶层的librosa.griffinlim()函数被迁移到了子模块中,这就是你触发属性错误的核心原因。
正确的调用方式
现在有两种常用的调用途径:
- 直接从核心模块调用:
signal = librosa.core.griffinlim(linear_S) - 先导入子模块的函数再使用:
from librosa.griffinlim import griffinlim signal = griffinlim(linear_S)
你的代码还有几个需要修正的问题
除了函数位置,你的代码里还有几个会导致后续运行错误的细节:
- dB谱不能直接用于Griffin-Lim:
griffinlim()需要的是线性幅度谱,而你用librosa.amplitude_to_db()把谱转成了dB刻度,必须先转回去:linear_S = librosa.db_to_amplitude(D) - cv2读取的频谱图片是三维RGB格式:你读的
CantinaBand60.wav10.jpg是彩色图片,要先转成单通道灰度图,还要把0-255的图片数值范围归一化到 librosa 期望的幅度区间:S = cv2.imread('spectrograms/CantinaBand60.wav10.jpg', cv2.IMREAD_GRAYSCALE) S = S / 255.0 - 缺少soundfile导入:你用了
sf.write但未导入对应的库,需要补充:import soundfile as sf - 采样率设置不合理:352000的采样率远高于常规音频标准(通常是44100、48000),要确认你的原始频谱对应的采样率是否真的这么高,建议先改用常规值测试。
修正后的完整示例代码
import os from matplotlib import pyplot as plt import librosa import librosa.display import IPython.display as ipd import numpy as np import cv2 import soundfile as sf # 读取灰度频谱图并归一化 S = cv2.imread('spectrograms/CantinaBand60.wav10.jpg', cv2.IMREAD_GRAYSCALE) S = S / 255.0 # 将dB刻度的谱转回线性幅度谱(如果图片是从dB谱生成的) linear_S = librosa.db_to_amplitude(S) # 使用正确的Griffin-Lim函数调用 signal = librosa.core.griffinlim(linear_S) # 保存音频,使用常规采样率测试 sf.write('test.wav', signal, 44100)
内容的提问来源于stack exchange,提问作者Harry Logsdon
相关产品推荐
相关产品推荐

