3.3.1
音频流内容提取
Sphinx-4(http:cmusphinx.sourceforge.net)是采用Java实现的一个语音识别软件。Sphinx是一个基于隐马尔科夫模型的系统,首先它需要学习一套语音单元的特征,然后根据所学来推断出所需要识别的语音信号最可能的结果。学习语音单元特征的过程叫做训练。应用所学来识别语音的过程有时也被称为解码。在Sphinx系统中,训练部分由Sphinx
Trainer来完成,解码部分由Sphinx
Decoder来完成。为了识别普通话,可以使用Sphinx Trainer自己建立普通话的声学模型。训练时需要准备好语音信号(Acoustic Signals)与训练用语音信号对应的文本(Transcript File)。当前Sphinx-4只能使用Sphinx-3 Trainer生成的Sphinx-3声学模型。有计划创建Sphinx-4 trainer用来生成Sphinx-4专门的声学模型,但是这个工作还没完成。
讲稿(transcript)文件中记录了单词和非讲话声的序列。序列接着一个标记可以把这个序列和对应的语音信号关联起来。
例如有160个wav文件,每个文件对应一个句子的发音。例如,播放第一个声音文件,会听到a player threw the ball to me,而且就这一句话。可以把这些wav或者raw格式的声音文件放到myasmwav目录下。
接下来,需要一个控制文件。控制文件只是一个文本文件。这里把控制文件命名为
myam_train.fields(必须把它命名成[name]_train.fileids的形式,这里[name]是任务的名字,例如myam),其中有每个声音文件的名字(注意,没有文件扩展名)。
0001
0002
0003
0004
接下来,需要一个讲稿文件,文件中的每行有一个独立文件的发声,必须和控制文件相对应。例如,如果控制文件中第一行是0001,因此讲稿文件中的第一行就是A player threw the ball to me,因为这是0001.wav 的讲稿。讲稿文件也是一个文本文件,命名成myam.corpus,应该有和控制文件同样多行。讲稿不包括标点符号,所以应删除所有标题符号,例如:
a player threw the ball
to me
does he like to swim
out to sea
how many fish are in
the water
you are a good kind of
person
以这样的顺序,对应0001、0002、0003和0004文件。
现在有了一些声音文件、一个控制文件和一个讲稿文件。
Sphinx-4由3个主要模块组成:前端处理器(FrontEnd)、解码器(Decoder)和语言处理器(Linguist),其结构如图3-17所示。前端把一个或多个输入信号参数转化成特征序列。语言处理器把任何类型的标准语言模型和声学模型以及词典中的发声信息转换成为搜索图。这里,声学模型用来表示字符如何发音,语言模型用来评估一个句子的概率。解码器中的搜索管理器使用前端处理器生成的特征执行实际的解码并生成结果。在识别之前或识别过程中,应用程序都可以发出对每个模块的控制,这样就可以有效地参与到识别过程中来。
图3-17 Sphinx-4结构
语音识别的准确率受限于其识别的内容,内容越简单,则识别准确率越高,所以一般根据某个应用场景来识别语音。例如电视台要给录制的新闻节目加字幕,有批处理和实时翻译两种方式,这里采用批处理的方式。以识别新闻节目为例,开发流程说明如下。
准备新闻语料库:语料库就是一个文本文件,每行一个句子。
创建语言模型:一般采用基于统计的N元语言模型,例如ARPA格式的语言模型。可以使用语言模型工具Kylm(http:www.phontron.comkylm)生成ARPA格式的语言模型文件。
创建发声词典:对于英文可以采用ARPABET格式注音的发音词典。由于汉语是由音节(Syllable)组成的语言,所以可以采用音节作为汉语语音识别基元。每个音节对应一个汉字,比较容易注音。此外,每个音节由声母和韵母组成,声韵母作为识别基元也是一种选择。
设置配置文件:在配置文件中设置词典文件和语言模型路径。
在Eclipse中执行语音识别的Java程序。初始情况下,需要执行jsapi.exe或jsapi.sh生成出jsapi.jar文件。
edu.cmu.sphinx.tools.feature.FeatureFileDumper可以从音频文件中导出特征文件,例如MFCC特征。一般提取语音信号的频率特征,找出语音信号中的音节叫做端点检测,也就是找出每个字的开始端点和结束端点。因为语音信号中往往存在噪音,所以不是很容易找准端点。
Transcriber.jar可以实现从声音文件中导出讲稿文件:
D:\sphinx4-1.0beta5\binjava -jar -mx300M Transcriber.jar
one zero zero zero one
nine oh two one oh
zero one eight zero three