通过在现有声学模型中加入特定的适应数据,来改进现有声学模型以满足特定场合需求。这种适应声学模型的方法有时比重新训练新的声学模型效果还要好。 通常由于不同的解码器(如pocketsphinx和sphinx4)使用不同声学模型,因此对应适应声学模型的方法也是不同的。
1 创建适应语料库
1.1 需要的文件
arctic20.fileids :记录要使用哪些语音文件
arctic20.transcription :记录句子和语音文件对应关系
1.2 录制语音文件
此处音频文件采样率16KHz,16bit单声道录音,而且是wav格式。
最简单录音方式是使用录音软件Audacity 或者Wavesurfer,一次把20句全部记录下来,然后再按照句子分割保存。
当然,也可以用linux命令行命令rec进行录音。
当记录下这20个wav格式文件之后,我们可以用下面命令播放下每个音频文件,看看是否正常:
for i in *.wav; do play $i; done
2 适应语音模型
2.1 复制PocketSphinx现有声学模型到当前工作目录
cp -a /usr/local/share/pocketsphinx/model/en-us/en-us .
为测试,再拷贝lm和字典文件,
cp -a /usr/local/share/pocketsphinx/model/en-us/cmudict-en-us.dict .
cp -a /usr/local/share/pocketsphinx/model/en-us/en-us.lm.bin .
2.2 生成声学特征文件
从录制的WAV格式语音文件中提取MFCC声纹特征,这个操作必须确保用与现有声学模型相同声学参数提取声纹。
sphinx_fe -argfile en-us/feat.params -samprate 16000 -c arctic20.fileids -di . -do . -ei wav -eo mfc -mswav yes
这条命令执行后,你将会看到20个对应的扩展名为mfc的文件。
2.3 转化sendump和mdef文件
有些模型要做适应的话还需要一些数据,但是为了节省空间pocketsphinx没有包含这些东西,需要从其它地方下载,对于en-us模型我们从这里下载完整版本:cmusphinx-en-us-ptm-5.2.tar.gz
解压下载的包,从中拷贝mixture_weights到你的声学模型(这里是en-us)中。
cp cmusphinx-en-us-ptm-5.2/mixture_weights en-us/
然后我们把声学模型的mdef文件转换为SphinxTrain训练工具可以使用的plain text格式:
pocketsphinx_mdef_convert -text en-us/mdef en-us/mdef.txt
2.4 累加观测序列
使用SphinxTrain生成的bw工具去收集适应数据的统计数据。
拷贝bw工具到当前工作目录:
cp /usr/local/libexec/sphinxtrain/bw .
然后执行如下命令:
./bw -hmmdir en-us -moddeffn en-us/mdef.txt -ts2cbfn .ptm. -feat 1s_c_d_dd -svspec 0-12/13-25/26-38 -cmn current -agc none -dictfn cmudict-en-us.dict -ctlfn arctic20.fileids -lsnfn arctic20.transcription -accumdir .
注意:确保bw的参数和现有声学模型目录的feat.params文件一致;
2.5 创建MLLR(似然线性回归算法)变换
MLLR是一种有效的轻量级的自适应方法,尤其是当样本数据集较小时候。在线适应中使用MLLR是一种比较好的方式。MLLR在连续模型中表现得比较好,但是因为半连续模型很依赖混合权重,所以它的效果有限。如果想得到最好的准确度,最好将MLLR适应和MAP适应两种方法结合起来。
下面我们使用命令生成MLLR变换,并在运行时将其传入解码器去适应声学模型:
拷贝sphinxtrain的工具mllr_solve到当前目录
cp /usr/local/libexec/sphinxtrain/mllr_solve .
接着执行:
./mllr_solve -meanfn en-us/means -varfn en-us/variances -outmllrfn mllr_matrix -accumdir .
这个命令行会产生一个名叫mllr_matrix的适应数据文件。如果我们需要使用这个适应模型,那就可以通过给pocketsphinx命令行参数添加 -mllr mllr_matrix。
2.6 使用MAP更新现有声学模型文件
拷贝sphinxtrain的工具map_adapt到当前目录
cp /usr/local/libexec/sphinxtrain/map_adapt .
我们将原来的声学模型目录拷贝为一个新的模型目录:
cp -rf en-us en-us-adapt
接着执行命令:
./map_adapt -moddeffn en-us/mdef.txt -ts2cbfn .ptm. -meanfn en-us/means -varfn en-us/variances -mixwfn en-us/mixture_weights -tmatfn en-us/transition_matrices -accumdir . -mapmeanfn en-us-adapt/means -mapvarfn en-us-adapt/variances -mapmixwfn en-us-adapt/mixture_weights -maptmatfn en-us-adapt/transition_matrices
2.7 重新创建senddump文件
通过已经更新的mixture_weights文件来重新创建 sendump文件,
拷贝sphinxtrain的工具mk_s2sendump到当前目录
cp /usr/local/libexec/sphinxtrain/mk_s2sendump .
然后执行下面命令:
./mk_s2sendump -pocketsphinx yes -moddeffn en-us-adapt/mdef.txt -mixwfn en-us-adapt/mixture_weights -sendumpfn en-us-adapt/sendump
3 测试适应语言模型
适应过程完成后,新的适应声学模型位于目录en-us-adapt,该目录下应该有这些文件:
├── mdef
├── mdef.txt
├── means
├── mixture_weights
├── noisedict
├── README
├── sendump
├── transition_matrices
└── variances
然后,通过下面命令测试新适应的声学模型(en-us-adapt),可以验证对你录制文件的识别率,如:
pocketsphinx_continuous -hmm en-us-adapt/ -lm en-us.lm.bin -dict cmudict-en-us.dict -infile arctic_0008.wav
可以看看旧的声学模型模型(en-us)识别率,
pocketsphinx_continuous -hmm en-us/ -lm en-us.lm.bin -dict cmudict-en-us.dict -infile arctic_0008.wav
实验结果表明,适应出来的新模型确实识别率提高不少;真的是适应了你的声音,即使发音不太准也可使用。