改进现有的声学模型   
Jiangdg_VIP
http://blog.csdn.net/u012637501

译自:http://cmusphinx.sourceforge.net/wiki/tutorialpocketsphinx

本文主要描述了如何通过对声学模型做一些简单工作去改进语音识别。但需要注意的是,所谓的改进是不将系统针对特定人,而是是你提供的适应数据和模型的匹配。例如:可以适应你的声音使得口语较好的识别,或者也可以使用特定的录音环境,适应你的或者用户的口音等等。

适应的过程是通过提供适应的录音数据去改进现有的模型。这样获得的识别效果往往比重新训练鲁棒性要强,尽管你的适应数据集比较小。例如,对于特定人来说,5分钟的语音就可以达到很明显的听写准确度了。
一、创建一个适应的语料库
      语料库包含了一些句子,这些句子是任意指定的,但最好可以覆盖你想要识别的句子里面包含的高频率单词或者音素。CMU提供了一个例子 CMU ARCTIC,里面包含了20个句子,但这个是英文的,所以我们得自己做一个中文的。CMU ARCTIC 见:http://festvox.org/cmu_arctic/
1.需要的文件:共需要四个文件
arctic20.txt  文本文件:里面是中文的句子

arctic20.fileids 控制文件:记录我的语音文件(读arctic20.txt里面的句子的录音)的路径
arctic20.transcription 脚本文件:中文句子和语音文件的对应
arctic20.dic 字典文件:记录arctic20.txt里面的句子的因素组成

     其实我也不知道具体应该如何建这些文件,我参考了CMU ARCTIC这个英文的,但中文有点不一样,我自己的这些文件的内容如下:
(1)arctic20.txt
    因为我是要语音控制系统的,所以我就加入了很多这类的控制语言,共12个句子:
你确定吗
打开我的电脑,确定还是取消
关闭计算机,退出浏览器
你好吗?可以退出程序吗
返回上一页还是返回主菜单
放大还是缩小页面
今天的天气不错,不下雨
你喜欢听音乐吗,需要打开音乐播放器吗,听第几首歌
需要浏览图片,上一张还是下一张
我想看视频,有什么电影
打开系统设置,基本设置
进入主菜单,请控制,向左,向右,还是,向上,向下
(2)arctic20.fileids
    我把上面12个句子对应的录音文件(放在当前目录下的)命名为arctic_*,不需要后缀名的:
arctic_0001
arctic_0002
arctic_0003
arctic_0004
arctic_0005
arctic_0006
arctic_0007
arctic_0008
arctic_0009
arctic_0010
arctic_0011
arctic_0012

(3)arctic20.transcription

    前面 <s>和 </s>表示静音,()括号内的就是对应的录音文件:
<s> 你确定吗 </s> (arctic_0001)
<s> 打开我的电脑,确定还是取消 </s> (arctic_0002)
<s> 关闭计算机,退出浏览器 </s> (arctic_0003)
<s> 你好吗?可以退出程序吗 </s> (arctic_0004)
<s> 返回上一页还是返回主菜单 </s> (arctic_0005)
<s> 放大还是缩小页面 </s> (arctic_0006)
<s> 今天的天气不错,不下雨 </s> (arctic_0007)
<s> 你喜欢听音乐吗,需要打开音乐播放器吗,听第几首歌 </s> (arctic_0008)
<s> 需要浏览图片,上一张还是下一张 </s> (arctic_0009)
<s> 我想看视频,有什么电影 </s> (arctic_0010)
<s> 打开系统设置,基本设置 </s> (arctic_0011)
<s> 进入主菜单,请控制,向左,向右,还是,向上,向下 </s> (arctic_0012)

(4)arctic20.dic字典文件:

    记录arctic20.txt里面的句子的因素组成,我建立这个文件的时候还是比较坎坷的。先是按词语为单位,到后面统计时,统计不过去,然后我改成以词为单位,还是统计不了,出现段错误,最后我改成以句子为单位,就是下面这样,才可以,注意下面标红的这几个,和我们平时的拼音有点不一样:
你确定吗  n i q uxe d ing m a
打开我的电脑,确定还是取消 d a k ai w o d e d ian n aoq uxe d ing h ai sh ibq ux x i ao
关闭计算机,退出浏览器 g uan b i j i s uan j i t ui ch u l iu l an q i
你好吗?可以退出程序吗 n i h ao m a k e y i t ui ch u ch engx ux m a
返回上一页还是返回主菜单 f an h ui sh ang y i y e h aish ib f an h ui zh u c ai d an
放大还是缩小页面 f ang d a h ai sh ib s uo x iao y e m ian
今天的天气不错,不下雨 j in t ian d e t ian q i b u c uo b u x ia y u
你喜欢听音乐吗,需要打开音乐播放器吗,听第几首歌 n i x i h uan t ing y iny uxs uxe m a x ux y ao d a k ai y in y uxe b o f ang q i m a t ing d i j i sh ou g e
需要浏览图片,上一张还是下一张 x ux y ao l iu l an t u p ian sh ang y i zh ang h ai sh i x ia y i zh ang
我想看视频,有什么电影 w o x iang k an sh i p in y ou sh en m e d ian y ing
打开系统设置,基本设置 d a k ai x i t ong sh ezh ib j i b en sh e zh ib
进入主菜单,请控制,向左,向右,还是,向上,向下 j in r u zh u c ai d an q ing k ong zh ib x iang z uo x iang y ou h ai sh i x iang sh ang x iang x ia

2.录制你的适应数据

   为适应语料库里面的每一个句子录制一个语音文件,录音文件的命名需要和arctic20.transcription与arctic20.fileids的一致。注意:此处音频文件采样率16KHz,16bit单声道录音,而且是wav格式。
(1)我在Linux下写了一个处理脚本来实现上面这12个句子的录音:rec_wav.sh,内容如下:
for i in `seq 1 12`; dofn=`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
(2)在这里我们需要用到rec这个录音命令,这个命令是由Linux下一个很有名的音频转换程序sox携带的,所以我们需要先安装sox:
#apt-get install sox
(3)然后改变rec_wav.sh的运行属性:
#chmod 777 rec_wav.sh
#./rec_wav.sh
   这个脚本会显示一句话,然后进入录音,我们把这个句子读出来,然后按ctrl+c显示下一句话,然后录音,如此循环到全部的句子的语音数据拿到。这样在当前文件夹下面就会显示如下文件:
arctic_0001.wav
arctic_0002.wav
.....
arctic_0012.wav
(4)然后,我们需要测试下每个音频文件是否正常:
for i in *.wav; do play $i; done
他会依次的播放我们录下的这些音频文件;如果不对的话,就得重录,我的就没有什么问题。
二、适应声学模型
1.首先我们需要先拷贝现有的默认的声学模型到当前目录下
#cp -a /usr/local/share/pocketsphinx/model/hmm/zh/tdt_sc_8k/ .  
    这个是pocketsphinx自带的中文声学模型

2.生成声学特征文件

      我们需要对我们录制的wav语音文件提取MFCC特征,而且必须以和默认的模型相同的声学模型参数去提取这些特征,他们存储在声学模型目录的feat.params文件中。
#sphinx_fe -argfile tdt_sc_8k/feat.params -samprate 16000 -c arctic20.fileids -di . -do . -ei wav -eo mfc -mswav yes
这样在当前文件夹下就会对每一个语音文件生成一个*.mfc后缀的特征文件:(我这里生成的是*.mfc,但我执行后面的工作,也就是统计数据时,发现统计程序需要的是*..mfc的,我也不知道哪里出现问题了,所以我只能将其修改为*..mfc)
arctic_0001.mfc
arctic_0001.wav
arctic_0002.mfc
arctic_0002.wav
……

3.转化sendump和mdef文件

       有一些模型没有足够的数据去做适应。这里有一个额外的文件我们需要下载的,为了节省空间,所以没有添加进PocketSphinx的发行版包了。我们可以从下面的链接下载:
http://cmusphinx.svn.sourceforge.net/viewvc/cmusphinx/trunk/pocketsphinx-extra/?view=tar
(1)解压,拷贝pocketsphinx-extra/model/hmm/zh/mandarin_sc3_notone_3s_8k.cd_semi_5000文件夹里面的mixture_weights文件到你的声学模型目录下;
#cp ../sourcecode/pocketsphinx-extra/model/hmm/zh/mandarin_sc3_notone_3s_8k.cd_semi_5000/mixture_weights  tdt_sc_8k/
当然,如果你安装了 SphinxTrain Python modules,那么你就可以使用sendump.py去把声学模型的sendump文件转换为mixture_weights文件。
 (2) 然后我们需要把声学模型的mdef文件转换为SphinxTrain训练工具可以使用的plain text格式:
#pocketsphinx_mdef_convert -text tdt_sc_8k/mdef  tdt_sc_8k/mdef.txt

4.累加观察序列

    通过SphinxTrain训练工具带的bw程序去收集适应数据的统计数据。bw程序在sphinxtrain-1.0.7声学训练工具源码的bin.i686-pc-linux-gnu文件夹中。
(1)把bw 和 map_adapt和 mk_s2sendump和mllr_solve程序都拷贝到当前目录。
#cp ../sourcecode/sphinxtrain-1.0.7/bin.i686-pc-linux-gnu/bw .
#cp ../sourcecode/sphinxtrain-1.0.7/bin.i686-pc-linux-gnu/mk_s2sendump .
#cp ../sourcecode/sphinxtrain-1.0.7/bin.i686-pc-linux-gnu/map_adapt .
#cp ../sourcecode/sphinxtrain-1.0.7/bin.i686-pc-linux-gnu/mllr_solve .
(2)然后开始统计:
./bw -hmmdir tdt_sc_8k -moddeffn tdt_sc_8k/mdef.txt -ts2cbfn .semi. -feat 1s_c_d_dd -svspec 0-12/13-25/26-38 -cmn current -agc none -dictfn arctic20.dic -ctlfn arctic20.fileids -lsnfn arctic20.transcription -accumdir .
确保bw的参数和声学模型目录的feat.params文件一致;
       我刚才说过字典文件的建立的时候,以词语和单字为基本单元的时候,在这个步骤就会出现以下类似的错误:
……
utt>     0               arctic_0001stat_retry(arctic_0001..mfc) failed
ERROR: "corpus.c", line 1555: MFCC read of arctic_0001..mfc failed.  Retrying after sleep...
stat_retry(arctic_0001..mfc) failed
ERROR: "corpus.c", line 1555: MFCC read of arctic_0001..mfc failed.  Retrying after sleep...
stat_retry(arctic_0001..mfc) failed
 ……
utt>     0               arctic_0001  357INFO: cmn.c(175): CMN: 30.40 -1.07 -0.65 -0.24  1.70 -0.08 -0.39  0.05  0.59 -0.15  0.15  0.40  0.34 
 0WARNING: "mk_phone_list.c", line 173: Unable to lookup word '你确定吗' in the lexicon
WARNING: "next_utt_states.c", line 79: Segmentation fault (core dumped)
修改为句单元后,就没有问题了。

5.创建MLLR(最大似然线性回归算法)变换

    MLLR是一种有效的轻量级的自适应方法,尤其是当样本数据集较小时。在在线适应中使用MLLR是一种比较好的方法。MLLR在连续模型中表现得比较好,但是因为半连续模型很依赖混合权重,所以它的效果有限。如果想得到最好的准确度,最好将MLLR适应和MAP适应两种方法结合起来应用;
(1)下面我们产生MLLR变换,并在运行时将其传入解码器去适应这个声学模型。
#./mllr_solve -meanfn tdt_sc_8k/means -varfn tdt_sc_8k/variances -outmllrfn mllr_matrix -accumdir .
      这个命令行会产生一个名叫mllr_matrix的适应数据文件。现在,如果我们需要使用这个适应模型,那就可以通过给pocketsphinx命令行参数添加 -mllr mllr_matrix来使用;

6.通过MAP更新声学模型

 MAP是一个另外一种的适应方法。他不同于MLLR,他不会创建一个通用的变换,而是更新每个模型参数。
 (1)我们将原来的声学模型目录拷贝为一个新的模型目录,这个目录包含了改进了的模型文件:
#cp tdt_sc_8k/ -rf tdt_sc_8kadapt
(2)通过map_adapt程序实现改进声学模型:
#./map_adapt -meanfn tdt_sc_8k/means -varfn tdt_sc_8k/variances -mixwfn tdt_sc_8k/mixture_weights -tmatfn tdt_sc_8k/transition_matrices -accumdir . -mapmeanfn tdt_sc_8kadapt/means -mapvarfn tdt_sc_8kadapt/variances -mapmixwfn tdt_sc_8kadapt/mixture_weights -maptmatfn tdt_sc_8kadapt/transition_matrices

7.重新创建适应的sendump文件

       通过已经更新的mixture_weights文件来重新创建 sendump文件,这种改进可以节省空间声学模型空间:
注意:对于Sphinx4则无需创建sendump文件
#./mk_s2sendump -pocketsphinx yes -moddeffn tdt_sc_8kadapt/mdef.txt -mixwfn tdt_sc_8kadapt/mixture_weights -sendumpfn tdt_sc_8kadapt/sendump
    好了,恭喜你,现在你已经拥有一个改进了的适应你的语音的声学模型了。
新的声学模型在hub4wsj_sc_8kadapt目录下,目录有以下文件:
mdef
feat.params
mixture_weights
means
noisedict
transition_matrices
variances
    对于Sphinx4来说,声学模型的改进方法其实同PocketShinx一样的,除了Sphinx4改进的是连续的声学模型。

8.拷贝到我们的软件目录

#pocketsphinx_continuous -hmm <your_new_model_folder> -lm <your_lm> -dict <your_dict>
然后就可以使用了。其中的语言模型和字典文件用默认的即可。
总结:通过改进现有的声学模型,假如语料库句子数量较少,其识别率可以提升10%左右。如果已经通过改进,但是仍没有达到想要的效果,可以从以下两个方面改进:
(1)添加更多的改进数据;
(2)改进你的语言模型或者使用更好的语言模型。
参考:http://blog.csdn.net/zouxy09/article/details/7949126

六、改进现有的声学模型相关推荐

  1. Ajax 改造,第 3 部分: 用 jQuery、Ajax 选项卡和照片 carousel 改进现有的站点

    关于本文 Ajax 资源中心 请访问 Ajax 资源中心,这是有关 Ajax 编程模型信息的一站式中心,包括很多文档.教程.论坛.blog.wiki 和新闻.任何 Ajax 的新信息都能在这里找到. ...

  2. Ajax 改造,第 1 部分: 使用 Ajax 和 jQuery 改进现有站点

    Ajax 技术改变了大型商业 Web 应用程序的外观,但是许多较小的 Web 站点都不具备足够的资源重新构建完整的用户界面(UI).Ajax 的一些新特性能够解决实际中的界面问题并改善用户体验.本文将 ...

  3. PocketSphinx语音识别系统语言模型的训练和声学模型的改进

    PocketSphinx语音识别系统语言模型的训练和声学模型的改进 zouxy09@qq.com http://blog.csdn.net/zouxy09 关于语音识别的基础知识和sphinx的知识, ...

  4. [转]PocketSphinx语音识别系统语言模型的训练和声学模型的改进

    PocketSphinx语音识别系统语言模型的训练和声学模型的改进 zouxy09@qq.com http://blog.csdn.net/zouxy09 关于语音识别的基础知识和sphinx的知识, ...

  5. 优思学院|六西格玛设计方法IDDOV是什么?

    IDDOV是什么? IDDOV是六西格玛设计(DFSS)实现高绩效的方法模型之一,它是以客户为起点,以客户为终点.IDDOV将本來的定义(Define)阶段划分为两个模块,其中Identify侧重于将 ...

  6. 掌握这六步,搭建完美的机器学习项目

    全文共7778字,预计学习时长15分钟 上图白板展示了一系列机器学习项目启动 机器学习覆盖的范围十分广泛.这篇文章将整体描述机器学习适用的典型问题,提供实现机器学习项目雏形的框架. 首先厘清一些定义. ...

  7. 优思学院|六西格玛黑带的职责包括什么?

    经常都会有人希望知道正式的六西格玛黑带的职责通常包括哪些?六西格玛黑带日常的工作是什么?因为这些朋友们可能都在职业的探索阶段,在被这些知识吸引之余,却不知道自己是否有能力胜任成为一个六西格玛黑带. 六 ...

  8. 优思学院:六西格玛证书有用吗?有什么方法获取六西格玛证书?

    六西格玛绿带/黑带证书含金量相当高,优思学院和LSSPA在2020年做了一次中国六西格玛调查研究,根据这份调查报告,六西格玛黑带工资中位数在国内为20000元. 另外,受访者被问及六西格玛证书对他们的 ...

  9. 如何利用六西格玛制订战略计划?|优思学院

    制订战略计划(strategic planning)需要回答的核心问题是:"作为一家公司,我们现在的位置是什么?我们想变成什么样?以及我们怎么才能做到?"管理者需要制定有针对性的战 ...

最新文章

  1. 针对上上篇博文--仿优酷菜单---的bug修改
  2. OpenCV alpha(权因子) 融合举例
  3. jboss 7 as1 日志配置
  4. MyEclipse中导入java文件出现乱码问题的解决方法
  5. 庖丁解牛TLD(二)——初始化工作(为算法的准备)
  6. MATLAB产生线性等分量函数 linspace
  7. 阿群笔记:CentOS7 在线安装 docker 的推荐方法
  8. Android4清理代码缓存,Android清除应用缓存的两种方法
  9. 2022百度之星程序设计大赛 - 复赛 1003 最大值
  10. 安卓手机安装谷歌框架
  11. IDEA常用插件、设置、注释
  12. 关于购物网站的设计概念
  13. Pytorch实现性别识别,男女分类
  14. 实时系统vxWorks - 动态库、静态库建立及调用
  15. c++ 多边形求交集代码(凸多边形与凸多边形交集)
  16. 难做的IP游戏 究竟要如何才能跨时代持续成功?
  17. 269 t101 对称二叉树
  18. SCT52240STDR,SCT52240MTER,SCT52240QSTDR,SCT52240QMTER,栅极驱动器
  19. DotAsterisk(点星PBX)IPPBX V4.1下载地址
  20. 写给Krpano小白们的最最最入门级教程(二)

热门文章

  1. FZU 1921 栀子花开
  2. Android中userId的作用
  3. 【cortex-m3/m4/m7常见死机、跑飞、异常、hardfault等查找方法】
  4. 【网络安全学习】渗透测试篇02-数据截取教程(上)
  5. 前端常用的地图框架(webGIS)
  6. 计算机思维导论优课在线答案,吉大20秋《现代远程学习概论》在线作业题目【标准答案】...
  7. AR VR手势交互新选择,uSens凌感推出Fingo技术
  8. java替换花括号_java – 用其他东西替换花括号内的内容(例如{1})[复制]
  9. VMware workstation 不可恢复错误(vcpu-0)
  10. Android 页面跳转时闪屏问题