本章内容是通过pytorch搭建一个LSTM-CTC的语音识别声学模型。
本次实验的数据为TIMIT数据集(可点击academictorrents 或者 luojie1987/TIMIT 下载数据集)。
还有很多其他公开的语音相关的数据库可以在这里下载Open Speech and Language Resources
本项目的内容大多参考项目https://github.com/Diamondfan/CTC_pytorch/
- 安装PyTorch
- 安装百度的Warp-CTC并于pytorch绑定,具体参见
https://github.com/SeanNaren/warp-ctc/tree/pytorch_bindings/pytorch_binding - 安装pytorch audio:
sudo apt-get install sox libsox-dev libsox-fmt-all
git clone https://github.com/pytorch/audio.git
cd audio
pip install cffi
python setup.py install
- 安装第三方依赖
pip install -r requirements.txt
- 启动visdom
python -m visdom.serber
1、打开顶层脚本run.sh,修改相应的文件路径(TIMIT_dir, CONF_FILE)。
2、打开conf目录下的ctc_model_setting.conf进行网络结构等各项设置。
3、运行顶层脚本,后面带有一个参数stage,0表示从数据开始运行,1表示从训练开始,2表示直接测试
- bash run.sh 0 数据处理 + 训练 + 测试
- bash run.sh 1 训练 + 测试
- bash run.sh 2 测试
conf目录下的test_spk.list和dev_spk.list是音素识别中的常用验证集和测试集,使用这两个文件选取数据集。
执行数据处理脚本获取数据路径和转写标签:
bash timit_data_prep.sh timit_dir
执行完成后,在datap_repare目录下会生成wav.scp文件和text文件分别为音频的路径和音频的转写即文本标签.
- train_wav.scp train.text > 3696 sentences
- dev_wav.scp dev.text > 400 sentences
- test_wav.scp test.text > 192 snetences
ctc_model_setting.conf中的rnn_type可以选择的RNN类型为
- lstm : nn.LSTM
- rnn : nn.RNN
- gru : nn.GRU
本项目的输出建模单元选择的是字符,即"abcdefghijklmnopqrstuvwxyz'" + " ",空格space也当做一个输出标签。所以总共28 + 1 = 29类。
加的1类为CTC中的空白类,表示该时刻的语音输出为噪声或者没有意义。在model.py中已经加了1,所以配置文件中填入正常的标签类别即可。
选择字符作为标签在小数据集上并不能得到很好的结果,比如在timit上仅有62%左右的正确率。实验发现采用音素作为输出的建模单元更为有效。
默认修改8次学习率停止训练,每次学习率降低一半。可以根据需要修改train.py(line 274)
- *.pkl: 保存的模型数据 在model.py(line 132)查看save_package函数
- train.log: 训练时打印的内容都存在train.log中
将字符作为标签训练CTC的声学模型在TIMIT上测试集的识别率为:
- Greedy decoder: 61.4831%
- Beam decoder : 62.1029%
本章内容只是构建了一个简单的声学模型,能够真正识别相差甚远,相比于kaldi中复杂的流程。项目内容还是能够对语音识别任务有一个初步的认识。