11 语音识别 LSTM-CTC
本章内容是通过 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 测试
说明
TIMIT 数据准备
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
关于 rnn_type
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)
log 目录内容
- *.pkl: 保存的模型数据 在 model.py (line 132) 查看 save_package 函数
- train.log: 训练时打印的内容都存在 train.log 中
实验结果
将字符作为标签训练 CTC 的声学模型在 TIMIT 上测试集的识别率为:
- Greedy decoder: 61.4831%
- Beam decoder : 62.1029%
本章内容只是构建了一个简单的声学模型,能够真正识别相差甚远,相比于 kaldi 中复杂的流程。项目内容还是能够对语音识别任务有一个初步的认识。
参考文献
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论