feat: first commit
This commit is contained in:
264
feature_extraction_comparison.md
Normal file
264
feature_extraction_comparison.md
Normal file
@@ -0,0 +1,264 @@
|
||||
# 特征提取方法对比分析:论文方法与我们的实现
|
||||
|
||||
## 1. 概述
|
||||
|
||||
本文档对比分析了米兰大学研究团队在论文《Automatic Classification of Cat Vocalizations Emitted in Different Contexts》中使用的特征提取方法与我们猫咪翻译器V2系统中实现的特征提取方法,旨在找出两者之间的异同点,并提出可能的优化方向。
|
||||
|
||||
## 2. 论文中的特征提取方法
|
||||
|
||||
米兰大学研究团队使用了两种主要的特征提取方法:
|
||||
|
||||
### 2.1 梅尔频率倒谱系数 (MFCC)
|
||||
|
||||
论文中的MFCC特征提取流程如下:
|
||||
- 使用23个梅尔滤波器计算滤波器组对数能量
|
||||
- 保留最重要的12个系数,并结合帧能量,形成13维向量
|
||||
- 计算一阶、二阶和三阶导数,并附加到特征向量中
|
||||
- 使用openSMILE工具进行特征提取
|
||||
- 在特征提取前应用基于统计模型的静音消除算法
|
||||
|
||||
### 2.2 时序调制特征 (Temporal Modulation Features)
|
||||
|
||||
论文中的时序调制特征提取流程如下:
|
||||
- 基于傅里叶变换和滤波理论进行调制频率分析
|
||||
- 处理非平稳信号的频谱带的缓慢变化包络,不影响信号的相位或结构
|
||||
- 强调时间调制,同时为影响听者耳蜗的频谱部分分配高频值
|
||||
- 使用公开可用的Modulation Toolbox实现
|
||||
- 模拟人类耳蜗的振动转换为电编码信号的过程
|
||||
- 特别适合处理谐波声音事件
|
||||
|
||||
## 3. 我们系统中的特征提取方法
|
||||
|
||||
我们的猫咪翻译器V2系统使用了以下特征提取方法:
|
||||
|
||||
### 3.1 YAMNet嵌入向量
|
||||
|
||||
- 使用预训练的YAMNet模型提取1024维嵌入向量
|
||||
- 采样率为16kHz,音频分段长度为0.96秒,重叠0.48秒
|
||||
- 基于对数梅尔频谱图的深度学习特征
|
||||
- 能够捕捉更高级别的声学模式和语义信息
|
||||
- 通过迁移学习减少对大量标注数据的依赖
|
||||
|
||||
### 3.2 对数梅尔频谱图特征
|
||||
|
||||
- 使用64个梅尔滤波器
|
||||
- 窗口大小为25ms,步长为10ms
|
||||
- 频率范围为0-8kHz
|
||||
- 应用对数变换增强低能量区域的表示
|
||||
- 作为YAMNet模型的输入,也可直接用于特征提取
|
||||
|
||||
### 3.3 MFCC特征(辅助使用)
|
||||
|
||||
- 使用13个MFCC系数(包括能量)
|
||||
- 计算一阶和二阶导数(delta和delta-delta)
|
||||
- 总共39维特征向量
|
||||
- 使用librosa库实现
|
||||
- 主要用于传统机器学习模型(如SVM和HMM)
|
||||
|
||||
## 4. 两种方法的主要区别
|
||||
|
||||
### 4.1 特征维度和复杂度
|
||||
|
||||
- **论文方法**:MFCC基础特征为13维,加上导数后维度更高;时序调制特征维度取决于实现
|
||||
- **我们的方法**:YAMNet嵌入为1024维,包含更丰富的高级特征信息
|
||||
|
||||
### 4.2 预处理流程
|
||||
|
||||
- **论文方法**:使用基于统计模型的静音消除算法
|
||||
- **我们的方法**:使用能量阈值和零交叉率的组合进行静音检测,更适合实时处理
|
||||
|
||||
### 4.3 特征提取工具
|
||||
|
||||
- **论文方法**:使用openSMILE和Modulation Toolbox
|
||||
- **我们的方法**:使用TensorFlow、librosa和自定义处理流程
|
||||
|
||||
### 4.4 采样率和频率范围
|
||||
|
||||
- **论文方法**:使用8kHz采样率,频率范围0-4kHz
|
||||
- **我们的方法**:使用16kHz采样率,频率范围0-8kHz,能捕捉更多高频信息
|
||||
|
||||
### 4.5 时序建模能力
|
||||
|
||||
- **论文方法**:时序调制特征专门设计用于捕捉时间调制模式
|
||||
- **我们的方法**:YAMNet嵌入隐式包含时序信息,但不如专门的时序调制特征明确
|
||||
|
||||
## 5. 优化建议
|
||||
|
||||
基于上述对比分析,我们提出以下优化建议:
|
||||
|
||||
### 5.1 集成时序调制特征
|
||||
|
||||
将时序调制特征(Temporal Modulation Features)集成到我们的系统中,作为YAMNet嵌入的补充。这可以增强系统对猫叫声时序模式的捕捉能力,特别是对于谐波丰富的猫叫声。
|
||||
|
||||
```python
|
||||
# 时序调制特征提取示例代码
|
||||
def extract_temporal_modulation_features(audio, sr=16000):
|
||||
"""
|
||||
提取时序调制特征
|
||||
|
||||
参数:
|
||||
audio: 音频信号
|
||||
sr: 采样率
|
||||
|
||||
返回:
|
||||
temporal_mod_features: 时序调制特征
|
||||
"""
|
||||
# 实现基于论文中描述的时序调制特征提取
|
||||
# 可以使用Python版本的Modulation Toolbox或自行实现
|
||||
|
||||
# 1. 计算频谱图
|
||||
spec = librosa.stft(audio)
|
||||
|
||||
# 2. 转换为梅尔频谱
|
||||
mel_spec = librosa.feature.melspectrogram(S=np.abs(spec), sr=sr, n_mels=23)
|
||||
|
||||
# 3. 对每个梅尔频带进行调制频率分析
|
||||
mod_features = []
|
||||
for band in range(mel_spec.shape[0]):
|
||||
band_envelope = mel_spec[band, :]
|
||||
# 计算包络的傅里叶变换
|
||||
mod_spectrum = np.abs(np.fft.fft(band_envelope))
|
||||
mod_features.append(mod_spectrum[:mod_spectrum.shape[0]//2])
|
||||
|
||||
# 4. 合并特征
|
||||
temporal_mod_features = np.concatenate(mod_features)
|
||||
|
||||
return temporal_mod_features
|
||||
```
|
||||
|
||||
### 5.2 优化静音检测算法
|
||||
|
||||
采用论文中基于统计模型的静音消除算法,可能比我们当前使用的能量阈值方法更准确。
|
||||
|
||||
```python
|
||||
# 基于统计模型的静音检测算法示例
|
||||
def statistical_silence_detection(audio, sr=16000, frame_length=512, hop_length=256):
|
||||
"""
|
||||
基于统计模型的静音检测
|
||||
|
||||
参数:
|
||||
audio: 音频信号
|
||||
sr: 采样率
|
||||
frame_length: 帧长度
|
||||
hop_length: 帧移
|
||||
|
||||
返回:
|
||||
non_silence_audio: 去除静音后的音频
|
||||
"""
|
||||
# 1. 计算短时能量
|
||||
energy = librosa.feature.rms(y=audio, frame_length=frame_length, hop_length=hop_length)[0]
|
||||
|
||||
# 2. 使用高斯混合模型区分静音和非静音
|
||||
from sklearn.mixture import GaussianMixture
|
||||
gmm = GaussianMixture(n_components=2, random_state=0)
|
||||
energy_reshaped = energy.reshape(-1, 1)
|
||||
gmm.fit(energy_reshaped)
|
||||
|
||||
# 3. 确定静音和非静音类别
|
||||
means = gmm.means_.flatten()
|
||||
silence_idx = np.argmin(means)
|
||||
|
||||
# 4. 获取帧级别的静音/非静音标签
|
||||
frame_labels = gmm.predict(energy_reshaped)
|
||||
non_silence_frames = (frame_labels != silence_idx)
|
||||
|
||||
# 5. 重建非静音音频
|
||||
non_silence_audio = np.zeros_like(audio)
|
||||
for i, is_non_silence in enumerate(non_silence_frames):
|
||||
if is_non_silence:
|
||||
start = i * hop_length
|
||||
end = min(start + frame_length, len(audio))
|
||||
non_silence_audio[start:end] = audio[start:end]
|
||||
|
||||
return non_silence_audio
|
||||
```
|
||||
|
||||
### 5.3 结合MFCC和YAMNet特征
|
||||
|
||||
创建一个混合特征提取器,同时使用MFCC(包括导数)和YAMNet嵌入,可能会提高系统在不同场景下的鲁棒性。
|
||||
|
||||
```python
|
||||
# 混合特征提取器示例
|
||||
def extract_hybrid_features(audio, sr=16000):
|
||||
"""
|
||||
提取混合特征(MFCC + YAMNet嵌入)
|
||||
|
||||
参数:
|
||||
audio: 音频信号
|
||||
sr: 采样率
|
||||
|
||||
返回:
|
||||
hybrid_features: 混合特征
|
||||
"""
|
||||
# 1. 提取MFCC特征
|
||||
mfcc = librosa.feature.mfcc(y=audio, sr=sr, n_mfcc=13)
|
||||
delta_mfcc = librosa.feature.delta(mfcc)
|
||||
delta2_mfcc = librosa.feature.delta(mfcc, order=2)
|
||||
mfcc_features = np.vstack([mfcc, delta_mfcc, delta2_mfcc])
|
||||
|
||||
# 2. 提取YAMNet嵌入
|
||||
yamnet_features = extract_yamnet_embeddings(audio, sr)
|
||||
|
||||
# 3. 合并特征(需要处理时间维度对齐问题)
|
||||
# 这里简化处理,实际应用中需要更复杂的对齐策略
|
||||
mfcc_mean = np.mean(mfcc_features, axis=1)
|
||||
|
||||
# 4. 合并特征
|
||||
hybrid_features = np.concatenate([mfcc_mean, yamnet_features])
|
||||
|
||||
return hybrid_features
|
||||
```
|
||||
|
||||
### 5.4 调整梅尔滤波器数量
|
||||
|
||||
考虑将我们系统中的梅尔滤波器数量从64调整为23(与论文一致),这可能更适合猫叫声的频率特性。
|
||||
|
||||
```python
|
||||
# 调整梅尔滤波器数量
|
||||
def extract_log_mel_spectrogram(audio, sr=16000, n_mels=23):
|
||||
"""
|
||||
提取对数梅尔频谱图特征
|
||||
|
||||
参数:
|
||||
audio: 音频信号
|
||||
sr: 采样率
|
||||
n_mels: 梅尔滤波器数量
|
||||
|
||||
返回:
|
||||
log_mel_spec: 对数梅尔频谱图
|
||||
"""
|
||||
mel_spec = librosa.feature.melspectrogram(y=audio, sr=sr, n_mels=n_mels)
|
||||
log_mel_spec = librosa.power_to_db(mel_spec)
|
||||
|
||||
return log_mel_spec
|
||||
```
|
||||
|
||||
### 5.5 实现DAG-HMM与时序调制特征的结合
|
||||
|
||||
论文中最佳的分类方法是DAG-HMM,我们已经实现了这一方法。考虑将其与时序调制特征结合,可能会进一步提高分类准确率。
|
||||
|
||||
```python
|
||||
# DAG-HMM与时序调制特征结合示例
|
||||
from src.dag_hmm_classifier import DAGHMMClassifier
|
||||
|
||||
# 初始化分类器
|
||||
classifier = DAGHMMClassifier(n_states=5, n_mix=3)
|
||||
|
||||
# 提取时序调制特征
|
||||
temporal_mod_features = extract_temporal_modulation_features(audio, sr)
|
||||
|
||||
# 训练模型
|
||||
classifier.train(temporal_mod_features, labels)
|
||||
|
||||
# 预测
|
||||
prediction = classifier.predict(new_temporal_mod_features)
|
||||
```
|
||||
|
||||
## 6. 结论
|
||||
|
||||
米兰大学研究团队的特征提取方法与我们的实现各有优势:
|
||||
|
||||
- 论文方法更专注于捕捉猫叫声的时序调制特征,这对于区分不同情境下的猫叫声非常有效
|
||||
- 我们的方法利用深度学习和迁移学习,能够提取更高级别的声学特征,减少对大量标注数据的依赖
|
||||
|
||||
通过结合两种方法的优势,特别是集成时序调制特征和优化静音检测算法,我们可以进一步提高猫咪翻译器的准确率和鲁棒性。建议在下一版本中实施上述优化建议,并进行对比实验,验证其效果。
|
||||
Reference in New Issue
Block a user