我正在尝试使用 librosa 从音频文件中提取某些特征,但它不断引发谐波和熵函数的 AttributeError 。我尝试将 python 版本从 3.8 更改为 3.12,反之亦然,但错误仍然存在。
我使用的是librosa版本0.10.1,我在文档中找不到librosa.harmonic()函数。我做错了什么,如何解决这个问题?
这是代码:
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
该函数位于effects子包中。所以你应该导入 librosa.effects 并使用 librosa.effects.harmonic(...)。
https://librosa.org/doc/latest/ generated/librosa.effects.harmonic.html