Java代码   收藏代码
  1. text2wfreq < weather.txt | wfreq2vocab > weather.tmp.vocab  
 

最近研究Android上的语音识别,在此记录下遇到的问题。

先引用一篇博文,http://leiwuluan.iteye.com/blog/1287305。根据这篇博文的内容,要是没遇到问题的话,应该可以生成一个apk,在手机上可以运行,能进行识别,但是效率很低,识别率也不咋地。现在我们需要自己来构建识别的库。

根据代码

Java代码   收藏代码
  1. c.setString("-dict",  
  2.                 "/sdcard/Android/data/edu/edu.cmu.pocketsphinx/lm/zh_CN/mandarin_notone.dic");  
  3.         c.setString("-lm",  
  4.                 "/sdcard/Android/data/edu/edu.cmu.pocketsphinx/lm/zh_CN/gigatdt.5000.DMP");  

 程序会引用到两个文件,第一个是字典文件,第二个是声音模型文件,程序先将输入的声音和声音模型文件对比,生成音节编码,再将音节编码在字典中查找,返回最后的字符结果。Sphinx是个很完善的引擎,除了开源之外,官方还提供了各种工具供开发者构建自己的声音对比模型,字典,记忆语言模型。本文参考http://cmusphinx.sourceforge.net/wiki/tutoriallm,用CMUCLMTK构建自己的语言模型。

1.首先,假设你已经根据本文开头的那篇博文成功编译了PocketSphinx并且成功在手机上运行。

2.下载CMUCLMTK,http://sourceforge.net/projects/cmusphinx/files/cmuclmtk/0.7/cmuclmtk-0.7.tar.gz/download

3.将下载的文件解压到Sphinx根目录,参见开篇引用博文。

4.命令行下进入到CMUCLMTK目录,我的为

Java代码   收藏代码
  1. /workspace/VoiceRecognition/cmuclmtk-0.7#   

我的电脑系统是linux,如果是windows需要用cgwin

5. ./configure

6.make install

7.cd src

8.make install

9.在4的目录下,新建weather.txt,输入

Java代码   收藏代码
  1. <s> generally cloudy today with scattered outbreaks of rain and drizzle persistent and heavy at times </s>  
  2. <s> some dry intervals also with hazy sunshine especially in eastern parts in the morning </s>  
  3. <s> highest temperatures nine to thirteen Celsius in a light or moderate mainly east south east breeze </s>  
  4. <s> cloudy damp and misty today with spells of rain and drizzle in most places much of this rain will be   
  5. light and patchy but heavier rain may develop in the west later </s>  

 10.命令行下输入,

Java代码   收藏代码
  1. text2wfreq < weather.txt | wfreq2vocab > weather.tmp.vocab  

  这时报错,如下

Java代码   收藏代码
  1. text2wfreq: error while loading shared libraries: libcmuclmtk.so.0: cannot open shared object file: No such file or directory  

 参考error while loading shared libraries解决。

11.输入

Java代码   收藏代码
  1. text2idngram -vocab weather.tmp.vocab -idngram weather.idngram < weather.txt  
 

12.输入

Java代码   收藏代码
  1. idngram2lm -vocab_type 0 -idngram weather.idngram -vocab weather.tmp.vocab -arpa weather.arpa  

 如果无误,在目录下会生成weather.tmp.DMP文件。

官网说在http://www.speech.cs.cmu.edu/tools/lmtool.html也可以在线提交txt文件,在服务器生成DMP文件,但是我在试的时候,发现访问不了,可能是太多人用了,CMU把这个服务给关了?

 

哈哈,在查资料的时候,又发现有这方面的博文,再引用一下,http://www.cnblogs.com/huanghuang/archive/2011/07/14/2106579.html,http://archive.cnblogs.com/a/2111834/,http://www.cnblogs.com/huanghuang/archive/2011/07/18/2109101.html,这三篇应该讲的很全面了。


Android平台使用PocketSphinx做离线语音识别,小范围语音99%识别率

最近语音识别很火,但是都是用的在线语音识别,研究了一下离线语音识别,小范围内的语音识别率还不错,在此记录一下

首先本文要说的两个前提1.android平台离线语音识别 2.小范围语音

小范围语音指的是相对固定的命令。本文的例子大概实现了20条语音命令,超出范围的无法识别。因此本文中离线语音的使用范围也有限,对于一些固定的输入可能有用,比如用语音命令代替打开,播放,重启这些简单的固定的命令。

先上个例子

1.按照 http://leiwuluan.iteye.com/blog/1287305 的方法,先跑一个PocketSphinxDemo的例子起来。跑起来之后会发现语音识别率很低,大概20%不到。下面来优化一下

2.编写自己的命令集

<s>左转</s>
<s>右转</s>
<s>向左转</s>
<s>向右转</s>
<s>打开</s>
<s>搜索</s>
<s>播放</s>

保存为command.txt

在http://www.speech.cs.cmu.edu/tools/lmtool.html上点Browse,提交command.txt,在线生成语言模型文件。

3.在网站上会生成一个.tar.gz文件,下载后解压,其中有一个dic和lm文件,拷出来

4.替换语言模型文件。在1中的demo里面,要将指定声音文件和语言模型文件,在RecognizerTask.RecognizerTask()里,有一段

  c.setString("-hmm", "/sdcard/Android/data/test/hmm/tdt_sc_8k");
  c.setString("-dict", "/sdcard/Android/data/test/lm/test.dic");
  c.setString("-lm", "/sdcard/Android/data/test/lm/test.lm");

将3中生成的lm和dic文件分别放到sd卡的上述目录

将 http://downloads.sourceforge.net/project/cmusphinx/pocketsphinx/0.7 /pocketsphinx-0.7.tar.gz?r=http%3A%2F %2Fsourceforge.net%2Fprojects%2Fcmusphinx%2F&ts=1332729739& use_mirror=nchc下载的pocketsphinx下面的model/hmm/zh/tdt_sc_8k 下的文件放到/sdcard/Android/data/test/hmm目录下

附件中的data是我使用的文件,可以直接解压后放到sd卡的以上目录,注意,tdt_sc_8k是一个文件夹不是文件

5.文件准备完毕,重新跑1中的demo。语音输入2中的命令,识别率99%以上,但是输入命令集以外的无法识别。

6.附件为工程文件,将data解压,按照工程中4里面写的位置放到sd卡里面即可

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐