使用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
相关产品推荐
相关产品推荐

