CMUSphinx适应声学模型

   通过在现有声学模型中加入特定的适应数据,来改进现有声学模型以满足特定场合需求。这种适应声学模型的方法有时比重新训练新的声学模型效果还要好。 通常由于不同的解码器(如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,该目录下应该有这些文件:

├── feat.params
├── 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


实验结果表明,适应出来的新模型确实识别率提高不少;真的是适应了你的声音,即使发音不太准也可使用。




  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值