http://blog.csdn.net/zouxy09

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

Sphinx-2 采用半连续隐含马尔可夫模型( SCHMM )建模,采用的技术相对落后,使得识别精度要低于其它的译码器。

PocketSphinx 是一个计算量和体积都很小的嵌入式语音识别引擎。在 Sphinx-2 的基础上针对嵌入式系统的需求修改、优化而来,是第一个开源面向嵌入式的中等词汇量连续语音识别项目。识别精度和 Sphinx-2 差不多。

Sphinx-3 CMU 高水平的大词汇量语音识别系统,采用连续隐含马尔可夫模型 CHMM 建模。支持多种模式操作,高精度模式扁平译码器,由 Sphinx3 的最初版本优化而来;快速搜索模式树译码器。目前将这两种译码器融合在一起使用。

Sphinx-4 是由 JAVA 语言编写的大词汇量语音识别系统,采用连续的隐含马尔可夫模型建模,和以前的版本相比,它在模块化、灵活性和算法方面做了改进,采用新的搜索策略,支持各种不同的语法和语言模型、听觉模型和特征流,创新的算法允许多种信息源合并成一种更符合实际语义的优雅的知识规则。由于完全采用 JAVA 语言开发,具有高度的可移植性,允许多线程技术和高度灵活的多线程接口。

针对不同的应用和平台选用不同版本的引擎。因为我是需要把语音识别融合到我的人机交互系统上面的,而且未来还会移植到嵌入式平台上面,所以我选择了 PocketSphinx 语音识别引擎来提供语音识别功能。

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

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

http://blog.csdn.net/zouxy09/article/details/7941585

一、使用平台

Ubuntu12.04

还需要安装的包:

# sudo apt-get install libasound2-dev bison

二、 CMUSphinx 语音识别工具包下载

Pocketsphinx —用 C 语言编写的轻量级识别库,主要是进行识别的。

Sphinxbase Pocketsphinx 所需要的支持库,主要完成的是语音信号的特征提取;

Sphinx3 —为语音识别研究用 C 语言编写的解码器

Sphinx4 —为语音识别研究用 JAVA 语言编写的解码器

CMUclmtk —语言模型训练工具

Sphinxtrain —声学模型训练工具

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

我们只需要下载以下四个最新版本的工具包即可:

sphinxbase-0.7 pocketsphinx-0.7 sphinxtrain-1.0.7 cmuclmtk-0.7

三、 安装工具包

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

1 )安装 Sphinxbase

#tar -xzf sphinxbase-0.7.tar.gz

#cd sphinxbase-0.7

#./configure

#make

# make install

注意: ./configure 将会检查你的系统是否具有其编译所需要的所有包,如果没有的话,它会提示缺少什么包,例如缺少“ bison ”,那么我们需要对它进行安装:

// 搜索包含“ bison ”关键字的包,因为有些包可能不是这样命名的,后面可能会加个 -dev 表示开发板,前面也可能加个 lib 表示库等等。但这里搜索了,包的名字就是 bison

#apt-cache search bison

// 然后就下载相应的包安装即可

#apt-get install bison

安装完缺少的包后,继续执行 ./configure ,以后遇到类似情况同样处理。

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

2 )安装 pocketsphinx

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

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

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig  // 这个 PKG_CONFIG_PATH 主要指明 Sphinxbase .pc 文件的所在路径,这样 pkg-config 工具就可以根据 .pc 文件的内容动态生成编译和连接选项,比如 cflags (编译用的头文件)和 libs (连接用的库),至于说 pkg-config 的具体细节?百度下就知道了,了解这个工具非常有用。

另外,环境变量的设置只对当前的终端窗口有效,新建一个新的终端或者重启系统之后,需要重新设置 PKG_CONFIG_PATH 。所以我们可以通过编辑系统的链接文件 /etc/ld.so.conf 去使其长期有效,如下:

#vi /etc/ld.so.conf

打开后,在新的一行添加(每一个路径一行):

/usr/local/lib

/usr/local/lib/pkgconfig

然后,执行:

#ldconfig

使其生效( ldconfig /etc/ld.so.conf 列出的路径下的库文件缓存到 /etc/ld.so.cache 以供使用,系统是通过读取这个库列表文件来加快搜索链接路径的速度的)。

然后开始编译安装:

#tar -xzf pocketsphinx-0.7.tar.gz

#cd pocketsphinx-0.7

#./configure

#make

#sudo make install

默认安装在 /usr/local/bin 下。

测试下安装结果:

#pocketsphinx_continuous

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

INFO: cmd_ln.c(512): Parsing command line:

pocketsphinx_continuous

Current configuration:

[NAME] [DEFLT] [VALUE]

-adcdev

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

…………………………………

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

Warning: Could not find Mic element

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

READY....

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

顺便把语言模型训练工具也安装上,因为后面需要用到(当然,如果你采用的是现成的模型的话,那就不需要安装这个工具),安装过程其实都是一样的。

#tar -xzf cmuclmtk-0.7.tar.gz

#cd pocketsphinx-0.7

#./configure

#make

#sudo make install

默认安装在 /usr/local/bin 下面,可以看到下面这些生成文件

idngram2lm   idngram2stats      mergeidngram     text2idngram

text2wfreq    text2wngram       wfreq2vocab

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

顺便把声学模型训练工具也安装上,因为后面需要用到(当然,如果你采用的是现成的模型的话,那就不需要安装这个工具),安装过程其实都是一样的。

#tar -xzf sphinxtrain-1.0.7.tar.gz

#cd pocketsphinx-0.7

#./configure

#make

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

所以我们还需要下载 Perl Python 工具来使用这些脚本:

他们的网址: http://www.perl.org http://www.python.org/download/

ubuntu 就是好啊, apt-get 就行:

# apt-get install perl

# apt-get install python

四、获得语言模型和声学模型

语言模型和声学模型的来源有以下三个方面:我们这里主要讲中文的。

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 model 语言模型)

├── hmm

├── en

└── tidigits

├── feat.params

├── mdef

├── means

├── sendump

├── transition_matrices

└── variances

├── en_US

└── hub4wsj_sc_8k

├── feat.params

├── mdef

├── means

├── noisedict

├── sendump

├── transition_matrices

└── variances

└── zh

└── tdt_sc_8k

├── feat.params

├── mdef

├── means

├── noisedict

├── sendump

├── transition_matrices

└── variances

└── lm

├── en

├── tidigits.dic

├── tidigits.DMP

├── tidigits.fsg

├── turtle.dic

└── turtle.DMP

├── en_US

├── cmu07a.dic

├── hub4.5000.DMP

└── wsj0vp.5000.DMP

├── zh_CN

├── gigatdt.5000.DMP

└── mandarin_notone.dic

└── zh_TW

├── gigatdt.5000.DMP

└── mandarin_notone.dic

我们可以通过 #pkg-config --variable=modeldir pocketsphinx 这个命令来获得模型的安装目录。也就是 /usr/local/share/pocketsphinx/model

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 也提供一个改进现有声学模型的方法)。因为训练需要的准备和步骤挺多的,所以这里就不写了,具体的训练方法会在下一个博文中说明。

五、使用语言模型和声学模型

运行 pocketsphinx 进行语音识别需要指定三个文件: 声学模型、语言模型和字典文件 。我们以第二个网上下载回来的这三个文件为例子说明如何使用他们进行语音识别。

声学模型: zh_broadcastnews_16k_ptm256_8000.tar.bz2

语言模型: zh_broadcastnews_64000_utf8.DMP

字典文件: zh_broadcastnews_utf8.dic

先把以上三个文件放在同一个目录下,再把声学模型解压:

#tar -xjf zh_broadcastnews_16k_ptm256_8000.tar.bz2

解压后会在当前文件夹生成一个包含以下八个文件的文件夹。

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 会分析你传入的文件取得模型和识别的参数,然后显示出来,再有很多信息,等到显示:

Warning: Could not find Mic element

READY....

到这里你就可以对她喊话让它识别了。对着麦克风讲话结束后在屏幕上以文字形式显示识别结果。在麦克风输入时,两者的最长语音时间为 5 秒,前者是通过说话人的正常语句停顿作为断句的分割点,并将停顿之前的语音信号作为一个处理段。

下一步我会进行 pocketsphinx 语音识别系统的编程,但会放在训练自己的声学和语言模型后面,具体见博客更新。