调整pocketsphinx中文声学模型

调整pocketsphinx中文声学模型
以下操作基本都是按照wiki的步骤一步一步进行的,仅做记录。

  1. 创建语料库
    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
  1. 调整声学模型
    将现在的中文声学模型、语言模型、字典文件复制到当前目录下。
  • 生成声学特征文件
    使用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文件


    image.png

    根据文档说明,有一些模型是以压缩模式发行的,适应所需的其他文件被排除在外,以节省空间。需确保使用的是带有完整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创建转换
    image.png

    接下来,我们将生成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文件,可以删除以节省空间。

你可能感兴趣的:(调整pocketsphinx中文声学模型)