音频特征提取异常求助:帕金森病声音检测数值不符
帕金森病声音特征提取修正方案
核心问题排查方向
- 特征单位不匹配:比如Jitter/Shimmer常存在绝对值与百分比的差异,数据集大概率采用百分比形式
- 音频预处理缺失:未统一采样率、转换单声道、去除静音段,导致原始音频数据与数据集基准不一致
- 非线性特征参数偏差:RPDE/DFA/D2等特征的计算窗口、嵌入维度等参数未对齐数据集采用的标准
修正后的特征提取代码
import librosa import numpy as np from pyAudioAnalysis import audioBasicIO as aIO from pyAudioAnalysis import audioFeatureExtraction as aF def extract_parkinson_features(audio_path): # 标准化音频预处理 [Fs, x] = aIO.read_audio_file(audio_path) x = aIO.stereo_to_mono(x) # 去除静音段(匹配数据集预处理逻辑,阈值可调整) x = aF.remove_silence(x, Fs, 0.02, 0.02)[0] # 频率特征:MDVP:Fo(Hz), Fhi(Hz), Flo(Hz) f0, _, _ = librosa.pyin(x, fmin=80, fmax=600, sr=Fs) # 限定帕金森患者发声频率范围提升精度 fo = np.nanmean(f0) fhi = np.nanmax(f0) flo = np.nanmin(f0) # 声音变异特征:Jitter(%), Shimmer(%) features, _ = aF.stFeatureExtraction(x, Fs, 0.05*Fs, 0.025*Fs) jitter = features[1] * 100 # 转换为百分比,对齐数据集单位 shimmer = features[9] * 100 # 噪声谐波比:NHR, HNR nhr = features[13] # 用librosa计算标准HNR,替代工具默认实现 harmonic = librosa.effects.harmonic(x, margin=8) hnr = np.mean(librosa.amplitude_to_db(np.abs(librosa.stft(harmonic))) - librosa.amplitude_to_db(np.abs(librosa.stft(x - harmonic)))) # 非线性特征:RPDE, DFA, spread1, spread2, D2, PPE rpde = aF.feature_rpde(x, Fs, 0.2, 0.2, 100)[0] dfa = aF.feature_dfa(x)[0] spread1, spread2 = aF.feature_spread(x, Fs, 0.2, 0.2) d2 = aF.feature_correlation_dimension(x, Fs, 0.2, 0.2, 100)[0] ppe = aF.feature_ppe(x, Fs, 0.2, 0.2)[0] # 按指定顺序输出特征数组 return np.array([fo, fhi, flo, jitter, shimmer, nhr, hnr, rpde, dfa, spread1, spread2, d2, ppe]) # 测试示例 test_audio = "sample_parkinson.wav" extracted_features = extract_parkinson_features(test_audio) print(extracted_features)
校准与验证步骤
- 基准对比:选取数据集中带标注的音频文件,用上述代码提取特征,逐维度对比数据集的标注值
- 参数微调:若某特征差异明显,单独调整对应计算参数(比如F0检测的频率范围、静音段阈值)
- 归一化对齐:采用数据集训练集的均值和标准差做归一化,而非单样本归一化,公式为:
normalized_feature = (feature - train_mean) / train_std
内容的提问来源于stack exchange,提问作者Mina Emad
相关产品推荐
相关产品推荐

