音素提取是语音识别中的一块重要内容。
G2P(Grapheme-to-Phoneme),英文意思是字素到音素,使用循环神经网络(recurrent neural network,RNN) 和LSTM( long short-termmemory units),来实现从英文单词到音素的转化。LSTM序列到序列模型(LSTM sequence-to-sequencemodel)已经被成功地应用到许多项目中,这些应用包括机器翻译,字素转因素等等。
Github上的G2P是基于Google开源深度学习系统TensorFlow实现的,所以在运行之前要先安装TensorFLow。
一、TensorFlow安装
安装TensorFLow的方法有很多种,可以用Pip、Virtualenv、Anaconda、Docker以及从源代码安装。这里选择 Virtualenv,因为使用 Virtualenv可以将Tensorflow所需要的各种依赖安装到指定的文件夹中,而不改变系统中原有的各种库的版本。
使用 Virtualenv安装分为一下几步:
1、安装Pip 和 Virtualenv:
$ sudo apt-get installpython-pip python-dev python-virtualenv
2、设定Virtualenv工作的文件夹为~/tensorflow:
$ virtualenv--system-site-packages ~/tensorflow
3、激活工作环境,然后使用Pip将TensorFLow安装在~/tensorflow中:
$source ~/tensorflow/bin/activate
(tensorflow)$ #命令行变成了这样
#使用Pip安装,这里安装只使用CPU的版本
(tensorflow)$pip install –upgrade https://storage.Googleapis.com\
/tensorflow/linux/cpu/tensorflow-0.8.0-cp27-none-\ linux_x86_64.whl
此时出现了问题:
OSError:[Errno 2] 没有那个文件或目录:'/usr/local/lib/python2.7/dist-packages/setuptools-18.1-py2.7.egg'
解决方法,卸载已经有的setuptools:
pip uninstall setuptools
再安装一下,成功:
(tensorflow)$pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl
安装TensorFlow之后,又出现问题:
importtensorflow 后,出现段错误segment fault
解决方法:
(1)卸载一些python库:
sudo pip uninstall six wheel numpy scipysckit-image scikit-learn protobuf
(2)重新安装:
(tensorflow)$pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl
(3)成功:
>>>import tensorflow
>>>
二、下面是G2P的运行方式:
1、在github上下载G2P文件:
https://github.com/cmusphinx/g2p-seq2seq
在sourceforge上下载一个已经训练好的模型:
https://sourceforge.net/projects/cmusphinx/files/G2PModels/g2p-seq2seq-cmudict.tar.gz/download
2、运行G2P最简单的方式是使用命令行进行交互的方式:
$: pythong2p.py --interactive --model ~/Work/g2p-seq2seq-cmudict
其中~/Work/g2p-seq2seq-cmudict是上一步下载的已经训练好的模型文件所在路径。
测试:
4、训练G2P模型
训练G2P模型需要一个人工标注的字典:
字典可以从这里下载:https://sourceforge.net/projects/cmusphinx/files/G2P%20Models/phonetisaurus-cmudict-split.tar.gz
下载并解压后,里面有个名字为cmudict.dic.train的文件,这个就是我们需要的字典,里面有大概11万个单词,每一行放置一个单词及其对应的因素。具体如下图:
然后根据这个字典就可以训练模型了,用法如下:
$:python g2p.py --train train_dictionary.dic --model model_folder_path
其中 train_dictionary.dic就是之前下载的字典,model_folder_path为训练好后的模型存储的位置。
训练模型的语句中,还有一些参数可供选择:
--max_steps:训练迭代的次数(默认情况下 maxsteps=0,此时模型会不停的迭代, 直到训练效果不能再好为止)。
--size:神经网络的节点数目(默认情况下 size=64),在实验中发现,size=512 会拥有更好的结果,但是size=512时训练时间会变长。
--num_layers:神经网络的层数(默认情况下num_layers=2),如果训练集很小 的话,可以设置num_layers=1, 当num_layers=3时会得到更好的结果
python ~/Work/g2p-seq2seq-master/g2p_seq2seq/g2p.py--train cmudict.dic.train --test cmudict.dic.test --num_layers 2 --size 512 --model~/Work/model1 --max_steps 0
同时还可以查看一个模型的识别准确率,用法如下:
$:pythong2p.py --evaluate test_dictionary.dic --model model_folder_path
同其中test_dictionary.dic
最后不得不说,在没有大规模语料的情况下,准确率还是相当的低。。