【sphinx】中文声学模型训练
一 .使用CMUSphinx训练声学模型
CMUSphinx工具包中自带好几个高质量的声学模型。美语模型,法语,中文模型。这些模型是经过优化的,为了得到最佳的性能,大多数指令交互系统能直接用这些模型,甚至一些大词汇量的应用也能直接用他们。
除此之外,CMUSphinx提供了功能,能适应现存的模型,为了满足有些需要更高精度的需求。当你需要使用不同的录音环境,(比如近距离,远离麦克分或者通过通话过程中),这些情况下做适应结果都是不错的,或者当需要转换一种口音,比如美语和英语的转换,印度英语的使用等。自适应能满足这样的要求:那就是你需要在很短的时间内,支持一门新的语言,那么你只需要基于词典做出一个声学模型音素集到目标音素集的转换就可。
然而,在某些时候,当下的模型并没法用。比如手写识别中,或者其他语言的监测中。这些情况下,你需要重新训练你自己的声学模型。如下教程会指导你如何开始训练。
二 开始训练
训练之前,假设你有充足的数据:
- 用于单个人的指令应用,至少需要一小时录音,
-
用于很多人指令应用,需要200个录音人,每人5小时
-
用于单个人的听写,需要10小时他的录音
-
用于多个人的听写,需要200个说话人,每人50小时的录音
-
同时你要有这门语言的语音学知识,以及你有足够的比如一个月的时间,来训练模型
而如果你没有足够的数据,足够的时间,足够的经验,那么建议你还是做已有模型的自适应来满足你的要求。
数据准备
训练者需要知道,使用哪一个声音单元来学习参数,至少每个序列都要在你的训练集中出现。这个信息储存在transcript file中。
然后通过词典dictionary,其中对于每个单词都有相应的声音序列做了映射。
所以,除了语音数据,你还需要一个transcripts,和两个词典。一个中是每个单词到发音的对应表,以及一个中是不发音的单元的表,记为filler dictionay.
训练开始
训练之前需要准备如下两个目录
-
etc
-
your_db.dic - Phonetic dictionary
-
your_db.phone - Phoneset file
-
your_db.lm.DMP - Language model -语言模型
-
your_db.filler - List of fillers
-
your_db_train.fileids - List of files for training
-
your_db_train.transcription - Transcription for training
-
your_db_test.fileids - List of files for testing
-
your_db_test.transcription - Transcription for testing
-
-
wav
-
speaker_1
-
file_1.wav - Recording of speech utterance
-
-
speaker_2
-
file_2.wav
-
-
Fileids (your_db_train.fileids and your_db_test.fileids中列出了语音数据的文件名。如果是多个人的录音,可以加上录音人的信息,注意文件名不要加上后缀。
speaker_1/file_1
speaker_2/file_2
Transcription file (your_db_train.transcription and your_db_test.transcription) 中列出了你的录音文本。句子前后加上<s>标签,末尾加上句子序号。
<s> hello world </s> (file_1)
<s> foo bar </s> (file_2)
注意transcript中的行的序号和fileids中的序号要一致,如下,第二个句子放在第一位,就是个错误例子,会报错。
speaker_2/file_2 speaker_1/file_1 //Error! Do not create fileids file like this!
录音文件,比如是MS WAV格式,采样率为16khz,16bit,mono单声道的录音用于桌面应用。8khz,16bit,mono录音用于电话应用。 注意这点,错误的语音格式,常常是训练错误的原因。录音句子不能太长,也不能太短。一般是5s-30s之间。句子头尾的静音不能超过0.2s。
你必须确认你的语音数据是16khz,16bit,单声道。如果你用于电话应用,那可以是8khz,但是必须保证训练期间的参数设置也是8khz的设置。注意不能上采样语音数据,也就是说,不能用8khz的数据训练16khz的模型。
词典文件 (your_db.dict) 一行一个单词,后面空格后跟着的是发音
HELLO HH AH L OW WORLD W AO R L D
如果需要自己创建音素词典,学习下它的语音致使。sphinxtrain不支持类似“*”,“/"这样的音素符号。可以支持”+“”-“+“”:“这届符号。不过最好还是用字母表。可以将”a~"替换为“aa”
如果实在没有发音词典,可以复写它的单词如下。
ONE O N E TWO T W O
CMUSphinx与其他工具有一点不同,CMUSPhinx不支持单词模型,如果你要训练,你需要一个基于单词的词典
(For small vocabulary CMUSphinx is different from other toolkits. It's often recommended to train word-based models for small vocabulary databases like digits. But it only makes sense if your HMMs could have variable length. CMUSphinx does not support word models. Instead, you need to use a word-dependent phone dictionary:)
ONE W_ONE AH_ONE N_ONE
TWO T_TWO UH_TWO
NINE N_NINE AY_NINE N_END_NINE
This is actually equivalent to word-based models and some times even gives better accuracy. Do not use word-based models with CMUSphinx.
音素文件 (your_db.phone) 中一行一个音素,词典中出现的所有音素都要包含,额外再加一个sil
AH
AX
DH
IX
语言模型文件 file (your_db.lm.DMP)需要时arpa格式(后缀为lm)或者是DMP格式。 Language Model training chapter.
Filler 词典 (your_db.filler) 含有停顿,呼吸,感叹词,笑声等这些无法用语言模型覆盖的单元。可以只包含静音
<s> SIL </s> SIL <sil> SIL
或者如下内容,这些内容需要在transcription中出现过。
+um+ ++um++ +noise+ ++noise++
可以使用an4语音库。an4 database NIST's Sphere audio (.sph) format ,
工具准备
训练模型需要用到的工具包
-
sphinxbase-5prealpha (pocketsphinx用的时候需要将这个包放在一起)
-
sphinxtrain-5prealpha (训练声学模型的)
-
pocketsphinx-5prealpha (识别用)
以及另外两个工具:perl和python
-
perl, for example ActivePerl on Windows
-
python, for example ActivePython on Windows
建议在linux上做训练,这样可以利用到sphinxtrain的所有特征。如果是windows上训练,那么可以使用activeperl。
********************************************************************************************************
*****此处,an4语音库无法下载,如果能下载,可以看看里面的 格式,内容,数量就好了******
*********************************************************************
安装了后用以下命令加载路径。
export PATH=/usr/local/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
如果你不想装在系统目录中, 你可以装在home目录下,然后用如下命令,添加到autogen.sh中。
--prefix=/home/user/local
使用中如果遇到failed to open libsphinx.so.0 no such file or directory
这类问题代表安装路径,环境没配置好。
训练文件建立
a.如下命令,建立目录
On Linux
sphinxtrain -t an4 setup (其中,an4换成你的数据库的名字,可以是data3 data4)
On Windows
python ../sphinxtrain/scripts/sphinxtrain -t an4 setup
会在data3目录下得到如下两个目录。
etc
wav
等训练完后,data3中内容是如下样子:
etc
feat
logdir
model_parameters
model_architecture
result
wav
b.训练参数的设置
在文件etc/sphinx_train.cfg中做如下改动
(1)数据格式的配置
$CFG_WAVFILES_DIR = "$CFG_BASE_DIR/wav";
$CFG_WAVFILE_EXTENSION = 'sph';
$CFG_WAVFILE_TYPE = 'nist'; # one of nist, mswav, raw
如果语音是wav格式,上面中sph,nist改为下面
$CFG_WAVFILES_DIR = "$CFG_BASE_DIR/wav";
$CFG_WAVFILE_EXTENSION = 'wav';
$CFG_WAVFILE_TYPE = 'mswav'; # one of nist, mswav, raw
(2)训练路径的配置
如下,要确定CFG_DB_NAME就是数据在目录中的名字格式
# Variables used in main training of models
$CFG_DICTIONARY = "$CFG_LIST_DIR/$CFG_DB_NAME.dic";
$CFG_RAWPHONEFILE = "$CFG_LIST_DIR/$CFG_DB_NAME.phone";
$CFG_FILLERDICT = "$CFG_LIST_DIR/$CFG_DB_NAME.filler";
$CFG_LISTOFFILES = "$CFG_LIST_DIR/${CFG_DB_NAME}_train.fileids";
$CFG_TRANSCRIPTFILE = "$CFG_LIST_DIR/${CFG_DB_NAME}_train.transcription"
(3)模型格式和模型参数的配置
$CFG_HMM_TYPE = '.cont.'; # Sphinx4, Pocketsphinx #$CFG_HMM_TYPE = '.semi.'; # PocketSphinx only #$CFG_HMM_TYPE = '.ptm.'; # Sphinx4, Pocketsphinx, faster model $CFG_FINAL_NUM_DENSITIES = 8;
此处,如果有充足的数据(>100小时),则使用32,否则是8.阶数分别是 2: 4, 8, 16, 32, 64.
如果训练的是半连续的或者PTM模型,使用256 高斯。
# Number of tied states (senones) to create in decision-tree clustering
$CFG_N_TIED_STATES = 1000;
这个是模型中训练的声元的个数。声元越多越精确。但是也不能过训练。否则会得到如下错误:
ERROR: "gauden.c", line 1700: Variance (mgau= 948, feat= 0, density=3,
component=38) is less then 0. Most probably the number of senones is too
high for such a small training database. Use smaller $CFG_N_TIED_STATES.
如下是各个应用,词汇量,需要的数据时间,需要的发音人,阶数对比表。
Vocabulary | Hours in db | Senones | Densities | Example |
20 | 5 | 200 | 8 | Tidigits Digits Recognition |
100 | 20 | 2000 | 8 | RM1 Command and Control |
5000 | 30 | 4000 | 16 | WSJ1 5k Small Dictation |
20000 | 80 | 4000 | 32 | WSJ1 20k Big Dictation |
60000 | 200 | 6000 | 16 | HUB4 Broadcast News |
60000 | 2000 | 12000 | 64 | Fisher Rich Telephone Transcription |
重点:最好的结果,依赖于你的数据库。
(4)声音参数的配置
如果用的是8khz的语料,需要做如下修改:
# Feature extraction parameters
$CFG_WAVFILE_SRATE = 8000.0;
$CFG_NUM_FILT = 31; # For wideband speech it's 40, for telephone 8khz reasonable value is 31
$CFG_LO_FILT = 200; # For telephone 8kHz speech value is 200
$CFG_HI_FILT = 3500; # For telephone 8kHz speech value is 3500
(5)训练速度的设置
如果是在多核机器上,修改如下设置,加快速度。
$DEC_CFG_DICTIONARY = "$DEC_CFG_BASE_DIR/etc/$DEC_CFG_DB_NAME.dic";
$DEC_CFG_FILLERDICT = "$DEC_CFG_BASE_DIR/etc/$DEC_CFG_DB_NAME.filler";
$DEC_CFG_LISTOFFILES = "$DEC_CFG_BASE_DIR/etc/${DEC_CFG_DB_NAME}_test.fileids";
$DEC_CFG_TRANSCRIPTFILE = "$DEC_CFG_BASE_DIR/etc/${DEC_CFG_DB_NAME}_test.transcription";
$DEC_CFG_RESULT_DIR = "$DEC_CFG_BASE_DIR/result";
# These variables, used by the decoder, have to be user defined, and
# may affect the decoder output
$DEC_CFG_LANGUAGEMODEL_DIR = "$DEC_CFG_BASE_DIR/etc";
$DEC_CFG_LANGUAGEMODEL = "$DEC_CFG_LANGUAGEMODEL_DIR/an4.lm.DMP"
(6)解码参数的设置
etc/sphinx_train.cfg
, (此处是否有误,应该是decode.cfg吧)
$DEC_CFG_DICTIONARY = "$DEC_CFG_BASE_DIR/etc/$DEC_CFG_DB_NAME.dic";
$DEC_CFG_FILLERDICT = "$DEC_CFG_BASE_DIR/etc/$DEC_CFG_DB_NAME.filler";
$DEC_CFG_LISTOFFILES = "$DEC_CFG_BASE_DIR/etc/${DEC_CFG_DB_NAME}_test.fileids";
$DEC_CFG_TRANSCRIPTFILE = "$DEC_CFG_BASE_DIR/etc/${DEC_CFG_DB_NAME}_test.transcription";
$DEC_CFG_RESULT_DIR = "$DEC_CFG_BASE_DIR/result";
# These variables, used by the decoder, have to be user defined, and
# may affect the decoder output
$DEC_CFG_LANGUAGEMODEL_DIR = "$DEC_CFG_BASE_DIR/etc";
$DEC_CFG_LANGUAGEMODEL = "$DEC_CFG_LANGUAGEMODEL_DIR/an4.lm.DMP"
训练
cd an4 进入数据目录,其中已有各种小目录以及各种配置文件。
On Linux
sphinxtrain run 开始了
On Windows
python ../sphinxtrain/scripts/sphinxtrain run
训练开始,首先会检查各个文件格式是否正确。不要忽视每一个错误。
Do not ignore the errors reported on the first 00.verify_all step.
典型的解码过程中输出如下所示:
Baum welch starting for 2 Gaussian(s), iteration: 3 (1 of 1)
0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
Normalization for iteration: 3
Current Overall Likelihood Per Frame = 30.6558644286942
Convergence Ratio = 0.633864444461992
Baum welch starting for 2 Gaussian(s), iteration: 4 (1 of 1)
0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
Normalization for iteration: 4
训练过程详解
在scripts-pl目录下,有00-99的流程,他们是如下顺序执行的:
perl scripts_pl/000.comp_feat/slave_feat.pl
perl scripts_pl/00.verify/verify_all.pl
perl scripts_pl/10.vector_quantize/slave.VQ.pl
perl scripts_pl/20.ci_hmm/slave_convg.pl
perl scripts_pl/30.cd_hmm_untied/slave_convg.pl
perl scripts_pl/40.buildtrees/slave.treebuilder.pl
perl scripts_pl/45.prunetree/slave-state-tying.pl
perl scripts_pl/50.cd_hmm_tied/slave_convg.pl
perl scripts_pl/90.deleted_interpolation/deleted_interpolation.pl
其中有个文件是 an4.html,其中记有已执行的进程信息。
其中执行00-90步骤时候,会生成很多组声学模型,他们每个都能用于识别。只有在选择semi-continuous的时候,会需要一些步骤。选择continuous时候,其中一些步骤不会被用到。
000.comp_feat目录下,slave-feat.pl产生MFCC特征。提取完后会自动移动到feat目录下。CMUSphinx可以使用多种类型的特征。
20.ci_hmm
中,开始训练独立于上下文的模型。(单个phone)
30.cd_hmm_untied
中开始训练依赖上下文的(triphone)的模型,称为 CD-untied models,它的作用对于建立决策树,连接各个状态是必要的。
40.buildtrees
会对每个单词单元,每个状态建立决策树。
45.prunetree
对决策树做剪枝,同时将各个状态连接起来。
50.cd-hmm_tied
是训练最终的triphone的模型。叫做 CD-tied models. CD-tied models是多个阶段训练得到的。每个HMM状态,我们先从1高斯开始,接着是2高斯,直到8高斯。
转换矩阵训练(高级版)
通过在train.config中做一些设置,会加做一些额外的训练,可以提高识别精度。
MMIE Training (advanced)
同上。
测试开始
sphinxtrain -s decode run
得到的结果,统计词错误率和句子错误率。10小时的应用,WER应该是10%附近。更大应用,WER会在30%附近
在result目录下,有结果的详细内容,如在 an4.align中有
:
p I T t s b u r g H (MMXG-CEN5-MMXG-B)
p R EIGHTY t s b u r g EIGHT (MMXG-CEN5-MMXG-B)
Words: 10 Correct: 7 Errors: 3 Percent correct = 70.00% Error = 30.00% Accuracy = 70.00%
Insertions: 0 Deletions: 0 Substitutions: 3
october twenty four nineteen seventy (MMXG-CEN8-MMXG-B)
october twenty four nineteen seventy (MMXG-CEN8-MMXG-B)
Words: 5 Correct: 5 Errors: 0 Percent correct = 100.00% Error = 0.00% Accuracy = 100.00%
Insertions: 0 Deletions: 0 Substitutions: 0
TOTAL Words: 773 Correct: 587 Errors: 234
TOTAL Percent correct = 75.94% Error = 30.27% Accuracy = 69.73%
TOTAL Insertions: 48 Deletions: 15 Substitutions: 171
使用模型
训练后的模型在如下目录:
model_parameters/<your_db_name>.cd_cont_<number_of senones>
or in
model_parameters/<your_db_name>.cd_semi_<number_of senones>
其中文件如下
mdef
feat.params
mixture_weights
means
noisedict
transition_matrices
variances
如下命令开始使用
pocketsphinx_continuous -hmm <your_new_model_folder> -lm <your_lm> -dict <your_dict>.
用sphinx4的话,需要代码中设置模型路径
configuration.setAcousticModelPath("file:model_parameters/db.cd_cont_200");
一些问题
发现有问题后,1是检查 logdir
中的细节log,2是看your_project_name.html
如下还有一些常见问题及原因:
WARNING: this phone (something) appears in the dictionary (dictionary file name), but not in the phone list (phone file name).
WARNING: This word (word) has duplicate entries in (dictionary file name). Check for duplicates.(词典中不能有重复单词,大小写两种也不行)
WARNING: This word: word was in the transcript file, but is not in the dictionary (transcript line) Do cases match?(文本中所有单词都要在词典中)
WARNING: CTL file, audio file name.mfc, does not exist, or is empty. (是不是有新加了语音,但是没有提取特征这一步)
Very low recognition accuracy.
ERROR: "backward.c", line 430: Failed to align audio to transcript: final state of the search is not reached.
这个原因是因为录音和文本对不上,录音可能是hello hello word,而文本只有hello word。解决办法:1.尽量严格对齐文本,改变文本中内容,2.设置强行对齐参数,在train.cfg中。
$CFG_FORCEDALIGN = 'yes';,然后重新训练。会执行10,11目录来过滤数据库。
Can't open */*-1-1.match word_align.pl failed with error code 65280
This error occurs because the decoder did not run properly after training. First check if the correct executable (psdecode_batch if the decoding script being used is psdecode.pl
as set by $DEC_CFG_SCRIPT
variable in sphinx_train.cfg
) is present in PATH
. On Linux run
which pocketsphinx_batch
and see if it is located. If it is not, you need to set the PATH
variable properly. Similarly on Windows, run
where pocketsphinx_batch*
If the path to decoding executable is set properly, read the log files at logdir/decode/
to find out other reasons behind the error.
pocketsphinx_continuous -hmm <your_new_model_folder> -lm <your_lm> -dict <your_dict>.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
分隔线
对于目前使用的版本,大约是sphinx3版本,在linux上,使用过程中各个步骤如下:
1.建立各个目录;
SphinxTrain/scripts_pl/setup_SphinxTrain.pl -task data3
2.修改配置:相同
3.开始训练:
cd /sphinx/MyTrain
./scripts_pl/make_feats.pl -ctl etc/my_db_train.fileids
./scripts_pl/make_feats.pl -ctl etc/my_db_test.fileids
./scripts_pl/RunAll.pl