请求实现指定流程的44.1kHz/16位单声道音频特征提取
Python实现音频特征提取方案
依赖安装
pip install librosa numpy
完整代码实现
import numpy as np import librosa def process_audio(input_path): # 1. 加载单声道44.1kHz WAV文件 # 自动将16位整数样本转换为[-1, 1]范围的浮点数 y, sr = librosa.load(input_path, sr=44100, mono=True) # 2. 归一化处理(确保振幅严格落在[-1, 1]区间) y_normalized = librosa.util.normalize(y) # 3. 开头填充0.25秒静音 silence_samples = int(0.25 * sr) y_padded = np.concatenate([np.zeros(silence_samples), y_normalized]) # 4. 计算对数功率谱 n_fft = 2048 # 指定窗口大小 hop_length = int(sr / 100) # 100Hz帧率对应步长 # 计算短时傅里叶变换 stft = librosa.stft(y_padded, n_fft=n_fft, hop_length=hop_length, window='hann') # 转换为功率谱(幅度平方) power_spec = np.abs(stft) ** 2 # 对数转换,添加小值避免log(0)报错 log_power_spec = np.log10(power_spec + 1e-10) # 5. 创建对数刻度三角滤波器组 # 覆盖20Hz-20000Hz,生成84个三角滤波器(每八度12个) mel_filters = librosa.filters.mel( sr=sr, n_fft=n_fft, fmin=20, fmax=20000, n_mels=84 ) # 6. 滤波得到最终特征 final_features = np.dot(mel_filters, power_spec) # 再次对数转换,匹配听觉特性 final_log_features = np.log10(final_features + 1e-10) return final_log_features, sr # 示例调用 if __name__ == "__main__": features, sr = process_audio("input.wav") # 保存特征到本地 np.save("audio_features.npy", features) print(f"处理完成,特征形状:{features.shape}") print(f"帧率:100Hz,频率bin数量:84")
关键步骤说明
- 归一化:
librosa.util.normalize统一音频振幅范围,消除不同输入的音量差异。 - 静音填充:计算0.25秒对应的样本数(11025),在音频头部拼接全零数组,避免起始点检测出现在文件最前端。
- STFT参数:窗口大小2048,步长441(44100/100),确保每10ms输出一帧特征,符合100Hz帧率要求。
- 三角滤波器组:
librosa.filters.mel生成的滤波器为三角形状,基于mel尺度(近似对数频率刻度),刚好满足每八度12个滤波器的要求(84个bin对应7个八度,完整覆盖20Hz-20000Hz)。 - 对数转换:添加
1e-10避免数值错误,同时将功率谱转换为对数刻度,贴合人耳听觉感知规律。
输出验证
- 特征形状为
(84, N),其中N为总帧数,计算公式为N = (len(y_padded) - n_fft) // hop_length + 1,完全匹配100Hz帧率。 - 可通过以下代码可视化特征:
import matplotlib.pyplot as plt librosa.display.specshow(final_log_features, sr=sr, hop_length=hop_length, x_axis='time', y_axis='mel', fmin=20, fmax=20000) plt.colorbar(format='%+2.0f dB') plt.title('Log Mel Spectrogram') plt.show()
内容的提问来源于stack exchange,提问作者Rolando
相关产品推荐
相关产品推荐

