2018-11-22 14:23:00 weixin_30443075 阅读数 213
  • 云从科技:详解CNN-pFSMN模型以及在语音识别中的应用

    近日,云从科技在语音识别技术上取得重大突破,在全球最大的开源语音识别数据集Librispeech上刷新了世界纪录,错词率(Worderrorrate,WER)降到了2.97%,将Librispeech的WER指标提升了25%,大幅刷新原先记录。本视频课程讲解了:大规模词汇连续语音识别,LVCSR前沿与最新进展,和CNN-pFSMN声学模型。

    1134 人正在学习 去看看 CSDN讲师

声纹识别,也称为说话人识别,主要的开源工具有:

1.MSR Identity Toolkit ,微软开源的工具箱,MATLAB版本,包含GMM-UBM和I-vector的demo,简单易用。

2.Alize,主要包括GMM-UBM、I-vector and JFA三种传统的方法,C++版,简单易用。

3.kaldi,当下十分流行的语音识别工具包,也包括声纹识别:覆盖了主流的声纹识别算法(I-vector 、x-vector等),脚本语言,使用不易。

这个是在CSDN上找到的,方便后续查阅,就做个记录.

转自: https://blog.csdn.net/u012594175/article/details/79704115

转载于:https://www.cnblogs.com/dylancao/p/10000825.html

2018-06-09 17:03:30 qq_23660243 阅读数 17464
  • 云从科技:详解CNN-pFSMN模型以及在语音识别中的应用

    近日,云从科技在语音识别技术上取得重大突破,在全球最大的开源语音识别数据集Librispeech上刷新了世界纪录,错词率(Worderrorrate,WER)降到了2.97%,将Librispeech的WER指标提升了25%,大幅刷新原先记录。本视频课程讲解了:大规模词汇连续语音识别,LVCSR前沿与最新进展,和CNN-pFSMN声学模型。

    1134 人正在学习 去看看 CSDN讲师

最近准备开始进行语音识别算法的学习,所以决定拿kaldi进行解读,这样一方面更加增加自己C++的基本功,另一方面也可以让自己慢慢走入语音识别的大门,自己的路,决定了就走下去,不管有多难。

首先我决定从kaldi的官网入手,不多说进入主题。

kaldi是什么

kaldi是使用c++写的语音识别的工具,apache 授予了v2.0的证书(果真应验,apache旗下无弱将)。kaldi旨在供语音识别研究员使用。

kaldi的命名

据传说,kaldi是埃塞俄比亚人,他发现了咖啡。

kaldi相较于其他工具

kaldi在目标和范围上和HTK相似,目标是用c++写的现代灵活的代码易于修改和扩展。它包含以下重要特点:

  1. 与有限状态转换器的代码级集成(FSTs)。 【我们根据openFst工具包进行编译,将其用作库】
  2. 广泛的线性代数支持。【我们包含一个包装BLAS和LAPACK的矩阵库】
  3. 可扩展的设计。【尽可能的,我们以最通用的方式提供我们的算法。例如,我们的解码器在提供由(帧,fst-input-symbol)索引的分数的对象上进行模版化。这意味着解码器可以从任何合适的分数来源工作,例如神经网络。】
  4. 开放许可。【该代码在apache2.0下获得许可,这是限制最少的许可证之一】
  5. 完整的recipes。【我们的目标适用于构建语音识别系统的完整配方,从广泛使用的数据库(比如语言数据联合会提供的数据)开展工作。】

发布完整配方是kaldi的重要目标之一,由于代码在允许修改和重新发布的许可下公开获得,我们希望鼓励人们以kaldi自己的脚本类似的方式发布他们的代码以及脚本目录。

考虑到时间的限制,我们尽可能的使kaldi的文档尽可能的完整。但是在短时间内,我们不能希望自己生成与HTK一样全面的的文档。特别是在HTKbooks中有很多介绍性资料,为外行人解释统计语音识别,这可能永远都不会出现在kaldi的文档之中。kaldi的大部分文档是这样写的,只有专家才能访问它。在未来,我们希望能够使得它更加的容易访问,同时铭记我们的目标受众是语音识别研究人员和语音识别培训人员。总的来说,kaldi并不是一个傻瓜式的语音识别工具包。他可以让你做很多没有意义的操作(PS:最后这句说的很有意思,大家自行理解)。

The flavor of kaldi

在本节中,我们试图总结kaldi工具包一些更加通用的特性。在某种程度上,他描述了当前开发人员的目标或者说当前项目的状态。这并不意味着排除不同风格的研究人员。

  1. 我们强调通用的算法和通用的组合配方。【我们说通用算法指的是像线性变换那样的东西,而不是专属于语音的内容。但是如果更具体的算法是有用的,我们不会那么教条。我们希望可以在任意数据集上运行的配方,而不是定制的数据集的配方。】
  2. 我们更喜欢证明正确的算法。【配方的设计原则是他们绝不会以灾难性的方式失败,一直在避免可能失败的配方和算法,即使他们在正常情况下没有失败。】
  3. kaldi的代码是经过全面测试的。【目标是让所有或几乎所有的代码都具有测试例程。】
  4. 我们尽量使简单的情况简单化。【在构造一个大型的语音工具包的时候,代码可能会成为很少替换的forest,这很危险。我们试图通过以下的方式来构建工具包,来避免这种情况。每一个命令行语句通常适用于有限的一组案例。例如解码器可能只适用于GMM。因此,当你添加新模型的类型时,您将创建一个新的命令行解码器。(调用相同的底层模版代码)。】
  5. kaldi代码很容易理解。【尽管kaldi工具包整体可能会变的非常庞大,但我们的目标是让每个单独的部分都可以毫不费力的理解。如果他提高了单个件的可理解性,我们将会重复书写代码。】
  6. kaldi代码很容易重构和重用。【我们希望工具包尽可能松散耦合,这意味着给定任何的头文件都应该尽量少#include其他的头文件,矩阵库尤其依赖于另一个子目录中的代码,所以他可以独立于其他所有的kaldi代码独立使用。(PS:不错,这个库想必是算法部分使用最多的了。)】

项目的状态

目前,我们拥有大多数标准结束的代码和脚本,包括所有的标准线性变换,MMI,增强的MMI和MCE判别式训练,以及特征空间判别式训练。我们为华尔街日报和资源管理以及配电盘提供配方,由于词汇和语言模型问题,交换机配方尚未提供最新的结果。因此我们不使用任何的外部数据源。

以上是关于About the kaldi project的部分(省去了最后的引用),看到这里个人相信广大第一次接触他的人都有很多细节不懂,比如什么解码器,什么FSTs,还有那些c++矩阵包到底是如何使用的等等等等。其实我也是存在同样的很多问题,那么我们必须把问题分解,分为多个子任务从分别击破。我的想法是按照官网的理论走一遍,然后针对各个模型走一遍,然后针对模型的论文走一遍,最后代码走一遍。至于里面的第三方的包的使用方法和细节,我则利用业余时间进行测试学习,如果有可能,我会写博客进行介绍。那么今天就先到这里,与诸君共勉。

2019-12-23 12:19:39 c12345678999 阅读数 55
  • 云从科技:详解CNN-pFSMN模型以及在语音识别中的应用

    近日,云从科技在语音识别技术上取得重大突破,在全球最大的开源语音识别数据集Librispeech上刷新了世界纪录,错词率(Worderrorrate,WER)降到了2.97%,将Librispeech的WER指标提升了25%,大幅刷新原先记录。本视频课程讲解了:大规模词汇连续语音识别,LVCSR前沿与最新进展,和CNN-pFSMN声学模型。

    1134 人正在学习 去看看 CSDN讲师

kaldi 简介:

kaldi 是到目前为止,一款非常优秀的语音识别开源建模软件。顺带一下八卦,其作者,Dan Povey 也是来到了中国发展。
kaldi 是一个建模工具,而建出来什么样的模型,完全依赖于个人。kaldi 的底层是基于 C,用户可以通过钓调用各种样例脚本进行建模。因为是开源的,所以高级玩法是可以自己修改代码编译。初级玩法是调用现有脚本进行编译。这里说的,只是初级玩法。
这里参考github上的 https://github.com/kaldi-asr/kaldi,来说明。

kaldi 建模流程概述:

1.了解脚本位置

kaldi 里面建模一般是在 egs 目录下新建自己的项目,而后在里面新建 s5,而后将其相关脚本从其他项目的 s5 中拷贝到此目录下,进行修改,如从 cp -r kaldi/egs/wsj/s5 egs/test/ 拷贝之后,删除部分不相关数据,如 data, exp,mfcc 中的数据,只保留空文件夹。kaldi/egs/wsj/s5里面比较干净,所以只要新建这三个文件夹即可。其中data里面是待建模数据,exp里面是建模后的模型,mfcc是中间提取的特征。conf里面是配置参数。

2.音频数据准备

在data目录下面,一般是新建 train 和 test 两个文件夹,里面放的分别是建模训练数据和测试数据。其实,里面只要放数据目录和标记文本就好了。这两个文件夹里面放的数据的格式是一模一样的。下面以 train 为例。
train 要准备的是以下几个文件, wav.scp、utt2spk、text、segments、spk2utt、(utt2lang, utt2gender … )。括号里面的根据具体情况而定,前五个一般都需要。

wav.scp

里面的格式是:
音频名称 该音频对应路径
eg:
01.wav /a/b/c/01.wav

需要注意的是这里的左边一列音频名称 ID 必须唯一
此外,对应的该音频路径下的音频需要与conf配置参数一致,如采样率,否则会报错不匹配。

utt2spk

里面的格式是:
音频片段 对应音频片段+说话人ID
eg:
01.wav-1 01.wav-1-1
01.wav-2 01.wav-2-1
01.wav-3 01.wav-3-2

text

里面的格式是:
音频片段 音频标记文本
eg:
01.wav-1 昨天晚上下雪了
01.wav-2 我们去故宫玩吧
01.wav-3 好啊

segments

里面的格式是:
音频片段 音频名称 (时间节点等)
eg:
01.wav-1 01.wav 0.001 3.151
01.wav-2 01.wav 3.501 6.985
01.wav-3 01.wav 7.218 7.832

spk2utt

里面的格式是:
音频片段+说话人ID 对应音频片段
也就是 utt2spk 的相反

其他

如果说音频已经做过vad并切成片段,那么segments前两列写成一样即可。如果音频是长语音,那么segments中需要有时间节点。
产生这几个准备文件的脚本需要自己写,因为数据形式命名方式各不相同,所以就不详细写具体内容了。一般来说,音频名称就是存储的音频名字,音频片段是音频名字后面加上起止时间节点。

3.发音词典准备

发音词典是模型的核心,模型好坏取决于发音词典。建好的发音词典放置于与 s5/local/dict/lexicon.txt,
分成两列,如,拼音 音素
而后可用 s5/local 内的脚本(前人积累的脚本一般都在这里面了),在data/local/内生成相应文件。
生成的文件,主要包括 nonsilence_phones.txt silence_phones.txt

nonsilence_phones.txt

内包 lexicon.txt 中,除 sil 的全部内容

silence_phones.txt

内包 lexicon.txt 中,只有 sil 的内容

4.训练

根据想要的训练过程,选择对应的脚本进行训练即可。

小结

使用 kaldi 在于两点,一个是准备数据,另一个是熟悉脚本语音。实际操作中,因为数据和脚本不匹配的情况肯定会发生,根据真实情况,报错信息,修改相应脚本,才能使其能正常运行。在 kaldi/egs/wsj/s5 中,可以从先熟悉 run.sh 中开始,而后结合本文所述,了解其调用功能。

2017-09-22 10:34:10 u013677156 阅读数 2189
  • 云从科技:详解CNN-pFSMN模型以及在语音识别中的应用

    近日,云从科技在语音识别技术上取得重大突破,在全球最大的开源语音识别数据集Librispeech上刷新了世界纪录,错词率(Worderrorrate,WER)降到了2.97%,将Librispeech的WER指标提升了25%,大幅刷新原先记录。本视频课程讲解了:大规模词汇连续语音识别,LVCSR前沿与最新进展,和CNN-pFSMN声学模型。

    1134 人正在学习 去看看 CSDN讲师

kaldi源代码简单说明

kaldi是开源的,基于C++的语音识别工具。一方面语音识别有较高的技术门槛,包含了很多方面的东西,另一方面kaldi集成了太多的东西,造成了其代码量很大,阅读起来很困难。

kaldi现在集成了很多的东西,造成其代码量很大,直接阅读起来感觉无从下手。但是,每个项目,一开始的时候,都是比较简单的,代码量也较小。

我从git上下载过来kaldi源码后,通过git reset 命令,回退到最原始的版本,看最原始版本的代码,就没有那么难了。最原始的版本,虽然缺失了很多功能,比如online解码、神经网络,kws等,但是其基本的代码还是有的。这里主要就是记录了阅读这些代码时总结的一些东西。当然,代码也只是走马观花地看了一遍,没有仔细看细节。


kaldi/base 文件夹 ==============================================
  包含两个基本的头文件 kaldi-type.h  kaldi-common.h
  四个小模块 kaldi-error   kaldi-math   kaldi-utils   io-funcs
  kaldi-type.h 中定义了基本的unint32 int32等类型,以及BaseFloat
  kaildi-error 中,定义了 KALDI_ERR   KALDI_WARN  KALDI_LOG  和 KALDI_EXIT 等。还是用的define,以及类中返回stream的方法。比起后面的版本,要简单很多
  kalid-math 中,定义了基本的π,根号2等的值,定义一些最大最小值,定义随机数的实现,LogAdd LogSum等,公约数,因式分解等
  kaldi-utils中,KALDI_SWAP4  KALDI_DISALLOW_COPY_AND_ASSIGN   KALDI_ASSERT_IS_INTEGER_TYPE  KALDI_STRTOLL 等
  io-funcs中,定义基本输入输出,类模板定义方式 WriteBasicType  ReadBasicType,可以是二进制或文本模式
  四个小模块分别生成.o文件,然后生成kaildi-base.a。每个模块都有测试代码。

kaldi/matrix文件夹 ==============================================
  生成的.o文件 kaldi-matrix.o  kaldi-vector.o  packed-matrix.o  sp-matrix.o  tp-matrix.o  matrix-functions.o  srfft.o
  生成的.a文件 kaldi-matrix.a

  kaldi-blas.h matrix-comm.h  两个基本的头文件;前者定义使用哪个blas,后者定义了基本的矩阵类型

  packed-matrix 基本压缩矩阵,声明模板类PackedMatrix
  tp-matrix 和 sp-matrix  三角矩阵和对称矩阵TpMatrix SpMatrix,其基类是PackedMatrix
  kaldi-vector 和 kaldi-matrix   kaldi中的向量和矩阵,声明模板类 VectorBase Vector SubVector     MatrixBase SubMatrix Matrix
  jama-eig jama-svd 特征分解和奇异值分解,只有使用atlas时才用到这两个文件,因为其他的库已经自带这两个算法了

  matrix-functions 矩阵计算应用函数,如计算FFT; srfft 另一种高效的FFT计算方法
  matrix-lib.h 包含了所有的应用头文件

Eigenvalue Decomposition 特征分解
Singular Value Decomposition 奇异值分解
symmetric matrices 对称矩阵
invert 求逆;  singular matrix 奇异矩阵,行列式为0;非奇异矩阵才可以求逆矩阵
transpose 转置

kaldi/utils文件夹 ===============================================
  【common-utils.h】包含此文件夹下所有的应用头文件
  【timer.h】定义一个时间对象,可以计算当时与生成该对象时的时间差。
  【edit-distance】计算编辑距离
  【stl-utils】stl一部分STL算法函数总结,很多地方都会用到
  【const-integer-set】快速判断一个整数是否在一个集合中
  【hash-list】解码时用到的一个结构体/类

  生成五个.o文件:text-utils.o  kaldi-io.o  kaldi-table.o  parse-options.o  simple-io.funcs.o 最后生成 kaldi-utils.a
  1 text-utils 含一些基本的字符串处理函数,如SplitStringToVector  SplitStringToIntegers  ConvertStringToInteger
  2 parse-options 处理参数的类ParseOptions。用到text-utils
  3 kaldi-io 定义了 Output 和 Input 这两个类,用于输入输出。用到 text-utils/parse-optins/kaldi-pipebuf这些头文件
  4 simple-io-funcs 对kaldi-io又进行了简单封装,定义成了4个IO函数。
  5 kaldi-table 定义了一些table类,如 RandomAccessTableReader  SequentialTableReader
  【table-types】定义常用的tabel types。它依赖于 kaldi-table/kaldi-holder和matrix。需要认真搞懂的类。

kaldi中blas库的使用 ============================================
  1、kaldi默认使用 atlas,但可以在 src目录下运行 configure 时指定用其他的blas库,如openblas,mkl等
  2、用atlas时,configure代码会用多种方式检查系统中是否有atlas相关的动态/静态库了,如果有了,则只需atlas的头文件,就可以编译了。如果没有,则configure出错,需要先安装atlas
  3、使用openblas,则需要先手动安装好openblas。如果程序已经是多线程的了,则不要在安装openblas时,指定USE_THREAD=1。
  4、指定的blas库不同,生成的kaldi.mk文件不一样,这些不同会影响编译链接,影响src/matrix/kaldi-blas.h文件的define语句。
  5、一般编解码用的代码,可以在configure中指定用静态库。
  6、libquadmath.so 是高精度浮点数计算用的,GCC 4.6之后支持; libgfortran,一般编译blas库均用到

kaldi/itf文件夹 ================================================
  1、clusterable-itf:聚类接口
  2、context-dep-itf:联系tree和fst的接口,可以将一串上下文音素,映射为叶子ID。
  3、decodable-itf:解码接口,包含特征提取和声学模型,可供解码对象用
  4、optimizable-itf:好像是优化计算的接口,比如计算梯度。

kaldi/feat文件夹 ===============================================
  1、feature-functions:定义了一些参数类(如MelBanksOptions)和常用函数(如Dither、ExtractWindow),是mel-computations和feature-mfcc的桥梁。
  2、mel-computations:定义了计算mel系数(特征)的类,mel特征是计算 mfcc和plp特征的基础。
  3、feature-mfcc、feature-plp:计算mfcc特征和plp特征的类。这些(包含mel)都用到矩阵,都依赖于matrix
  4、wave-reader:读取wav文件的类。
  feature-functions.o feature-mfcc.o feature-plp.o mel-computations.o wave-reader.o ----> kaldi-feature.a

kaldi/tree文件夹 ===============================================
  1、clusterable-class、cluster-utils 聚类相关的类和算法。 build-tree时通过聚类生成问题集,然后构建树
  2、event-map 定义的是EventType 和 EventMap (CE/SE/TE)这些类,树tree的主体,就是一个 EventMap 对象。
  3、build-tree、build-tree-questions和build-tree-utils是跟构建树相关的类和函数,最终生成的是 EventMap 对象。
  4、context-dep 从接口ContextDependencyInterface派生出类ContextDependency,这个就是“树”了。它的私有数据成员就是N、P和EventMap。它可以通过compute函数,来输入一个(三音素和pdfclass-id),输出其pdf-id。(这就和CLG的ilalel有点关系了)

kaldi/decoder文件夹 ============================================
  1、decodable-am-diag-gmm:依赖于gmm/hmm/itf/transform等,从DecodableInterface中派生出DecodableAmDiagGmm、DecodableAmDiagGmmScaled等多个类
  2、decodable-am-sgmm:依赖于sgmm/hmm/itf等,从DecodableInterface中派生出DecodableAmSgmm、DecodableAmSgmmScaled等类。
  3、training-graph-compiler:依赖于hmm/fst/fstext等,定义类TrainingGraphCompiler。
  4、kaldi-decoder:依赖于fst等。定义类模板template<class Decodable, class Fst> class KaldiDecoder。
  前面三项会生成 .o 文件;然后一起(可能汇合第4个)构成 kaldi-decoder.a 文件
  simple-decoder.h 和 faster-decoder.h 定义两个类,但貌似这些代码不参与 .a 文件的生成。
  decodable-matrix.h 从DecodableInterface派生出DecodableMatrixScaled,其实就是在计算likelihood时乘以了scale。

kaldi/hmm文件夹 =============================================
  1、hmm-topology:定义类HmmTopology。这个描述了音素的HMM结构。
  2、transition-model:转移模型类TransitionModel。里面涉及了phone、HMM-state、pdf-id、transition-state、transition-index、transition-id这些概念。因为涉及了pdf-id,所以其依赖于ContextDependency(树tree)。
  3、hmm-utils:跟转移模型相关的函数或类,比如,将TransitionModel转为Ha.fst的函数,增加自环的函数等。需要依赖fst。
  4、tree-accu:只有一个函数,将状态的和加起来,用以训练树。

  transition-model中的三元组,由“音素/状态/ PDF”构成。这些三元组,就是transition-state。每个state中有若干转移,就是transition-index。所有t-state的index集合起来,就是t-id。TransitionModel中有函数,进行这些id直接的转换。

kaldi/gmm文件夹 =============================================
  按照文档说明,类DiagGmm是一个简单的对角协方差高斯混合模型。一个声学模型,就是由很多个DiagGmm构成的,比如AmDiagGmm。AmDiagGmm由pdf-id做索引,每一项都是一个DiagGmm。一个AmDiagGmm和一个TransitionModel结合起来,就是一个完整的模型(写入磁盘的,就是这两个的集合)。
  DiagGmm和AmDiagGmm都是功能简单的类,它们没有例如模型估计、特征参数变换等功能。
  FullGmm跟DiagGmm类似,但它是全协方差的GMM模型。它主要为训练UBMs做准备。
  【model-comm.h】【diag-gmm.h】【am-diag-gmm.h】【estimate-diag-gmm/estimate-am-diag-gmm.h】
                                【full-gmm.h】【estimate-full-gmm.h】

kaldi/gmmbin文件夹 ===========================================
  在前面feature、gmm、hmm、tree和decoder等的基础上,实现了一系列的命令行工具。如对于简单的gmm,就有如下一些:
  gmm-init-mono   mono训练的第一步,用以生成0.mdl和tree
  gmm-est   模型参数重新估计和更新,输入old.mdl和acc文件,输出new.mdl。基本就是AmDiagGmm和TransitionModel根据数据,执行Update函数。
  gmm-acc-stats-ali   根据对齐结果,计算数据,放入acc文件中。
  gmm-decode-simple  使用SimpleDecoder做解码。就是AmDiagGmm和TransitionModel和特征,构成decodable,然后读取fst,执行Decode()。
  gmm-decode-faster  使用FasterDecoder做解码。
  gmm-align-compiled  根据模型、图和特征,做对齐操作。其实就是读取AmDiagGmm和TransitionModel,然后在图上加上转移概率,然后做FasterDecoder。
  gmm-align 跟上面的gmm-align-compiled类似,只是这个输入没有图,只有L.fst和scp,需要自己编译图,然后做解码。
  gmm-sum-accs  将多个acc文件合并为一个。

kaldi/lm文件夹 ===============================================
  kaldi-lmtable和kaldi-lm 最终生成 kaldi-lm.a;它们的功能就是将arpa文件转为G.fst。
  arpa2fst.cc 应用的就是上面两个文件/类。

kaldi/optimization文件夹 ===============================================
  一些优化算法

kaldi/transform文件夹 ===============================================
  一些特征变换的类或函数

kaldi/bin文件夹
  一些常用工具,例如以下几个
  cluster-phones  对音素聚类,生成问题集。输入是phone-set和tree-stats(acc-tree-stats的输出),输出是questions.txt。
  compile-questions 对于cluster-phones生成的结果,进行问题去重,以及转换格式。
  build-tree  根据问题集和状态,生成树。
  compile-train-graphs  生成训练图
  compute-wer 计算错误率
  make-h-transducer  生成Ha.fst


总的来说, base、matrix和utils这三个文件夹中的代码是基础。这三个文件夹中的代码,所定义的函数和类,基本功能需要先弄清楚。

feat是特征提取相关的。gmm、hmm和tree是声学模型相关的。fst和decoder跟解码有关。

看代码的时候,还要结合kaldi官网的资料,和一些网上的中文资料,会更快速,更容易看懂函数的意图。


2014-10-26 21:25:36 u012637501 阅读数 4189
  • 云从科技:详解CNN-pFSMN模型以及在语音识别中的应用

    近日,云从科技在语音识别技术上取得重大突破,在全球最大的开源语音识别数据集Librispeech上刷新了世界纪录,错词率(Worderrorrate,WER)降到了2.97%,将Librispeech的WER指标提升了25%,大幅刷新原先记录。本视频课程讲解了:大规模词汇连续语音识别,LVCSR前沿与最新进展,和CNN-pFSMN声学模型。

    1134 人正在学习 去看看 CSDN讲师
 二、PocketSphinx-Android编译与运行
    PocketSphinx是CMU Sphinx开发的一款轻量级基于嵌入式应用开发的离线语音识别开源工具,其源代码由C实现并且支持linux/Android平台开发。PocketSphinx官方文档及工具下载:http://cmusphinx.sourceforge.net/wiki/download/,其中:

1.解压pocketsphinx-0.8、PocketSphinxAndroidDemo、sphinxbase-0.8
    到D:\Android(可自行更改),并将pocketsphinx-0.8、sphinxbase-0.8文件夹改名为pocketsphinx、sphinxbase(注意:由于是通过Cygwin来模拟linux运行环境,因此选择pocketsphinx-0.8.tar.gz和sphinxbase-0.8.tar.gz)另外,训练工具为cmuclmtk-0.7.tar.gz和sphinxtrain-1.0.8.tar.gz;

2.编译安装pocketsphinx、sphinxbase
    以sphinxbase为例:运行Cygwin terminal,切换到sphinxbase所在的目录下分别执行"./autogen.sh" "./configure" "make" "mnake install"命令.
注:此时可能会提示错误,说明文件没装全,回 Cygwin 的 setup.exe 去下载

3.利用SWIG生成.java文件并拷贝至PocketSphinxAndroidDemo 的 jni 文件夹
(1)运行Cygwin终端,切换至pocketsphinx/swig 文件夹,执行make生成edu目录。
    程序会提示jni.h不存在,这里可以先忽略。这步的主要目的是生成pocketsphinx/swig目录下一个edu目录,该目录下包含下列.java文件。

(2)将pocketsphinx/swig 文件夹下的edu目录,复制到 PocketSphinxAndroidDemo 中的 jni 文件夹,然后修改jni目录下的 Android.mk。
(a)修改SPHIX_PATH路径,注意路径格式

(b)修改 LOCAL_STATIC_LIBRARIES,把后边的单词顺序改为 pocketsphinx sphinxlm sphinxfeat sphinxfe sphinxutil

(3)打开 Cygwin,进入 PocketSphinxAndroidDemo /jni 目录,执行 ndk-build生成libpocketsphinx_jni.so。
位于D:\Android\pocketsphinx\PocketSphinxAndroidDemo\libs\armeabi\libpocketsphinx_jni.so.

注意:如果出现问题,则重复第2~3步骤,重新生成libpocketsphinx_jni.so

4.配置Eclipse(这步比较容易出错,重点在于配置DNK!)
(1)导入 PocketSphinxAndroidDemo 工程文件,导入过程提示错误,无视即可。
导入方法详见:
(2)打开Eclipse,Project->properties->builder:右侧会发现 SWIG 和 NDK
a.配置SWIG
选择SWIG,点击Edit,在Refresh选项卡中选择 “The folder containing the selected resource”,在Build Options选项卡中取消选择“Specifiy working set of relevant resources”

b.配置NDK
选择NDK,点击Edit按钮,出现的框中,在Location区域选择ndk文件夹,然后点击Refresh选项卡,选择“The project containing the selected resource”,点击Build Options选项卡,取消选择“Specify working set of relevant resources”

c.配置好SWIG和NDK后,执行"build project"。出现warning可以不用理会,如果出现errors就需要检查Eclipse中SWIG和NDK配置是否正确。PS:之前我也参照过一些人些的博客和官方文档,但是发现最后都不行。出现问题的主要因素是DNK的配置问题,经过多次调试,我在官方文档http://ucla.jamesyxu.com/?p=118基础上,将DNK配置的Location改为bash.exe所在的路径。执行run as,成功实现Demo.

5.真机调试-给APP应用程序添加"声学模型"和"语言模型"(动态加载)
(1)在 PocketSphinxAndroidDemo 项目中使 RecognizerTask.java 里 c.setString 函数中的参数符合上述路径
(2)代码编译成功后,在运行之前把 pocketsphinx/model/hmm/en_US 里的 hub4wsj_sc_8k,hmm/en_US,lm/en_US 放入手机的某个文件夹,在手机/sdcard/Android/data/目录下新建一个edu.cmu.pocketsphinx目录,再依次创建如下文件夹。

PS:"声学模型"、"语言模型"、APK下载:

6.遇到的一些问题
(1)编译pockeshinx时执行./autogen.sh,出现"You must have 'automake' installed"错误?
   运行Cygwin下载器,发现已经安装了automake,更换automake版本后仍出现上述情况。通过查阅资料发现autooconf版本太低导致automake、 autoconf版本不匹配。为此,下载automake()、 autoconf()即可解决问题。详见automake、autoconf作用:http://wenku.baidu.com/linkurl=9ggAr3TnE0mvNsAqNK6zpHZIZrUYonI7l7m8z0gL__5X73BazYF6932n5nHFkjICeetKSQ3RVFXMJ-FdRakJzZNO9dZ0h6e_Idie8UH5X5a

(2)编译pockeshinx时执行./configure时候出现bison错误?
    利用Cygwin 的 setup.exe 去下载bison即可解决。

(3)编译pockeshinx时执行"make"命令出现libtool错误?
   将D:\Android\pocketsphinx\sphinxbase目录下的ltmain.sh文件中所有的"$echo"改为"$ECHO",重新./congfigure->make即可。

(4)切换到...pocketsphinx/swig目录,执行"make"命令无法生成D:\Android\pocketsphinx\PocketSphinxAndroidDemo
\libs\armeabi\libpocketsphinx_jni.so。
解决:libpocketsphinx_jni.so主要是在..pocketsphinx/swig执行make中生成,出现这个问题主要是由于swig版本不对,应使用swig.1.3.40这个版本,具体的安装方法详见我上一篇博客。然后,重新解压pocketsphinx到指定目录并运行cygwin终端,切换到pocketsphinx目录再次执行"./autogen.sh" "./configure" "make" "mnake install"命令,在切换到..pocketsphinx/swig执行make即可生成该文件.
(5)在Eclipse执行"build project"出现"libpocketsphinx_jni.so"不存在或者出现其他错误?
解决:"build project"提示Error错误,主要考虑两个原因:一是,因为swig版本问题(要swig-1.3.40)导致没有生成libpocketsphinx_jni.so;二是,Eclipse中的DNK配置不正确。
(6)将apk程序安装到手机中运行是出现"闪一下"就退出了?
解决:两个原因,一是在因为NDK没有配置好;二是在运行程序之前,须在手机/sdcard/Android/data/目录下新建一个edu.cmu.pocketsphinx目录,再依次创建如下文件夹存放已经下载好的"声学模型"和"语言模型"。

参考资料:

Kaldi的安装与测试

阅读数 785

没有更多推荐了,返回首页