-
Notifications
You must be signed in to change notification settings - Fork 11
Yanshee 人工智能 2 让机器人能听懂你说的话
使用开源语音识别程序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)。
最后解码器是指在给定了根据语法、字典对马尔科夫模型进行连接后的搜索的网络(网络的每个节点可以是一个词组等)后,在所有可能的搜索路径中选择一条或多条最优(通常是最大后验概率)路径(字典中出现词组的词组串)作为识别结果。
SphinxBase提供了一些CMUSphinx的一些基础的功能。Pocketsphinx它依赖于SphinxBase, 所以要安装Pocketsphinx,就必须先安装SphinxBase.
关于Sphinx的源码详细信息可以参看:
https://cmusphinx.github.io/wiki/download/
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
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
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的在线工具,创建自定义的语音模型。测试新的语音模型是否对识别准确率有什么影响,并尝试分析影响识别准确率的因素有哪些。