调整pocketsphinx中文声学模型
以下操作基本都是按照wiki的步骤一步一步进行的,仅做记录。
- 创建语料库
arctic20.txt 文本文件:里面是中文的句子
arctic20.fileids控制文件:记录我的语音文件(读arctic20.txt里面的句子的录音)的路径
arctic20.transcription脚本文件:中文句子和语音文件的对应
arctic20.dic 字典文件:记录arctic20.txt里面的句子的因素组成
# arctic20.txt 准备录音的20个句子
今天我来到了北京天安门
你太让我失望了
举起你们的双手摇起来
他确定要这么做吗
盼望着盼望着东风来了春天的脚步近了
请打开我的电脑
这个液晶显示器有点贵
下午去购物怎么样
我们发现了一个新大陆
我想遨游在音乐的世界里
今天的天气还不错啊
什么时候人类能踏上火星的土地
物理学的大厦将会越来越高
地铁比公交车更快更方便
你愿意来我的公司上班吗
你的孩子多大了
让我们荡起双浆
毫无疑问这是一次机遇
我时刻在准备着
等了这么久这一天终于到来了
# arctic20.fileids 20个句子对应的录音文件名
arctic_0001
arctic_0002
arctic_0003
arctic_0004
arctic_0005
arctic_0006
arctic_0007
arctic_0008
arctic_0009
arctic_0010
arctic_0011
arctic_0012
arctic_0013
arctic_0014
arctic_0015
arctic_0016
arctic_0017
arctic_0018
arctic_0019
arctic_0020
# arctic20.transcription脚本文件 每个文件对应的内容
今天我来到了北京天安门 (arctic_0001)
你太让我失望了 (arctic_0002)
举起你们的双手摇起来 (arctic_0003)
他确定要这么做吗 (arctic_0004)
盼望着盼望着东风来了春天的脚步近了 (arctic_0005)
请打开我的电脑 (arctic_0006)
这个液晶显示器有点贵 (arctic_0007)
下午去购物怎么样 (arctic_0008)
我们发现了一个新大陆 (arctic_0009)
我想遨游在音乐的世界里 (arctic_0010)
今天的天气还不错啊 (arctic_0011)
什么时候人类能踏上火星的土地 (arctic_0012)
物理学的大厦将会越来越高 (arctic_0013)
地铁比公交车更快更方便 (arctic_0014)
你愿意来我的公司上班吗 (arctic_0015)
你的孩子多大了 (arctic_0016)
让我们荡起双浆 (arctic_0017)
毫无疑问这是一次机遇 (arctic_0018)
我时刻在准备着 (arctic_0019)
等了这么久这一天终于到来了 (arctic_0020)
# arctic20.dic 字典文件 每个句子的组成,参考pocketsphinx的中文字典
今天我来到了北京天安门 uu uo3 j in1 t ian1 l ai2 d ao4 l e5 b ei3 j ing1 t ian1 aa an1 m en2
你太让我失望了 n i3 t ai4 r ang4 uu uo3 sh ix1 uu uang4 l e5
举起你们的双手摇起来 j v3 q i3 n i3 m en5 d e5 sh uang1 sh ou3 ii iao2 q i3 l ai2
他确定要这么做吗 t a1 q ve4 d ing4 ii iao4 zh e4 m e5 z uo4 m a5
盼望着盼望着东风来了春天的脚步近了 p an4 uu uang4 zh e5 p an4 uu uang4 zh e5 d ong1 f eng1 l ai2 l e5 ch un1 t ian1 d e5 j iao3 b u4 j in4 l e5
请打开我的电脑 q ing3 d a3 k ai1 uu uo3 d e5 d ian4 n ao3
这个液晶显示器有点贵 zh e5 g e4 ii ie4 j ing1 x ian3 sh ix4 q i4 ii iu3 d ian3 g ui4
下午去购物怎么样 x ia4 uu u3 q u4 g ou4 uu u4 z en3 m e5 ii iang4
我们发现了一个新大陆 uu uo3 m en5 f a1 x ian4 l e5 ii i1 g e5 x in1 d a4 l u4
我想遨游在音乐的世界里 uu uo3 x iang3 aa ao2 ii iu2 z ai4 ii in1 vv ve4 d e5 sh ix4 j ie4 l i3
今天的天气还不错啊 j in1 t ian1 d e5 t ian1 q i4 h ai2 b u2 c uo4 aa a5
什么时候人类能踏上火星的土地 sh en2 m e5 sh ix2 h ou5 r en2 l ei4 n eng2 t a4 sh ang4 h uo3 x ing1 d e5 t u3 d i4
物理学的大厦将会越来越高 uu u4 l i3 x ve2 d e5 d a4 sh a4 j iang1 h ui4 vv ve4 l ai2 vv ve4 g ao1
地铁比公交车更快更方便 d i4 t ie3 b i3 g ong1 j iao1 ch e1 g eng4 k uai4 g eng4 f ang1 b ian4
你愿意来我的公司上班吗 n i3 vv van4 ii i4 l ai2 uu uo3 d e5 g ong1 s iy1 sh ang4 b an1 m a5
你的孩子多大了 n i3 d e5 h ai2 z iy5 d uo1 d a4 l e5
让我们荡起双浆 r ang4 uu uo3 m en5 d ang4 q i3 sh uang1 j iang3
毫无疑问这是一次机遇 h ao2 uu u2 ii i2 uu un4 zh e4 sh ix4 ii i1 c iy4 j i1 vv v4
我时刻在准备着 uu uo3 sh ix2 k e4 z ai4 zh un3 b ei4 zh e5
等了这么久这一天终于到来了 d eng3 l e5 zh e4 m e5 j iu3 zh e4 ii i1 t ian1 zh ong1 vv v2 l ai2 d ao4 l e5
准备录音文件,使用下面的脚本进行录音(需要先安装sox):
#!/bin/bash
for i in `seq 1 20`; do
fn=`printf arctic_%04d $i`;
read sent;
echo $sent;
rec -r 16000 -e signed-integer -b 16 -c 1 $fn.wav 2>/dev/null;
done < arctic20.txt
录音后使用下面的脚本进行播放检查:
#!/bin/bash
for i in *.wav;do
read sent;
echo $sent;
play $i;
done < arctic20.txt
此时,文件夹中应该有如下文件:
arctic20.dic
arctic20.fileids
arctic20.transcription
arctic20.txt
arctic_0001.wav
...
arctic_0020.wav
- 调整声学模型
将现在的中文声学模型、语言模型、字典文件复制到当前目录下。
- 生成声学特征文件
使用sphinxbase中的sphinx_fe工具对wav录音文件进行特征提取,须确保使用与训练标准声学模型相同的声学参数,存储在feat.params文件中。
sphinx_fe -argfile zh_cn.cd_cont_5000/feat.params -samprate 16000 -c arctic20.fileids -di . -do . -ei wav -eo mfc -mswav yes
执行后会为每个录音文件生成mfc特征文件
-
转换sendump和mdef文件
根据文档说明,有一些模型是以压缩模式发行的,适应所需的其他文件被排除在外,以节省空间。需确保使用的是带有完整mixture_weights文件的完整模型。
接下来使用pocketsphinx_mdef_convert将mdef文件从声学模型转换为SphinxTrain工具使用的纯文本格式:
pocketsphinx_mdef_convert -text zh_cn.cd_cont_5000/mdef zh_cn.cd_cont_5000/mdef.txt
- 累加观察序列
通过SphinxTrain训练工具带的bw程序去收集适应数据的统计数据。将bw、map_adapt、mllr_solve、mk_s2sendump程序一起复制到当前目录下,程序在下载的sphinxtrain-5prealpha.tar.gz包中。
cp /home/lhy/Downloads/pocketsphinx/sphinxtrain/src/programs/bw/.libs/bw .
cp /home/lhy/Downloads/pocketsphinx/sphinxtrain/src/programs/map_adapt/.libs/map_adapt .
cp /home/lhy/Downloads/pocketsphinx/sphinxtrain/src/programs/mk_s2sendump/.libs/mk_s2sendump .
cp /home/lhy/Downloads/pocketsphinx/sphinxtrain/src/programs/mllr_solve/.libs/mllr_solve .
运行命令收集统计信息,应确保参数与feat.params文件中的参数相匹配:
./bw \
-hmmdir zh_cn.cd_cont_5000 \
-moddeffn zh_cn.cd_cont_5000/mdef.txt \
-ts2cbfn .cont. \
-feat 1s_c_d_dd \
-cmn batch \
-agc none \
-dictfn zh_cn.dic \
-ctlfn arctic20.fileids \
-lsnfn arctic20.transcription \
-lda zh_cn.cd_cont_5000/feature_transform \
-accumdir .
- 使用MLLR创建转换
接下来,我们将生成MLLR转换,并将其传递给解码器以在运行时调整声学模型
./mllr_solve \
-meanfn zh_cn.cd_cont_5000/means \
-varfn zh_cn.cd_cont_5000/variances \
-outmllrfn mllr_matrix -accumdir .
该命令会产生一个mllr_matrix的适应数据文件,如果我们需要使用这个适应模型进行解码,那就可以通过给pocketsphinx命令行参数添加 -mllr mllr_matrix来使用。
- 使用MAP更新声学模型文件
复制声学模型目录,并使用改编的模型文件覆盖新创建的目录
cp -r zh_cn.cd_cont_5000 zh_cn_adapt
运行map_adapt命令:
./map_adapt \
-moddeffn zh_cn.cd_cont_5000/mdef.txt \
-ts2cbfn .ptm. \
-meanfn zh_cn.cd_cont_5000/means \
-varfn zh_cn.cd_cont_5000/variances \
-mixwfn zh_cn.cd_cont_5000/mixture_weights \
-tmatfn zh_cn.cd_cont_5000/transition_matrices \
-accumdir . \
-mapmeanfn zh_cn_adapt/means \
-mapvarfn zh_cn_adapt/variances \
-mapmixwfn zh_cn_adapt/mixture_weights \
-maptmatfn zh_cn_adapt/transition_matrices
- 重新创建适应的sendump文件
通过已经更新的mixture_weights文件来重新创建 sendump文件
./mk_s2sendump \
-pocketsphinx yes \
-moddeffn zh_cn_adapt/mdef.txt \
-mixwfn zh_cn_adapt/mixture_weights \
-sendumpfn zh_cn_adapt/sendump
到现在已经拥有了一个经过调整的声学模型,解码器不使用mixture_weights和mdef.txt文件,可以删除以节省空间。