智能语音技术(三)
梅尔频率倒谱系数(MFCC)是语音信号处理中最常用的特征提取方法之一。
·
智能语音特征提取(MFCC)的Python实现详解
1. MFCC概述
梅尔频率倒谱系数(MFCC)是语音信号处理中最常用的特征提取方法之一。它模拟人耳听觉特性,通过以下步骤实现:
- 预加重
- 分帧加窗
- 傅里叶变换
- 梅尔滤波器组处理
- 对数压缩
- 离散余弦变换(DCT)
2. 核心公式
- 梅尔频率转换公式
fmel=2595log10(1+f700)f_{mel} = 2595 \log_{10}\left(1 + \frac{f}{700}\right)fmel=2595log10(1+700f) - 离散余弦变换(DCT)
ci=2N∑j=1Msjcos(πiM(j−12))c_i = \sqrt{\frac{2}{N}} \sum_{j=1}^{M} s_j \cos\left(\frac{\pi i}{M}\left(j - \frac{1}{2}\right)\right)ci=N2j=1∑Msjcos(Mπi(j−21))
其中 sjs_jsj 是梅尔滤波器组的对数能量输出,MMM 为滤波器数量。
3. Python实现步骤
使用 librosa 库的完整示例:
import librosa
import numpy as np
# 1. 读取音频文件
audio, sr = librosa.load('speech.wav', sr=16000) # 采样率16kHz
# 2. 预加重(增强高频信息)
audio = librosa.effects.preemphasis(audio)
# 3. 分帧与加窗
frame_length = int(0.025 * sr) # 25ms帧长
hop_length = int(0.01 * sr) # 10ms帧移
frames = librosa.util.frame(audio, frame_length, hop_length)
windows = frames * librosa.filters.get_window('hann', frame_length)
# 4. 傅里叶变换(STFT)
stft = np.abs(librosa.stft(audio, n_fft=512))
# 5. 梅尔滤波器组
mel_basis = librosa.filters.mel(sr, n_fft=512, n_mels=40)
mel_energy = np.dot(mel_basis, stft**2)
# 6. 对数压缩
log_mel = librosa.amplitude_to_db(mel_energy, ref=np.max)
# 7. DCT提取MFCC
mfcc = librosa.feature.mfcc(S=log_mel, n_mfcc=13) # 取前13个系数
print("MFCC特征维度:", mfcc.shape) # (13, 帧数)
4. 关键参数说明
| 参数 | 典型值 | 作用 |
|---|---|---|
采样率 (sr) |
16000 Hz | 标准化音频时间分辨率 |
| 帧长 | 25 ms | 平衡时频分辨率 |
| 帧移 | 10 ms | 控制特征序列密度 |
| 梅尔滤波器数量 | 40 | 模拟人耳频带划分 |
| MFCC系数数量 | 13 | 保留主要声道特征 |
5. 可视化特征
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
librosa.display.specshow(mfcc, x_axis='time', sr=sr, hop_length=hop_length)
plt.colorbar(format='%+2.0f dB')
plt.title('MFCC特征图')
plt.tight_layout()
plt.show()
6. 进阶优化
- 动态特征增强:增加一阶差分(Δ\DeltaΔ)和二阶差分(ΔΔ\Delta\DeltaΔΔ)
delta_mfcc = librosa.feature.delta(mfcc) delta2_mfcc = librosa.feature.delta(mfcc, order=2) combined = np.vstack([mfcc, delta_mfcc, delta2_mfcc]) - 能量归一化:
mfcc = (mfcc - np.mean(mfcc)) / np.std(mfcc)
7. 应用场景
- 语音识别(ASR)
- 说话人识别(VPR)
- 情感分析
- 音乐信息检索(MIR)
通过以上实现,MFCC特征可有效表征语音的短时频谱特性,为下游任务提供鲁棒的特征输入。建议结合具体应用场景调整参数(如滤波器数量、DCT系数等)以优化性能。
更多推荐
所有评论(0)