本项目实现了基于HMM和CNN的语音数字识别系统,用于比较两种不同方法在语音识别任务上的表现。
.
├── data/ # 音频数据目录
├── models/ # 模型保存目录
├── results/ # 实验结果图表
├── cnn_model.py # CNN模型实现
├── hmm_model.py # HMM模型实现
├── evaluation.py # 评估模块
├── main.py # 主程序
└── README.md # 项目说明文档
- Python 3.8+
- TensorFlow 2.x
- librosa
- numpy
- matplotlib
- scikit-learn
- hmmlearn
本项目支持使用GPU加速,特别是CNN模型的训练部分。要启用GPU加速,需要:
- 安装CUDA和cuDNN(如果使用NVIDIA GPU)
- 安装支持GPU的TensorFlow版本:
pip install tensorflow-gpu
-
确保系统已正确配置GPU环境:
- NVIDIA显卡驱动
- CUDA工具包
- cuDNN库
-
验证GPU是否可用:
import tensorflow as tf
print("GPU是否可用:", tf.test.is_gpu_available())
print("GPU设备列表:", tf.config.list_physical_devices('GPU'))
注意:HMM模型的计算主要在CPU上进行,不支持GPU加速。
本项目使用Free Spoken Digit Dataset (FSDD)数据集。数据集准备步骤如下:
- 运行数据下载脚本:
python download_fsdd.py
这将自动:
- 下载FSDD数据集
- 处理音频文件(统一采样率为16kHz)
- 将处理后的数据保存在
data/processed
目录
- 划分训练集和测试集:
python data_split.py
这将:
- 将数据集划分为训练集和测试集
- 确保每个数字在测试集中有足够的样本
- 将划分后的数据保存在
data/train
和data/test
目录
数据集结构:
data/
├── processed/ # 处理后的原始数据
├── train/ # 训练集
│ ├── 0/ # 数字0的样本
│ ├── 1/ # 数字1的样本
│ └── ...
└── test/ # 测试集
├── 0/ # 数字0的样本
├── 1/ # 数字1的样本
└── ...
- 总体识别率:84.00%
- 各数字识别率:
- 数字 0: 100.00%
- 数字 1: 70.00%
- 数字 2: 60.00%
- 数字 3: 80.00%
- 数字 4: 100.00%
- 数字 5: 80.00%
- 数字 6: 100.00%
- 数字 7: 90.00%
- 数字 8: 70.00%
- 数字 9: 90.00%
- 总体识别率:71.00%
- 各数字识别率:
- 数字 0: 100.00%
- 数字 1: 100.00%
- 数字 2: 60.00%
- 数字 3: 100.00%
- 数字 4: 80.00%
- 数字 5: 80.00%
- 数字 6: 100.00%
- 数字 7: 90.00%
- 数字 8: 0.00%
- 数字 9: 0.00%
-
HMM模型表现:
- 总体识别率较高(84.00%)
- 对大多数数字都有较好的识别效果
- 识别率分布较为均匀,没有完全无法识别的数字
- 在数字2的识别上表现最差(60%)
-
CNN模型表现:
- 总体识别率较低(71.00%)
- 对部分数字(0、1、3、6)有很好的识别效果(100%)
- 对数字8和9完全无法识别(0%)
- 识别率分布不均匀,存在明显的两极分化
-
对比分析:
- HMM模型在整体性能上优于CNN模型
- HMM模型表现更稳定,没有完全无法识别的数字
- CNN模型在某些数字上表现优异,但在其他数字上表现较差
- 两种模型在数字2的识别上都存在困难
实验结果的可视化图表保存在results
目录下:
hmm_results.png
:HMM模型的识别结果和混淆矩阵cnn_results.png
:CNN模型的识别结果和混淆矩阵comparison.png
:两种方法的对比图
- 安装依赖:
pip install -r requirements.txt
- 运行实验:
python main.py
- 确保音频数据已正确放置在
data
目录下 - 实验过程中会自动创建
models
和results
目录 - 图表使用中文字体显示,确保系统已安装SimHei字体