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

使用Librosa时无法调用harmonic与rp_entropy函数的问题求助

问题:Librosa调用harmonic和rp_entropy触发AttributeError

使用Librosa 0.10.1提取音频特征时,调用librosa.harmonic()和librosa.feature.rp_entropy()持续触发AttributeError,切换Python 3.8-3.12版本仍未解决,且官方文档中找不到这两个函数。

原代码

import librosa
import numpy as np
from python_speech_features import mfcc, logfbank

def extract_audio_features(audio_file):
    # Load the audio file
    y, sr = librosa.load(audio_file)

    # Extract MDVP features
    f0, _, _ = librosa.pyin(y, fmin=librosa.note_to_hz('C2'), fmax=librosa.note_to_hz('C7'))
    mdvp_fo = np.mean(f0)  # Average vocal fundamental frequency
    mdvp_fhi = np.max(f0)  # Maximum vocal fundamental frequency
    mdvp_flo = np.min(f0)  # Minimum vocal fundamental frequency

    # Extract jitter and shimmer features
    jitter = np.mean(np.abs(np.diff(f0)) / f0[:-1])
    shimmer = np.mean(np.abs(np.diff(y)) / y[:-1])

    # Extract noise-to-tonal ratio features
    y_harmonic, y_non_harmonic = librosa.harmonic(y, f0)
    nhr = np.sum(y_non_harmonic ** 2) / np.sum(y ** 2)
    hnr = np.sum(y_harmonic ** 2) / np.sum(y ** 2)

    # Extract nonlinear dynamical complexity measures
    rpde = librosa.feature.rp_entropy(y)
    d2 = librosa.feature.delta(y)

    # Extract signal fractal scaling exponent
    dfa = librosa.feature.fractal_dimension(y, stride=512)

    # Extract nonlinear measures of fundamental frequency variation
    mfccs = mfcc(y, sr, nfft=1024)
    spread1 = np.mean(np.diff(mfccs, axis=0))
    spread2 = np.std(np.diff(mfccs, axis=0))
    ppe = np.mean(np.diff(mfccs, axis=0) ** 2)

    # Create a dictionary containing all the extracted features
    features = {
        'mdvp_fo': mdvp_fo,
        'mdvp_fhi': mdvp_fhi,
        'mdvp_flo': mdvp_flo,
        'jitter': jitter,
        'shimmer': shimmer,
        'nhr': nhr,
        'hnr': hnr,
        'rpde': rpde,
        'd2': d2,
        'dfa': dfa,
        'spread1': spread1,
        'spread2': spread2,
        'ppe': ppe
    }

    return features

# Example usage
audio_file = 'songwithvocals.mp3'
features_dict = extract_audio_features(audio_file)
print(features_dict)

报错信息

Traceback (most recent call last):
  File "C:\Users\OneDrive\Desktop\python\geminiapi\liibrosaa_audio.py", line 58, in <module>
    features_dict = extract_audio_features(audio_file)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\OneDrive\Desktop\python\geminiapi\liibrosaa_audio.py", line 20, in extract_audio_features
    y_harmonic, y_non_harmonic = librosa.harmonic(y, f0)
                                 ^^^^^^^^^^^^^^^^
  File "C:\Users\OneDrive\Desktop\python\geminiapi\env\Lib\site-packages\lazy_loader\__init__.py", line 94, in __getattr__
    raise AttributeError(f"No {package_name} attribute {name}")
AttributeError: No librosa attribute harmonic

错误原因与修复方案

1. librosa.harmonic() 函数不存在

Librosa中没有顶级的harmonic()函数,正确的谐波分离函数是librosa.effects.harmonic(),且该函数不需要传入f0参数(它基于频谱分解提取谐波成分)。如果需要基于f0的谐波分离,可结合librosa.separate.hpss()与f0掩码实现,或直接用基础方法计算HNR/NHR。

2. librosa.feature.rp_entropy() 函数不存在

Librosa原生不提供递归排列熵(RPDE)计算,需自行实现或使用第三方库(如pyentrp)。

3. 其他函数调用错误

  • librosa.feature.delta(y):delta函数用于计算特征序列的差分,不能直接传入原始音频信号y,需传入MFCC、梅尔频谱等特征矩阵。
  • librosa.feature.fractal_dimension():Librosa无此函数,分形维度需自行实现或使用nolds等专业库。

修正后的代码示例

import librosa
import numpy as np
from python_speech_features import mfcc
from pyentrp import entropy as ent  # 需先安装:pip install pyentrp

def extract_audio_features(audio_file):
    y, sr = librosa.load(audio_file)

    # 提取MDVP特征:先过滤f0中的NaN值
    f0, _, _ = librosa.pyin(y, fmin=librosa.note_to_hz('C2'), fmax=librosa.note_to_hz('C7'))
    f0_clean = f0[~np.isnan(f0)]
    mdvp_fo = np.mean(f0_clean)
    mdvp_fhi = np.max(f0_clean)
    mdvp_flo = np.min(f0_clean)

    # 提取Jitter
    jitter = np.mean(np.abs(np.diff(f0_clean)) / f0_clean[:-1])
    # 修正Shimmer计算:基于振幅包络
    amplitude_envelope = librosa.amplitude_to_db(np.abs(librosa.stft(y)), ref=np.max)
    shimmer = np.mean(np.abs(np.diff(amplitude_envelope, axis=1)) / amplitude_envelope[:, :-1])

    # 谐波分离与HNR/NHR计算
    y_harmonic = librosa.effects.harmonic(y)
    y_non_harmonic = y - y_harmonic
    nhr = np.sum(y_non_harmonic ** 2) / np.sum(y ** 2)
    hnr = np.sum(y_harmonic ** 2) / np.sum(y ** 2)

    # 计算RPDE(使用pyentrp库)
    rpde = ent.sample_entropy(f0_clean, dimension=2, tolerance=0.2*np.std(f0_clean))

    # 修正delta计算:基于MFCC特征
    mfccs = mfcc(y, sr, nfft=1024)
    d2 = librosa.feature.delta(mfccs)
    d2_mean = np.mean(d2)  # 转为标量存入特征字典

    # 实现简单DFA计算(或使用nolds库)
    def dfa(x, stride=512):
        cumulative = np.cumsum(x - np.mean(x))
        segments = np.array_split(cumulative, len(cumulative)//stride)
        slopes = []
        for seg in segments:
            t = np.arange(len(seg))
            coeff = np.polyfit(t, seg, 1)
            slopes.append(coeff[0])
        return np.mean(slopes)
    dfa_val = dfa(y, stride=512)

    # 提取MFCC相关特征
    spread1 = np.mean(np.diff(mfccs, axis=0))
    spread2 = np.std(np.diff(mfccs, axis=0))
    ppe = np.mean(np.diff(mfccs, axis=0) ** 2)

    features = {
        'mdvp_fo': mdvp_fo,
        'mdvp_fhi': mdvp_fhi,
        'mdvp_flo': mdvp_flo,
        'jitter': jitter,
        'shimmer': shimmer,
        'nhr': nhr,
        'hnr': hnr,
        'rpde': rpde,
        'd2': d2_mean,
        'dfa': dfa_val,
        'spread1': spread1,
        'spread2': spread2,
        'ppe': ppe
    }

    return features

# 示例使用
audio_file = 'songwithvocals.mp3'
features_dict = extract_audio_features(audio_file)
print(features_dict)

额外注意事项

  • 安装缺失依赖:pip install pyentrp(用于RPDE)、pip install nolds(若需专业DFA计算)。
  • 原代码中f0存在NaN值,必须过滤后再计算统计量,避免报错。
  • Shimmer的计算方式修正为基于振幅包络,更符合声学定义。

内容的提问来源于stack exchange,提问作者kevinrotern

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:08:13