🎤 DSP 项目4 说明 - DTW孤立词语音识别

📁 项目结构

Project4_DTW/
├── 📂 train/              # 训练音频 (生成模板用)
│   ├── zero-1.wav ... zero-25.wav
│   ├── one-1.wav  ... one-25.wav
│   └── ...
├── 📂 test/               # 测试音频
│   ├── 0.wav, 1.wav, ..., 9.wav
├── train_template.m       # ⭐ 模板训练程序 (生成template.mat)
├── template.mat           # 模板库 (运行train_template后生成)
├── extract_label.m        # 辅助函数 (标签提取)
├── ex0_all.m              # 主程序 (批量识别)
├── ex1_preemphasis.m      # 预加重滤波器 需修改
├── ex2_enframe.m          # 分帧函数 需修改
├── ex3_mfcc.m             # MFCC特征提取 需修改
├── ex4_dtw.m              # DTW距离计算 需修改
├── ex5_recognize.m        # 识别决策 已完成
├── ex6_vad.m              # 端点检测 已完成
└── test_Project4.p        # 自动评测程序

🚀 实验流程

1. 完成ex1-ex4 2. 运行train_template 3. 运行ex0_all测试 4. 运行test_Project4
⚠️ 重要:必须先运行 train_template.m 生成 template.mat,否则识别程序无法运行!

📝 函数说明

1️⃣ train_template.m - 模板训练 已完成

功能:train/ 目录读取训练音频,使用中心样本法生成模板。

>> train_template   % 生成 template.mat

2️⃣ ex1_preemphasis.m - 预加重 需修改

参数类型说明
x输入原始语音信号
alpha输入预加重系数,默认0.97
y输出预加重后的信号
💡 提示:使用 filter([1, -alpha], 1, x) 实现高通滤波

3️⃣ ex2_enframe.m - 分帧 需修改

参数类型说明
x输入语音信号
frame_len输入帧长(样本点数)
frame_shift输入帧移(样本点数)
frames输出帧矩阵 [frame_len × num_frames]
💡 关键公式:num_frames = floor((N - frame_len) / frame_shift) + 1

4️⃣ ex3_mfcc.m - MFCC特征提取 需修改

参数类型说明
x输入语音信号
fs输入采样率
mfcc_all输出36维特征 (12 MFCC + 12 Δ + 12 ΔΔ)

5️⃣ ex4_dtw.m - DTW距离计算 需修改

参数类型说明
template输入模板特征 [dim × n]
test输入测试特征 [dim × m]
dist输出DTW距离
🔬 递推公式:D(i,j) = d(i,j) + min{D(i-1,j), D(i,j-1), D(i-1,j-1)}

📊 关于识别率

测试场景预期识别率原因
使用 test/ 目录10-30%不同说话人/录音环境
使用 train/ 目录70-90%同源数据
💡 说明:DTW是说话人相关的方法。test目录识别率低是正常现象,体现了DTW的固有局限性。可修改 ex0_all.m 中的 audio_dir = 'train' 进行对比测试。

✅ 检查清单


📞 常见问题

Q1: 提示"找不到template.mat"?

A: 请先运行 train_template.m 生成模板文件。

Q2: test目录识别率只有10-30%,正常吗?

A: 完全正常!这体现了DTW的说话人相关性。请用train目录测试验证代码正确性。

Q3: DTW距离为Inf?

A: 检查D矩阵初始化,确保 D(1,1)=0,其余边界为Inf。


祝实验顺利! 🎤🎉