本文由

两篇博文整理而来,并进行了验证。

一:Sphinx简介

Sphinx是由美国卡内基梅隆大学开发的大词汇量、非特定人、连续英语语音识别系统。Sphinx从开发之初就得到了CMU、DARPA等多个部门的资助和支持,后来逐步发展为开源项目。目前CMU Sphinx小组开发的下列译码器:

  • Sphinx-2采用半连续隐含马尔可夫模型(SCHMM)建模,采用的技术相对落后,使得识别精度要低于其它的译码器。
  • PocketSphinx是一个计算量和体积都很小的嵌入式语音识别引擎。在Sphinx-2的基础上针对嵌入式系统的需求修改、优化而来,是第一个开源面向嵌入式的中等词汇量连续语音识别项目。识别精度和Sphinx-2差不多。
  • Sphinx-3是CMU高水平的大词汇量语音识别系统,采用连续隐含马尔可夫模型CHMM建模。支持多种模式操作,高精度模式扁平译码器,由Sphinx3的最初版本优化而来;快速搜索模式树译码器。目前将这两种译码器融合在一起使用。
  • Sphinx-4是由JAVA语言编写的大词汇量语音识别系统,采用连续的隐含马尔可夫模型建模,和以前的版本相比,它在模块化、灵活性和算法方面做了改进,采用新的搜索策略,支持各种不同的语法和语言模型、听觉模型和特征流,创新的算法允许多种信息源合并成一种更符合实际语义的优雅的知识规则。由于完全采用JAVA语言开发,具有高度的可移植性,允许多线程技术和高度灵活的多线程接口。

为了可以更好的理解下面安装的是什么工具,这些工具有什么作用,可以先了解下语音识别的基础知识和sphinx的知识,可以参考博文:

语音识别的基础知识与CMUsphinx介绍:

二:在UBUNTU PC上安装PocketSphinx



需要安装的依赖包:

# sudo apt-get install libasound2-dev bison

需要下载的软件包:

  • Pocketsphinx —用C语言编写的轻量级识别库,主要是进行识别的。
  • Sphinxbase — Pocketsphinx所需要的支持库,主要完成的是语音信号的特征提取;
  • CMUclmtk —语言模型训练工具
  • Sphinxtrain —声学模型训练工具

下载网址:http://sourceforge.net/projects/cmusphinx/files/

各软件包的安装:

1.Sphinxbase的安装

由于pocketsphinx依赖于另外一个库Sphinxbase。所以先需要安装Sphinxbase

# ./configure
# make
# make install
包默认安装在/usr/local/bin下面。可以在配置时用–prefix指定自定义的安装路径,但最好使用默认的安装路径,否则的话需要自己添加这些库的路径进环境变量中。

2.Pocketsphinx的安装


先把Sphinxbase的库的路径进环境变量中。通过:

export LD_LIBRARY_PATH=/usr/local/lib //这个一般系统都已经加进去了

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig //指明Sphinxbase的.pc文件所在的路径,这样pkg-config工具就可以根据.pc文件的内容动态生成编译和连接选项,比如cflags(编译用的头文件)和libs(连接用的库)。


然后利用configure,make,makeinstall编译安装。默认安装在/usr/local/bin下。

测试:

运行以下命令:#pocketsphinx_continuous

若出现如下信息,说明安装成功。


INFO: Parsing command line:


pocketsphinx_continuous


…………………………………. 


Warning: Could not find Mic element


INFO: continuous.c(261):pocketsphinx_continuous COMPILED ON: Feb 21 2011, AT: 22:31:47


READY....

3.安装语言模型训练工具CMUCLMTK:



利用configure,make,makeinstall编译安装。默认安装在/usr/local/bin下面,可以看到下面这些生成文件:

idngram2lm idngram2stats mergeidngramtext2idngram text2wfreq text2wngram wfreq2vocab

4.安装声学模型训练工具sphinxtrain:



#./configure

#make

这里没有makeinstall的安装过程,因为sphinxtrain只是包含了用来训练声学模型的Perl和Python脚本,还有一些工具命令。


所以我们还需要安装Perl和Python工具来使用这些脚本:

# apt-get install perl

# apt-get install python

如何获得语言模型和声学模型:

语言模型和声学模型主要来源于3个方面:

1.源码自带:

pocketsphinx-0.7/model/hmm/zh/tdt_sc_8k目录下是中文的声学模型

pocketsphinx-0.7/model/lm/zh_CN 目录下是中文的语言模型

这些模型已经被安装(拷贝)到了 /usr/local/share/pocketsphinx/model目录下。(hmm表示隐马尔可夫声学模型,lm表示language>

2.网上下载:

CMU sphinx的官网提供了各种语言的声学模型和语言模型的下载,具体见:

http://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/

其中也有中文的:



  • 声学模型:zh_broadcastnews_16k_ptm256_8000.tar.bz2
  • 语言模型:zh_broadcastnews_64000_utf8.DMP
  • 字典文件:zh_broadcastnews_utf8.dic


3.自行训练得到:

因为每个人的声音不一样,另外应用也不一样(所需词汇类别和不同),所以别人的模型可能在自己的语音下识别准确率不高,这样就需要训练自己的声学模型和语言模型(CMU也提供一个改进现有声学模型的方法)。


声学模型文件夹内容说明:


下载下来的声学模型解压后会在当前文件夹生成一个包含以下八个文件的文件夹。

zh_broadcastnews_ptm256_8000/

├──feat.params //HMM模型的特征参数

├── mdef //模型定义文件(为每个即将进行训练的HMM的每一状态定义一个独特的数字标识)

├── means //混合高斯模型的均值

├── mixture_weights//混合权重

├── noisedict//噪声也就是非语音字典

├── sendump //用来从声学模型中获取mixture_weights文件的??

├──transition_matrices //HMM模型的状态转移矩阵

└── variances//混合高斯模型的方差

利用语言模型和声学模型进行识别:

然后我们执行:

#pocketsphinx_continuous -hmm  zh_broadcastnews_ptm256_8000   -lm zh_broadcastnews_64000_utf8.DMP -dict   zh_broadcastnews_utf8.dic


  • -hmm选项指定声学模型文件夹
  • –lm选项指定语言模型
  • –dict选项指定字典文件


pocketsphinx会分析你传入的文件取得模型和识别的参数,然后显示出来识别结果。

在麦克风输入时,两者的最长语音时间为5秒,前者是通过说话人的正常语句停顿作为断句的分割点,并将停顿之前的语音信号作为一个处理段。

三:PocketSphinx向ARM开发版移植

1.前提条件是先向开发板中移植alsa语音库。

参见:

2.移植sphinxbase库:

和在PC上编译一样,首先编译sphinxbase-0.7,此处和在pc端配置不同,需要指定自己编译出alsa库的安装位置,输入以下配置:

./configure \

--prefix=/home/adai/talon/work/pcapp/pocketsphinx/omap\

--host=”交叉编译器前缀“ \

LDFLAGS="-L/home/adai/talon/work/alsafortarget/alsalib/lib"\

CFLAGS="-I/home/adai/talon/work/alsafortarget/alsalib/include"

需要确保你的交叉编译工具链已经安装,并且环境参数已经设置好。指定交叉编译出的alsa库的位置(这一步非常关键,否则会出现打不开声音设备的问题),其次确保已经将该库移植到板子上。然后,make、make install

最后,将生成的pocketsphinx_continuous连通编译出来的库拷贝到开发板上,在开发板上输入以下命令测试:

./pocketsphinx_continuous -hmm my_db.cd_cont_100 -lm my_db.lm.DMP -dict my_db.dic