Skip to content

Yanshee 人工智能 2 让机器人能听懂你说的话

UBTEDU edited this page May 21, 2018 · 1 revision

课程目标

使用开源语音识别程序pocketsphinx,自已动手做一个语音的命令词识别。

课程引入原因

现在AI技术发展得非常快,AI技术在日常生活中应用也越来越广。其中语音技术在很早的时候就尝试走入大家的生活。从亚马逊的Echo到微软的Cortana,从苹果的语音助手Siri到谷歌的Assistant等等,语音识别技术的广泛应用让我们的生活便利了很多,但是在使用的过程中,你是否知道它们的工作原理?是否会对这些智能化的语音回答感到兴趣满满呢?在这个课程中,我们将介绍一个经典的开源语音识别程序(CMU的pocketsphinx)来学习语音识别的基本知识。通过这个案例我们将会学会和理解语音识别的基本方法等。

环境准备

硬件

• YanShee机器人一台

• 无线键盘、鼠标一套

• HDMI 显示器一个

软件

• xshell

语音识别的原理及流程

语音识别在这里我们指把声音变成文本。声音实际上是一种波,而我们常见的MP3格式的是压缩过的格式。在语音识别的过程中,我们通常使用非压缩的格式来处理。比如PCM文件。 比如下图就是一个PCM文件的声音波形。

在语音识别开始时,需要把首尾端的静音切除,降低对后续步骤造成的干扰。这个静音切除的操作一般称为VAD。在对声音分析的时候,需要对声音分帧,这里可以通俗地理解为把一个连续的声音切成一小段一小段,每一小段就是一帧。但是这里要理解的是上一帧与下一帧是有重叠的。在分帧后,需要对每一帧建模。这个过程叫声学特征提取。从语音识别开始分析声音开始到识别到单词经过了如下过程:

上面提到的音素,可以这么理解。单词的发音由音素构成,下面我们用到的例子中就是由CMU定义的一套音素集。

详细情况参见: http://www.speech.cs.cmu.edu/cgi-bin/cmudict

在人的发声中,在一个音转向另一个音的时候是渐变的,所以后一个音的频谱与在其他情况下的频谱并不完全一样。为了解决这个问题,需要根据上下文来辨别音素。这里说的状态指的就是得到音素的中间状态。音素的第一部分是与它之前的音素存在关联,中间是稳定的部分,最后一部分是与下一个音素存在关联。这就是通常在使用HMM模型时的音素三状态。可以粗略地认为这是为了更准确地描述语音的一个手段。 另外在识别的时候,也有一些非语言学的声音,比如呼吸声,um,uh,咳嗽声等。在识别的时候可以用来做为停顿。这样的非语言学的声音叫做utterances.

下面以Sphinx为例子,来说明更详细的识别过程。 Sphinx是由美国卡内基梅隆大学开发的大词汇量、非特定人、连续英语语音识别系统。一个连续语音识别系统大致可分为四个部分:特征提取,声学模型训练,语言模型训练和解码器。

在语音识别中,会用到三个模型。声学模型(acoustic model),语音字典(phonetic dictonary)和语言模型(language model)。

声学模型是根据训练语音库的特征参数训练出的结果。在识别时可以将待识别的语音的特征参数和声学模型进行匹配,得到识别结果。目前的主流语音识别系统多采用隐马尔可夫模型HMM进行声学模型建模。

语音字典包含了单词与音节的映射关系。在识别的时候字典并不是唯一的用来表示单词与音节关系的手段,也可以便用更复杂的手段来表示它们之间的关系。

语言模型是用来约束单词查找的。它主要用于决定哪个词序列的可能性更大,或者在出现了几个词的情况下预测下一个即将出现的词语的内容。语音模型可以简单地理解为消除多音字的问题。语言建模方法主要有基于规则模型和基于统计模型两种方法。统计语言模型是用概率统计的方法来揭示语言单位内在的统计规律,其中N-Gram模型简单有效,被广泛使用。它包含了单词序列的统计。 N-Gram模型基于这样一种假设,第n个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。 Sphinx中是采用二元语法和三元语法的统计语言概率模型,也就是通过前一个或两个单词来判定当前单词出现的概率P(w2| w1),P(w3| w2, w1)。

最后解码器是指在给定了根据语法、字典对马尔科夫模型进行连接后的搜索的网络(网络的每个节点可以是一个词组等)后,在所有可能的搜索路径中选择一条或多条最优(通常是最大后验概率)路径(字典中出现词组的词组串)作为识别结果。

安装 Pocketsphinx

SphinxBase提供了一些CMUSphinx的一些基础的功能。Pocketsphinx它依赖于SphinxBase, 所以要安装Pocketsphinx,就必须先安装SphinxBase.
关于Sphinx的源码详细信息可以参看:

https://cmusphinx.github.io/wiki/download/

Sphinxbase

cd ~/
wget http://sourceforge.net/projects/cmusphinx/files/sphinxbase/5prealpha/sphinxbase-5prealpha.tar.gz
tar -zxvf ./sphinxbase-5prealpha.tar.gz
cd ./sphinxbase-5prealpha
./configure --enable-fixed
make clean all
sudo make install

PocketSphinx

cd ~/
wget http://sourceforge.net/projects/cmusphinx/files/pocketsphinx/5prealpha/pocketsphinx-5prealpha.tar.gz
tar -zxvf pocketsphinx-5prealpha.tar.gz
cd ./pocketsphinx-5prealpha
./configure
make clean all
sudo make install

在编译好SphinxBase和PocketSphinx后,请记得设置环境变量。 不然有可能得到如下错误"error while loading shared libraries: libpocketsphinx.so.3"。

cd ~/
export LD_LIBRARY_PATH=/usr/local/lib
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

创建语言模型

创建一个文本文件(corpus.txt)包含包下信息:

resources
application
configuration
alternatively
language
information
depending
paramters

上传文本文件(corpus.txt)到:http://www.speech.cs.cmu.edu/tools/lmtool-new.html

lmtool是CMUSphinx提供的一个在线的生成语言模型的工具,它适合一些小的语料场景。上传后,会得到如下结果。下载dic和lm这两个文件。

得到的两个文件如下:

pi@Yan_672C:~/pocketsphinx/res $ cat 5623.dic 
ALTERNATIVELY   AO L T ER N AH T IH V L IY
APPLICATION AE P L AH K EY SH AH N
CONFIGURATION   K AH N F IH G Y ER EY SH AH N
DEPENDING   D IH P EH N D IH NG
INFORMATION IH N F AO R M EY SH AH N
LANGUAGE    L AE NG G W AH JH
LANGUAGE(2) L AE NG G W IH JH
PARAMTERS   P AH R AE M T AH R Z
RESOURCES   R IY S AO R S IH Z
 
pi@Yan_672C:~/pocketsphinx/res $ cat 5623.dic 
GARAGE        G ER AA ZH
IN        IH N
IS        IH Z
OKAY        OW K EY
OPEN        OW P AH N
PI        P AY
RAMONA        R AH M OW N AH
SHUTDOWN        SH AH T D AW N
START        S T AA R T
THE        DH AH
THE(2)        DH IY
TIME        T AY M
TRANSLATOR        T R AE N S L EY T ER
TRANSLATOR(2)        T R AE N Z L EY T ER
WEATHER        W EH DH ER
WHAT        W AH T
WHAT(2)        HH W AH T

运行pocketsphinx

cd ~/
export LD_LIBRARY_PATH=/usr/local/lib
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
 
pocketsphinx_continuous -hmm /usr/local/share/pocketsphinx/model/en-us/en-us -lm 3199.lm -dict 3199.dic -samprate 16000/8000/48000 -inmic yes

识别结果

INFO: continuous.c(275): Ready....
Input overrun, read calls are too rare (non-fatal)
INFO: continuous.c(261): Listening...
Input overrun, read calls are too rare (non-fatal)
INFO: cmn_live.c(88): Update from <44.14  1.74  1.59 -1.62  0.39 -3.16 -0.13 -4.73  1.43  6.52  3.35  0.99 -2.57>
INFO: cmn_live.c(105): Update to   <41.03  6.63  1.90  2.44  0.38 -4.15 -3.46 -5.49  3.51  4.58  3.22 -1.08 -2.13>
INFO: cmn_live.c(120): Update from <41.03  6.63  1.90  2.44  0.38 -4.15 -3.46 -5.49  3.51  4.58  3.22 -1.08 -2.13>
INFO: cmn_live.c(138): Update to   <38.32  9.05  1.87  2.35  0.06 -3.62 -3.86 -5.66  3.77  5.26  3.71 -0.75 -2.95>
INFO: ngram_search_fwdtree.c(1550):     1928 words recognized (4/fr)
INFO: ngram_search_fwdtree.c(1552):    53293 senones evaluated (118/fr)
INFO: ngram_search_fwdtree.c(1556):    19909 channels searched (44/fr), 3510 1st, 4587 last
INFO: ngram_search_fwdtree.c(1559):     2042 words for which last channels evaluated (4/fr)
INFO: ngram_search_fwdtree.c(1561):       84 candidate words for entering last phone (0/fr)
INFO: ngram_search_fwdtree.c(1564): fwdtree 2.36 CPU 0.522 xRT
INFO: ngram_search_fwdtree.c(1567): fwdtree 11.48 wall 2.539 xRT
INFO: ngram_search_fwdflat.c(302): Utterance vocabulary contains 6 words
INFO: ngram_search_fwdflat.c(948):     2062 words recognized (5/fr)
INFO: ngram_search_fwdflat.c(950):    19770 senones evaluated (44/fr)
INFO: ngram_search_fwdflat.c(952):    11447 channels searched (25/fr)
INFO: ngram_search_fwdflat.c(954):     2753 words searched (6/fr)
INFO: ngram_search_fwdflat.c(957):      295 word transitions (0/fr)
INFO: ngram_search_fwdflat.c(960): fwdflat 0.44 CPU 0.097 xRT
INFO: ngram_search_fwdflat.c(963): fwdflat 0.44 wall 0.096 xRT
INFO: ngram_search.c(1250): lattice start node <s>.0 end node </s>.365
INFO: ngram_search.c(1276): Eliminated 0 nodes before end node
INFO: ngram_search.c(1381): Lattice has 456 nodes, 774 links
INFO: ps_lattice.c(1380): Bestpath score: -7935
INFO: ps_lattice.c(1384): Normalizer P(O) = alpha(</s>:365:450) = -431300
INFO: ps_lattice.c(1441): Joint P(O,S) = -464831 P(S|O) = -33531
INFO: ngram_search.c(872): bestpath 0.00 CPU 0.000 xRT
INFO: ngram_search.c(875): bestpath 0.00 wall 0.001 xRT
ALTERNATIVELY

思考实验

不使用CMU的在线工具,创建自定义的语音模型。测试新的语音模型是否对识别准确率有什么影响,并尝试分析影响识别准确率的因素有哪些。