sphinx中文语音训练手册

时间:2016-05-19 04:27:41
【文件属性】:

文件名称:sphinx中文语音训练手册

文件大小:53.17MB

文件格式:RAR

更新时间:2016-05-19 04:27:41

sphinx 中文 语音 训练 手册

本文档介绍Sphinx4在Windows下的中文训练过程及注意事项,与本文档配套的是我自己的训练实例bergtrain和用到的软件。 本文档编写日期 2013-04-23 1、为什么要训练? sphinx4目前的版本中仅提供了英文等语音识别库。中文的库是PTM或semi类型的,在java版sphinx中无法使用。 2、Sphinx的训练指哪些内容? 在Sphinx中有语言模型、声学模型等概念,如果你不想了解这些,请参考以下内容: a1、中文每个字的标准发音已经有一个较为全面的文件进行了标注 这个文件就是zh_broadcastnews_utf8.dic(下称这类文件为发音字典),在sphinx网站上可以下载,我们也包含了它。 下面是该文件的片断,它用类似拼音的方式标注了每个字或词的发音。 昌 ch ang 昌北 ch ang b ei 昌必 ch ang b i 昌都 ch ang d u 昌赫 ch ang h e a2、需要告诉sphinx我们经常使用的字、词是哪些,它们出现的频率如何 由于开放式语音识别尚难实现,所以sphinx实际上只能较好的处理相对小的语言集合。 因此,针对特定的领域,告诉sphinx该领域的词汇和各词出现的频率将极大提高识别率。 a3、需要告诉sphinx每个字、词的真正读音 发音字典告诉sphinx每个字的标准读音,但面对的说话人往往不会以标准读音来朗读。 因此sphinx需要学习说话人的“口音”。 如果训练时的读者发音比较标准,则sphinx能“举一反三”,识别其他不那么标准的读者的语音。 推荐的做法是训练一些典型的口音:标准男、女声,童音,最后再考虑特定用户的口音。 3、如何准备训练内容所需的原料? 需要准备两大内容:1)文本语料文件,2)语料录音文件。 文本语料文件给出2.a2中需要的内容,在bergtrain的etc文件下的berginput.txt文件就是一个预料文件。 它以行为单位,给出了150个中文句子。 语料录音文件是根据文本语料文件,朗读它的每行/句话,保存到每一个语音文件即可。 语料文件中的语句应该尽量选择领域相关的,在覆盖领域内名词的前提下,覆盖尽可能多的通用词汇。 4、训练环境及注意事项 本文的训练软硬件如下: 硬件:T60P笔记本,机器自带录音设备;操作系统为Win7 32位。 软件:Sphinx cmuclmtk-0.7-win32.zip pocketsphinx-0.8-win32.zip sphinxbase-0.8-win32.zip sphinxtrain-1.0.8-win32.zip sphinx4-1.0beta6-bin.zip,用于编写java版的识别软件所需的库 脚本执行软件 ActivePerl-5.16.3.1603-MSWin32-x86-296746.msi ActivePython-2.7.2.5-win32-x86.msi 录音和处理软件 audacity-win-2.0.3rc1.zip,可进行录音和声音文件处理(如降噪),免费软件 FairStars.zip,可进行批量录音(V3.5绿色版) 文本编辑软件UltraEdit,UltraEdit-32.rar绿色版 注意: 文件格式 语料文件必须使用UltraEdit进行编辑, 在编辑后,使用 文件-转换-ASCII转UTF-8(UNICODE编辑),指定文件中的中文使用utf8编码。 在保存前,设置格式如下: 换行符:UNIX终束符 - LF 指定文件中的回车/换行符为编码0A的换行符 格式:UTF-8 - 无BOM 每个文件的末尾必须有一个回车! 这个回车将在保存时被替换为编码0A的换行符,训练脚本需要这个符号来确认文件的结束。 录音文件 如果你不希望去编辑训练中的配置文件,则在使用FairStars录音时作如下设定: 进入菜单和对话框 选项-显示录音选项-编码-WMA, 设定:采样率(16000Hz)、通道(单声道)、比特率(16Kbps) 5、训练步骤 下面逐步从零开始进行训练 5.1 软件环境的安装 将本文档所在的文件夹解压或拷贝到d:\,即本文档路径是d:\sphinxtrain\Sphinx中文训练教程.txt 1)点击安装ActivePerl-5.16.3.1603-MSWin32-x86-296746.msi和ActivePython-2.7.2.5-win32-x86.msi; 2)解压Sphinx中除sphinx4-1.0beta6-bin.zip外的压缩文件到d:\sphinxtrain下 3)安装audacity-win-2.0.3rc1.zip和FairStars.zip 4)安装UltraEdit-32.rar(绿色,解压即可) 5.2 准备文本语料 这里需要使用我们提供的脚本对berginput.txt进行处理,得到所需的文件。 1)将d:\sphinxtrain\cnprepare.py剪切到D:\sphinxtrain\sphinxtrain-1.0.8-win32\python目录。 2)将d:\sphinxtrain\jieba.rar解压到D:\sphinxtrain\sphinxtrain-1.0.8-win32\python目录, 确保jieba.rar中的文件dict.txt解压后的目录是D:\sphinxtrain\sphinxtrain-1.0.8-win32\python\jieba\dict.txt jieba.rar是一个python下的中文分词模块,主页是https://github.com/fxsjy/jieba 3)打开一个DOS命令行(这个应该都知道吧),运行下面的命令 python D:\sphinxtrain\sphinxtrain-1.0.8-win32\python\cnprepare.py D:\sphinxtrain\zh_broadcastnews_utf8.dic D:\sphinxtrain\bergtrain\etc\berginput.txt D:\sphinxtrain\bergtrain\etc\bergtrain.txt D:\sphinxtrain\bergtrain\etc\bergtrain_train.transcription D:\sphinxtrain\bergtrain\etc\bergtrain.dic D:\sphinxtrain\bergtrain\etc\bergtrain_train.fileids cnprepare.py命令的格式是cnprepare dictMapFile是发音字典文件,上面的是zh_broadcastnews_utf8.dic,我们删除里面的数字和英文。 inFile是准备好的领域内语料文本,例如berginput.txt里关于图形用户界面和语音朗读、计算机方面的文本。 txtFile是将输出用于sphinx进行统计的语料文件 tranFile是sphinx中的transcription文件,它告诉sphinx将要训练的语句有哪些。 dicFile是transcription文件语句中所有单词的发音字典,显然它是dictMapFile的一个覆盖inFile的子集。 fileids告诉sphinxtranscription文件中每条语句对应的发音文件。 上面的命令行为我们准备好了训练时需要的语料信息,还有三个文件需要准备: bergtrain.filler 告诉sphinx,transcription文件中一些不需要处理的哑元符号,这个文件已经自带了。 bergtrain_test.fileids bergtrain_test.transcription 用于测试的transcription文件和语音对应文件,可以直接拷贝用于训练的两个文件,命令行如下: copy D:\sphinxtrain\bergtrain\etc\bergtrain_train.transcription D:\sphinxtrain\bergtrain\etc\bergtrain_test.transcription copy D:\sphinxtrain\bergtrain\etc\bergtrain_train.fileids D:\sphinxtrain\bergtrain\etc\bergtrain_test.fileids 5.3 录音 如果打开5.2中生成的bergtrain_train.fileids文件,可以看到一下片断: speaker_1/1_1 speaker_1/1_2 speaker_1/1_3 speaker_1/1_4 speaker_1/1_5 speaker_1/1_6 它告诉sphinx在训练时如何找到句子的读音。以speaker_1/1_4为例,它指示sphinx, 对于bergtrain_train.transcription中的第4个句子,读音文件是 D:\sphinxtrain\bergtrain\wav\speaker_1\1_4.wav。 读音文件的格式和扩展名可以在后面生成的训练配置文件中修改,幸运的是如果按照4中的格式进行录音,就不需要修改。 录音可以采用FairStars软件,它支持批量录音,设定你喜欢的快捷键,可以使你的录音过程轻松得多。 好吧,我们提供了一份个人的录音文件,原始信息在D:\sphinxtrain\bergtrain\wav原始\speaker_1中, D:\sphinxtrain\bergtrain\wav\speaker_1中的是经过audacity进行归一化处理的语音文件。 6、开始训练 我们已经按照sphinx的教程准备好了训练用的命令行,分为三部分:生成训练目录、语料预处理、训练与测试。 6.1 使用下面的命令行,告诉sphinx我们要在bergtrain目录下进行训练 rem 进入bergtrain目录 cd D:\sphinxtrain\bergtrain d: rem 建立训练环境bergtrain rem 会在bergtrain目录下生成etc目录(feat.params和sphinx_train.cfg) python D:\sphinxtrain\sphinxtrain-1.0.8-win32\scripts\sphinxtrain -t bergtrain setup 6.2 语料预处理的脚本如下,拷贝到命令行中运行即可: rem 进入etc目录 cd D:\sphinxtrain\bergtrain\etc\ d: rem 将语料文件转换生成DMP文件 D:\sphinxtrain\cmuclmtk-0.7-win32\text2wfreq < bergtrain.txt > bergtrain.wfreq D:\sphinxtrain\cmuclmtk-0.7-win32\wfreq2vocab < bergtrain.wfreq > bergtrain.vocab D:\sphinxtrain\cmuclmtk-0.7-win32\text2idngram -vocab bergtrain.vocab -idngram bergtrain.idngram < bergtrain.txt D:\sphinxtrain\cmuclmtk-0.7-win32\idngram2lm -idngram bergtrain.idngram -vocab bergtrain.vocab -arpa bergtrain.arpa D:\sphinxtrain\sphinxbase-0.8-win32\bin\Release\sphinx_lm_convert -i bergtrain.arpa -o bergtrain.lm.DMP rem 生成.phone文件 D:\sphinxtrain\sphinxtrain-1.0.8-win32\scripts\prepare\make_phoneset.pl bergtrain.dic bergtrain.filler > bergtrain.phone 6.3 训练和测试的脚本你如下,拷贝到命令行中运行即可。训练的时间根据语料多少和机器性能而定,我的训练花了5分钟的样子。 rem 进入bergtrain目录 cd D:\sphinxtrain\bergtrain d: rem 开始进行运行训练 python D:\sphinxtrain\sphinxtrain-1.0.8-win32\scripts\sphinxtrain run rem 运行测试,可以不执行测试 python D:\sphinxtrain\sphinxtrain-1.0.8-win32\scripts\sphinxtrain -s decode run 7、试验和使用 训练完毕,将需要的文件拷贝到test目录中,运行命令进行朗读测试,所需的脚本如下: rem 拷贝需要的文件 rem 创建目标目录并拷贝数据文件 md D:\sphinxtrain\bergtrain\test\bergtrain.cd_cont_200 copy /Y D:\sphinxtrain\bergtrain\model_parameters\bergtrain.cd_cont_200\*.* D:\sphinxtrain\bergtrain\test\bergtrain.cd_cont_200\ rem 拷贝字典和语料文件 copy /Y D:\sphinxtrain\bergtrain\etc\bergtrain.dic D:\sphinxtrain\bergtrain\test\bergtrain.dic copy /Y D:\sphinxtrain\bergtrain\etc\bergtrain.lm.DMP D:\sphinxtrain\bergtrain\test\bergtrain.lm.DMP rem 进入测试目录,启动测试程序 cd D:\sphinxtrain\bergtrain\test d: pocketsphinx_continuous -hmm bergtrain.cd_cont_200 -lm bergtrain.lm.DMP -dict bergtrain.dic 开始测试后,可以朗读内容,例如“计算机”,会有如下的输出。 INFO: ngram_search.c(1266): lattice start node .0 end node 璁$畻鏈?2 INFO: ngram_search.c(1294): Eliminated 40 nodes before end node INFO: ngram_search.c(1399): Lattice has 84 nodes, 1 links INFO: ps_lattice.c(1365): Normalizer P(O) = alpha(璁$畻鏈?2:104) = -256768 INFO: ps_lattice.c(1403): Joint P(O,S) = -256768 P(S|O) = 0 INFO: ngram_search.c(888): bestpath 0.00 CPU 0.000 xRT INFO: ngram_search.c(891): bestpath 0.01 wall 0.010 xRT 000000002: 璁$畻鏈? READY.... 注意,由于编码的原因,出现的是乱码,拷贝该乱码; 到ultraedit中,新建一个文件,粘贴,使用utf8转ascii,就可以看到正确的内容了。 上面的貌似被识别成了(计算暿)。 在sphinx4的java中使用上面训练的成果,简单的方法是将bergtrain.cd_cont_200目录下的文件连同 bergtrain.dic、bergtrain.lm.DMP文件,放入一个目录(如bergtrain),将该目录压缩为一个zip文件, 重命名为jar文件,然后参考sphinx4的hello world修改其中的配置文件,使之使用我们提供的jar包即可。 注意,要把jar包放到classpath哦。 经过个人的测试,识别率还是比较高的。 8、总结与问题 总的来讲,训练时只需要提供语料文件和录音文件,形式上比较简单,但要给一个好的语料文件还需要不断试验。 上面的步骤和脚本都是根据sphinx的文档来的。需要注意的是,版本不同,内容可能也会不同。 8.1 中文的字和词的问题 中文和英文的一个差别是:英文的单词之间有空格,而中文没有。而sphinx显然是按照空格来划分单词的。 因此,进行中文训练前需要进行分词,即为字和词之间添加空格。例如: 命令的层次根据应用程序的不同而不同。 将被分为: 命令 的 层次 根据 应用程序 的 不同 而 不同 当然,你也可以直接将它分割为单个的字,即: 命 令 的 层 次 根 据 应 用 程 序 的 不 同 而 不 同 分词的优点是“可能”提高识别率。 由于中文的这一特点,在java中使用sphinx定义语法文件时,需要做额外的工作。 例如定义下面的语法 (我们) (是|不是) (好孩子 | 计算机高手) 可能会因为bergtrain.dic中不存在“计算机高手”而报错,解决的办法如下: 1、复杂型:使用分词将“计算机高手”划分到bergtrain.dic所包含的 “计算机 高手”。 2、简单型:直接添加空格,划分为“计 算 机 高 手”。 总之就是要使每个词在bergtrain.dic中,同时又符合语法。 8.2 中文、英文和数字的混合训练 在语料文件中添加包括英文和数字的语句, 在发音字典中确保新的单词和数字有对应的发音即可。 结巴分词可以处理中文、英文和数字混合的文件。 ——你可以按照上面的教程直接进行训练,而无需下载附件。当然,下载后评价一下,也可以回收你的1分。 由于csdn的文件大小限制,只能将用到的软件都删除了,请自行下载或找我直接要吧。


网友评论

  • 不咋地,识别效果不好
  • 谢谢,写的很好,只是不能通过,有完整版的能发份我吗?谢谢,121607800@qq.com,请多多指教
  • 很好的 东东。
  • 还不错,指了个路,还是自己下载编译最新版本吧
  • 不错的资源,谢谢分享!
  • 不错的资料...
  • 比较详细的一份文档
  • 对我的帮助很大,
  • 很好的资料说的很详细
  • Estimated Total Hours Training: 0.0113833333333333 ERROR: Not enough data for the training, we can only train CI models (set CFG_CD_TRAIN to "no")
  • 文档很好很有用,我按照步骤也生成了声音模型,把他打成jar放到工程里面的时候,说不能加载。不知道作者能不能提供一个jar,可以让我们测试一下是不是生成的模型有问题。
  • 有语音训练文件、字典,使用步骤,内容详细,值得推荐。
  • 挺有趣的回去试试,顺便搭个服务器
  • 识别率怎么这么低???还不如自己用lmtool搞的呢?哪儿错了?
  • 对我探究语音识别用处大
  • 对我的帮助很大,我找了很久的资料才找到这套,谢谢分享
  • 看着挺详细的,但是还没实际操作,希望能有用,谢谢楼主
  • 不错的文档,谢谢。。
  • 中文的帮助,可以很快入门
  • 不错的文档,谢谢。。
  • 很详细的,最后那个乱码解决的方法不好用,自己写了个转换的代码搞定
  • 资源和教程都很好!最后那个乱码的问题有点揪心。不知哪位大侠解决了,教下我们!感激不尽!
  • 非常不错的中文语音训练手册,收获多多!
  • 不错,正在看,希望有所收获。
  • 不错,学到了很多,谢谢
  • 感谢分享,资源不错,正是需要的。
  • 这个稳当比较艰涩,我读了很久才搞定。而且识别效率不是特别好。
  • 帮助挺大的
  • sphinx是非常经典的语音识别开源工具。好东西
  • 准备做语音,先看看