音频特征提取是从原始音频信号中提取具有代表性数值特征的过程,这些特征能够反映音频的声学属性,为后续的音频分析、分类、识别等任务提供数据支撑。Python生态中的librosa库是音频处理领域的常用工具,内置了大量成熟的音频特征计算算法,使用起来简单高效。

环境准备
首先需要安装librosa库以及其依赖的音频处理相关库,使用pip命令即可完成安装:
# 安装librosa库 pip install librosa # 安装音频读取依赖库 pip install soundfile
安装完成后,就可以在Python脚本中导入相关模块开始使用。
librosa基础音频读取
提取特征前需要先读取音频文件,librosa提供了load函数来完成音频加载,该函数会自动将音频重采样为默认22050Hz的采样率,同时返回音频时间序列和采样率。
import librosa
import librosa.display
import numpy as np
# 读取音频文件,替换为你的音频路径
audio_path = "test_audio.wav"
# y是音频时间序列,sr是采样率
y, sr = librosa.load(audio_path)
print(f"音频采样率: {sr}")
print(f"音频时长: {len(y)/sr:.2f}秒")
常用音频特征提取方法
1. 梅尔频率倒谱系数(MFCC)
MFCC是最常用的音频特征之一,模拟了人耳的听觉特性,在语音识别、音乐流派分类等场景中应用广泛。librosa的mfcc函数可以直接计算MFCC特征。
# 计算13维MFCC特征
mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
print(f"MFCC特征形状: {mfccs.shape}")
# 对MFCC特征做均值统计,得到固定长度的特征向量
mfcc_mean = np.mean(mfccs, axis=1)
print(f"MFCC均值特征: {mfcc_mean}")
2. 频谱质心
频谱质心反映了音频信号的频谱能量集中位置,和声音的明亮度相关,计算方式如下:
# 计算频谱质心
spectral_centroid = librosa.feature.spectral_centroid(y=y, sr=sr)
print(f"频谱质心形状: {spectral_centroid.shape}")
# 取均值作为最终特征
centroid_mean = np.mean(spectral_centroid)
print(f"频谱质心均值: {centroid_mean:.2f}")
3. 过零率
过零率是指音频信号穿越零值的次数,常用于区分清音和浊音,计算代码如下:
# 计算过零率
zero_crossing_rate = librosa.feature.zero_crossing_rate(y)
print(f"过零率形状: {zero_crossing_rate.shape}")
zcr_mean = np.mean(zero_crossing_rate)
print(f"过零率均值: {zcr_mean:.4f}")
4. 色度特征
色度特征反映了音频的谐波内容,和音乐的音高相关,适合用于音乐分析场景。
# 计算色度特征
chroma = librosa.feature.chroma_stft(y=y, sr=sr)
print(f"色度特征形状: {chroma.shape}")
chroma_mean = np.mean(chroma, axis=1)
print(f"色度均值特征: {chroma_mean}")
特征整合与保存
实际项目中通常会将多个特征整合为一个固定长度的特征向量,方便后续输入到机器学习模型中。以下是整合多个特征的示例:
def extract_audio_features(audio_path):
# 读取音频
y, sr = librosa.load(audio_path)
features = []
# 提取MFCC均值
mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
features.extend(np.mean(mfccs, axis=1))
# 提取频谱质心均值
centroid = librosa.feature.spectral_centroid(y=y, sr=sr)
features.append(np.mean(centroid))
# 提取过零率均值
zcr = librosa.feature.zero_crossing_rate(y)
features.append(np.mean(zcr))
# 提取色度均值
chroma = librosa.feature.chroma_stft(y=y, sr=sr)
features.extend(np.mean(chroma, axis=1))
return np.array(features)
# 测试特征提取
feature_vector = extract_audio_features("test_audio.wav")
print(f"最终特征向量长度: {len(feature_vector)}")
print(f"特征向量内容: {feature_vector}")
注意事项
- 不同音频的时长可能不同,提取特征时建议对时域特征做统计量统计,保证输出特征长度一致。
- librosa默认会对音频做单声道转换,如果是多通道音频需要提前处理。
- 如果音频采样率和默认采样率差异较大,可以在
load函数中指定sr参数调整采样率。