You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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)
    

你的代码还有几个需要修正的问题

除了函数位置,你的代码里还有几个会导致后续运行错误的细节:

  1. dB谱不能直接用于Griffin-Lim:griffinlim()需要的是线性幅度谱,而你用librosa.amplitude_to_db()把谱转成了dB刻度,必须先转回去:
    linear_S = librosa.db_to_amplitude(D)
    
  2. cv2读取的频谱图片是三维RGB格式:你读的CantinaBand60.wav10.jpg是彩色图片,要先转成单通道灰度图,还要把0-255的图片数值范围归一化到 librosa 期望的幅度区间:
    S = cv2.imread('spectrograms/CantinaBand60.wav10.jpg', cv2.IMREAD_GRAYSCALE)
    S = S / 255.0
    
  3. 缺少soundfile导入:你用了sf.write但未导入对应的库,需要补充:
    import soundfile as sf
    
  4. 采样率设置不合理: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:07:56