2016-10-29 08:27:58 u011520752 阅读数 742

语音识别

语音识别的意思是将人说话的内容和意思转换为计算机可读的输入。语音识别的目的就是让机器听懂人类口述的语言,包括了两方面的含义:第一是逐字逐句听懂而不是转化成书面的语言文字;第二是对口述语言中所包含的命令或请求加以领会,做出正确回应,而不仅仅只是拘泥于所有词汇的正确转换。

语音识别系统的分类

  • 从说话者与识别系统的相关性考虑:

    • 特定人语音识别系统
    • 非特定人语音系统
    • 多人的识别系统
  • 从说话的方式考虑:

    • 孤立词语音识别系统
    • 连接词语音识别系统
    • 连续语音识别系统
  • 从识别系统的词汇量大小考虑:

    • 小词汇量语音识别系统
    • 中等词汇量的语音识别系统
    • 大词汇量语音识别系统

语音识别
语音识别的方法

目前具有代表性的语音识别方法主要有动态时间规整技术(DTW)、隐马尔可夫模型(HMM)、矢量量化(VQ)、人工神经网络(ANN)、支持向量机(SVM)等方法。

  1. 动态时间规整算法
    动态时间规整算法(Dynamic TIme Warping,DTW)是在非特定人语音识别中一种简单有效的方法,该算法基于动态规划的思想,解决了发音长短不一的模板匹配问题,是语音识别技术中出现较早、较常用的一种算法。在应用DTW算法进行语音识别时,就是将已经预处理和分帧过的语音测试信号和参考语音模板进行比较以获取他们之间的相似度,按照某种距离测度得出两模板间的相似程度并选择最佳路径。

  2. 隐马尔可夫模型
    隐马尔可夫模型(HMM)是语音信号处理中的一种统计模型,是由Markov链演变来的,所以它是基于参数模型的统计识别方法。由于其模式库是通过反复训练形成的与训练输出信号吻合概率最大的最佳模型参数而不是预先储存好的模式样本,且其识别过程中运用待识别语音序列与HMM参数之间的似然概率达到最大值所对应的最佳状态序列作为识别输出,因此是较理想的语音识别模型

  3. 矢量量化
    矢量量化(Vector QuanTIzaTIon)是一种重要的信号压缩方法。与HMM相比,矢量量化主要适用于小词汇量、孤立词的语音识别中。其过程是将若干个语音信号波形或特征参数的标量数据组成一个矢量在多维空间进行整体量化。把矢量空间分成若干个小区域,每个小区域寻找一个代表矢量,量化时落入小区域的矢量就用这个代表矢量代替。矢量量化器的设计就是从大量信号样本中训练出好的码书,从实际效果出发寻找到好的失真测度定义公式,设计出最佳的矢量量化系统,用最少的搜索和计算失真的运算量实现最大可能的平均信噪比。
    多种降低复杂度的方法,包括无记忆的矢量量化、有记忆的矢量量化和模糊矢量量化方法。

  4. 人工神经网络
    人工神经网络(ANN)是一个自适应非线性动力学系统,模拟了人类神经活动的原理,具有自适应性、并行性、鲁棒性、容错性和学习特性,其强大的分类能力和输入—输出映射能力在语音识别中都很有吸引力。其方法是模拟人脑思维机制的工程模型,它与HMM正好相反,其分类决策能力和对不确定信息的描述能力得到举世公认,但它对动态时间信号的描述能力尚不尽如人意,通常MLP分类器只能解决静态模式分类问题,并不涉及时间序列的处理。尽管学者们提出了许多含反馈的结构,但它们仍不足以刻画诸如语音信号这种时间序列的动态特性。由于ANN不能很好地描述语音信号的时间动态特性,所以常把ANN与传统识别方法结合,分别利用各自优点来进行语音识别而克服HMM和ANN各自的缺点。

  5. 支持向量机
    支持向量机(Support vector machine)是应用统计学理论的一种新的学习机模型,采用结构风险最小化原理(Structural Risk Minimization,SRM),有效克服了传统经验风险最小化方法的缺点。兼顾训练误差和泛化能力,在解决小样本、非线性及高维模式识别方面有许多优越的性能,已经被广泛地应用到模式识别领域。

语音识别技术发展现状

语音识别系统的性能受到许多因素的影响,包括不同说话人的发音方式、说话方式、环境噪音、传输信道衰落等等。

具体要解决的问题有四点:
①增强系统的鲁棒性,也就是说如果条件状况变得与训练时很不相同,系统的性能下降不能是突变的。
②增加系统的适应能力,系统要能稳定连续的适应条件的变化,因为说话人存在着年龄、性别、口音、语速、语音强度、发音习惯等方面的差异。
③寻求更好的语言模型,系统应该在语言模型中得到尽可能多的约束,从而解决由于词汇量增长所带来的影响。
④进行动力学建模,语音识别系统提前假定片段和单词是相互独立的,但实际上词汇和音素的线索要求对反映了发声器官运动模型特点的整合。

语音识别

2018-07-31 17:08:50 yibuerbusanbu 阅读数 3572

1.前言:
本科毕业之后,开始了北漂,一直想从事一些偏上层方面的工作,开始找工作期间各种碰壁。可能自己c语言的基础还可以的原因,被现在的单位的引擎组招了过来,起初只是被用来干一些引擎的支持和测试,慢慢的开始接触到了语音识别等引擎的开发,所以利用自己在工作中所了解得在这里班门弄斧地谈谈语音识别,也是想工作进行总结。也欢迎大家指出错误和不足。
1.语音识别简介:
语音识别技术即AutomaticSpeechRecognition(简称ASR),是指将人说话的语音信号转换为可被计算机程序所识别的信息,从而识别说话人的语音指令及文字内容的技术。目前语音识别被广泛的应用于客服质检,导航,智能家居等领域。
2.语音识别过程:
在这里插入图片描述
语音识别大体上包含前端处理,特征提取,模型训练,解码四个模块。其中前端处理包括了,语音转码,高通滤波,端点检测等。
上图目前语音识别的基本流程,输入的语音数据流经过前端处理(语音格式转码,高通,端点检测),语音格式转码是将输入的语音数据转成pcm或者wav格式的语音,端点检测是检测出转码后语音中的有效语音,这样对解码速度和识别率上都会改善。经过前端处理之后的得到的分段语音数据送入特征提取模块,进行声学特征提取。最后解码模块对提取的特征数据进行解码,解码过程中利用发音字典,声学模型,语言模型等信息构建WFST搜索空间,在搜索空间内寻找匹配概率最大的最优路径,便得到最优的识别结果。
在其他章节中会详细介绍以上四个模块。
3.语音识别的学习:
由于语音识别本事就是一个非常大并且繁琐的工程,设计到知识面很广,目前我也在想如何把这个学习过程更加系统化,简单化。希望这一块能得到前辈的指点。
目前我再看这些书籍:
1).数学之美,这本书对整个语音识别过程以及各个模块讲的很详细,也很通俗易懂,是一本不错的语音识别入门的书。
2).语音信号处理,这本书对前端处理模块的学习有很大的帮助,由于是一本教材书籍,自己在有些地方看起来也很晦涩,目前也想在网上找一些相关网课看看,这样更加深理解,找到的话也会第一时间分享。
3).关于特征提起模块,网上有很多帖子写的都很详细,后面我也会整理一下。
4).解码和模型训练…未完!!!

2018-04-22 23:57:26 xm1076709179 阅读数 2001

语音识别就是将包含文字信息的语音通过计算机转化成文字的过程,也叫语音转写,英文叫automatic speech recognition(ASR)或者 speech to text(STT),语音识别框架一般如图所示:
这里写图片描述
从上图中可以看出,语音识别技术是一个复杂的多学科交叉技术,涉及到信号处理、统计、机器学习、语言学、数据挖掘、生理学等知识。一个完整的语音识别系统声学方面和语言学方面。声学方面包括从最初的语音信号获取(这其中包括将语音转化成电信号)到语音信号处理(包括模数转换,降噪、增强、端点检测(VAD)等),再到特征提取(MFCC、FB、PLP、BN等),最后到声学模型建模;语言学方面包括字典(词典)构造,语言模型建模等。通过建立的声学模型和语言模型就可以对输入的测试语音进行解码,得到相对应的文字。

解码原理(基于最大后验概率MAP)

假设我们有一段语音X(通常是提取的特征),要得到对应的文本W,就是求使得概率p(W|X)最大的W的过程,即求

W¯=argmaxWp(W|X)

利用条件概率公式和贝叶斯公式将上述公式转化为
W¯=argmaxWp(W,X)p(X)=argmaxWp(X|W)p(W)p(X)

p(X)表示声学观测序列的概率,不管选择解码空间中的哪一条路径,一段语音发出来后p(X)就确定了,是一个未知的常数,虽然这个概率很难估计,但是并不会影响到W¯的取值,因此,上式可以简化为
W¯=argmaxWp(X|W)p(W)

该公式就是解码的核心公式了,下面对该公式做一个简单解读
其中第一项p(X|W)就是我们的声学模型,准确的说,这个概率可以通过声学模型和词典(Lexicon)计算得到,第二项就是我们的语言模型,该怎么理解呢?
从概率上看,p(X|W)表示在给定文本W的情况下,求“生成”语音X的概率,就是说,我们之所以说某一句话而不会说其他话,是因为在说这句话之前,脑海里肯定有我们想表达的内容(这里内容就可以理解成文本W),然后,调动发声器官发出语音X,因此,语音识别的目标就是通过发出的语音X去猜测说这句话到底表达什么内容W
p(W)就是我们的先验概率,为什么这么说,因为它不依赖于我们给定的语音X,而是由经验得出的,具体的,可以理解为人类发展到现在所总结出来的语法知识,更通俗一点就是人类的表达习惯。举个例子,我们通常会说“上床睡觉”而不会说“上床上班”。这个概率可以由语言模型得到。
要使得p(X|W)p(W)最大,一方面需要文字表达尽量符合语法习惯(即p(W)尽量大),另一方面需要识别出来的文字尽量和发出的语音相符(即p(X|W)尽量大),就是说,在解码空间里(解码空间后续会说,简单理解为不同词之间有多种组合方式,不同的组合方式构成不同的W),可能有很多种组合都符合语法习惯,但是有些就和发出的语音不太吻合,例如,我们说一句话“我下班坐地铁回家”,其中有三个不同的识别结果:
1.我下班坐公交回家
2.我坐地铁回家
3.我下班坐地铁回家
显然,上述三种识别结果都符合语法习惯,但是前两种识别结果都存在误识(替换错误,后续会讲)或信息丢失(删除错误,后续会讲),即语音中所表达的信息没有被完全识别出来,因此声学模型的得分p(X|W)就没有第3种识别结果得分高。
好了,语音识别的介绍就到这里,具体如何对声学模型和语言模型进行建模,以及解码等内容在后续进行介绍。

ps:哪位大神能教我怎样用LaTexW写到argmax下面去吗,这样看着好别扭

2019-05-17 15:34:26 muxiue 阅读数 795

开源语音识别工具包

目前开源世界里存在多种不同的语音识别工具包,它们为开发者构建语音识别相关的应用提供了很大的帮助。以下是目前比较流行的语音识别工具包:

  1. CMU Sphinx
  2. Kaldi
  3. HTK
  4. Julius
  5. ISIP
    作为语音识别小白,我将从CMU Sphinx入手,从简单的应用搭建到CMU Sphinx代码的阅读和理解,逐步深入了解语音识别这个深奥的世界。

语音识别简介

语音其实上是一个复杂的现象,人们很少理解语音是怎么产生和感知的,最直观的理解就是语言是由多个单词组成的,而每个单词又是由多个音素(phone)组成的,但事实却并不是这样。事实上,语言/语音是一个连续动态的过程,之间没有明显的分界,如果你用一个语音编辑器来看的话,波形就是下面的样子:
在这里插入图片描述
语音实际上是一个概率问题,从而意味着在一段连续的语音中,单词之间没有明显的分界,所以从语音到文字的转换永远不可能100% 正确,这其实颠覆了许多程序员的认知。作为程序员,大多数都在处理一就是一,二就是二的问题,而不是一有可能是一,也有可能是二的问题,而语音识别就是后者。

语音的构成

语音是一种连续的音频流,这个音频流是稳定状态与动态改变状态的叠加, 在这种状态序列中,可以定义相似类别的声音或音素。对应于每个音素的波形的声学特性受许多因素影响——环境,扬声器,语音风格等。另外,协同发音(指的是一个音受前后相邻音的影响而发生变化,从发声机理上看就是人的发声器官在一个音转向另一个音时其特性只能渐变,从而使得后一个音的频谱与其他条件下的频谱产生差异)的存在使得音素的感知与标准不一样,所以我们需要根据上下文来辨别音素。将一个音素划分为几个亚音素单元。如:数字“three”,音素的第一部分与在它之前的音素存在关联,中间部分是稳定的部分,而最后一部分则与下一个音素存在关联,这就是为什么在用HMM模型做语音识别时,选择音素的三状态HMM模型。上下文相关建模方法在建模时考虑了这一影响,从而使模型能更准确地描述语音,只考虑前一音的影响的称为双音素Bi-Phone,考虑前一音和后一音的影响的称为 3音素Tri-Phone,甚至4音素Qin-phones。
从计算角度出发,只检测3音素的一部分比把3音素作为整体考虑要有用的多,例如,现在你想创建一个3音素头部部分的检测器,那么你只需要一小部分(大约4000个)不同的短的声音检测器,我们称这些检测器为senones。一个senone的上下文依赖比单纯的左右上下文复杂得多,它是一个可以被决策树或者其他方式来定义的复杂函数。
音素phones构成亚单词单元,也就是音节syllables。音节是一个比较稳定的实体,因为当语音变得比较快的时候,音素往往会发生改变,但是音节却不变。音节与节奏语调的轮廓有关。有几种方式去产生音节:基于形态学或者基于语音学。音节经常在词汇语音识别中使用。
亚单词单元(音节)构成单词。单词在语音识别中很重要,因为单词约束了音素的组合。假如共有40个音素,然后每个单词平均有7个音素,那么就会存在40^7个单词,但幸运的是就算一个受过优等教育的人也很少使用过20k个单词,这就使识别变得可行。
单词和一些非语言学声音构成了话语(语句,utterances),我们把非语言学声音称为填充物(fillers),例如呼吸,um,uh,咳嗽等,它们在音频中是以停顿做分离的。所以它们更多只是语义上面的概念,不算是一个句子。

识别过程

语音识别一般的方法是:录制语音波形,再把波形通过静音(语句之间的间断,silences)分割为多个语句,然后去识别每个语句所表达的意思。为了达到这个目的,我们需要用单词的所有可能组合去匹配这段音频,然后选择匹配度最高的组合。
在匹配中有几个关键的概念需要了解的:

  1. 特征
    由于描述一个语音需要的参数个数非常多,这样对处理速度的要求就很高(而且也没必要处理那么多的信息,我们只需要处理对识别有帮助的就行),所以我们需要做优化,进行降维。我们用帧frames去分割语音波形,每帧大概10ms,然后每帧提取可以代表该帧语音的39个数字,这39个数字也就是该帧语音的特征,用特征向量来表示。而如何提取特征向量是当下热门的研究课题,不过简单说来,这些提取方法都是由频谱衍生出来的。
  2. 模型
    模型是用来描述一些数学对象的。这些数学对象描述了一些口语的共同属性。在实际应用中,senone的音频模型就是三态高斯混合模型。简单的说,它就是一个最有可能的特征向量。对于模型,有几个问题需要考虑:模型到底多大程度上可以描述实际情况?在模型本身的局限情况下模型能表现得更优吗?自适应模型如何改变条件?
    经典的语言模型称为隐马尔科夫模型(Hidden Markov Model, HMM),在该模型中,过程被描述为以一定概率彼此改变的状态序列。 此模型旨在描述任何顺序过程,如语音。 HMM已被证明对语音解码非常实用。
  3. 匹配算法
    语音识别需要对所有的特征向量和所有的模型做比较匹配,这是一个非常耗时的工作。而在这方面的优化往往是使用一些技巧,在每一点的匹配时,我们通过保留最好的匹配变体(variants),然后通过它在下一帧产生最好的匹配变体。

模型

根据语音结构,在语音识别中需要用到三种模型:

  1. 声学模型
    一个声学模型包含每个senone的声学属性,包括不依赖上下文的模型和依赖上下文的模型。其中不依赖上下文的模型包括不依赖于上下文的属性(每个音素最大可能的特征向量),而依赖上下文的模型包括依赖于上下文的属性(根据上下文构建的senone)。
  2. 语音学字典
    语音学字典包含了从单词到音素之间的映射,这种映射并不是十分有效,例如,在字典中只标注了两到三个发音变体,但是这种方法在大多数时候够用。字典并不是描述单词到音素之间的映射的唯一方法。可以通过运用机器学习算法去学习得到一些复杂的函数去完成映射功能。
  3. 语言模型
    语言模型是用来约束单词搜索的,它定义了哪些词能跟在上一个已经识别的词的后面(匹配是一个顺序的处理过程),这样就可以为匹配过程排除一些不可能的单词。最常用的语言模型是n-gram模型,它包含了单词序列的统计和有限状态模型,通过有限状态机来定义语音序列,有时候会加入权值。为了达到比较好的识别准确率,语言模型必须能够很好的约束空间搜索,也就是说可以更好的预测下一个词。语言模型是约束词汇包含的单词的,这就出现一个问题,就是名字识别(因为名字可以随便由几个单词组成)。为了处理这种情况,语言模型可以包含更小的块,例如亚单词,甚至音素。但是这种情况,识别准确率将会低于基于单词的语言模型。
    特征、模型和搜索算法三部分构成了一个语音识别系统。如果你需要识别不同的语言,那么就需要修改这三个部分。很多语言,都已经存在声学模型,字典,甚至大词汇量语言模型可供下载了。

其他概念

  • 网格(Lattice)是一个代表识别变体的有向图。一般来说,很难去获得一个最好的语音匹配结果,所以Lattices就是一个比较好的格式去存放语音识别的中间结果。
  • N-best lists of variants和网格(lattice)有点像,但是它没有网格那么密集(也就是保留的结果没有网格多)。N-best搜索和多遍搜索:为在搜索中利用各种知识源,通常要进行多遍搜索,第一遍使用代价低的知识源(如声学模型、语言模型和音标词典),产生一个候选列表或词候选网格,在此基础上进行使用代价高的知识源(如4阶或5阶的N-Gram、4阶或更高的上下文相关模型)的第二遍搜索得到最佳路径。
  • 单词混淆网络是从网格的边缘得到的一个严格的节点顺序序列。
  • 语音数据库是一个从任务数据库得到的典型的录音集。如果我们开发的是一个对话的系统,那么数据库就是包含了多个用户的对话录音。而对于听写系统,包含的就是朗读的录音。语音数据库是用来训练,调整和测试解码系统的(也就是语音识别系统)。
  • 文本数据库是为了训练语言模型而收集的文本,一般是以样本文本的方式来收集形成的。而收集过程存在一个问题就是误把PDFs, web pages, scans等现成文档也当成口语文本的形式放进数据库中。所以,我们就需要把这些文件里的标签和文件头去掉,还有把数字展开为它们的语音形式(例如1展开为英文的one或者汉语的yi),另外还需要把缩写给扩大还原为完整单词。

CMU Sphinx

简介

CMU Sphinx(简称Sphinx)是美国卡内基梅隆大学开发的一系列语音识别工具包以及相关工具(例如声学模型训练软件,语言模型编辑软件和语音词典CMUDICT等)的总称。在2000年,卡内基梅隆的Sphinx小组致力于开源几个语音识别器组件,包括Sphinx 2和后来的Sphinx 3(2001年)。Sphinx包括许多工具包,可以用于搭建具有不同需求的应用。

  • Pocketsphinx - 用C语言编写的轻量级的语音识别库;
  • Sphinxbase - Pocketsphinx的支撑库;
  • Sphinx4 - 用Java编写的自适应的,可修改的语音识别库;
  • Sphinxtrain - 声学模型训练软件;
    现在最新的发布版本是:
  • sphinxbase-5prealpha
  • pocketsphinx - 5prealpha
  • sphinx4 - 5prealpha
  • sphinxtrain - 5prealpha
    Sphinx除了是开源之外,还具有很多优势,可以自己定制声音模型,语言模型,语音学字典,用于多个不同的场景,例如语音搜索,语义分析,翻译,智能助手等。
    如何选择你需要的工具包呢?
  • 由于Sphinx有用不同的编程语言开发的工具包,所以开发者可以根据自己的习惯选择相应的语言识别包。
  • 如果你想要快速和可携带性,那么选择pocketsphinx,如果你想要灵活和可管理,那么可以选择sphinx4.

Sphinx初体验

让我们先来用Sphinx自带的Pocketsphinx来体验一下Sphinx语音识别的效果吧。由于Pocketsphinx依赖于SphinxBase库(提供了公共的函数功能),所以需要同时安装SphinxBase和Pocketsphinx,Pocketsphinx才能正常工作。Pocketsphinx可以安装在Linux,windows,MacOS,iPhone和Android上,本文中我们将在windows上进行安装。

下载

sphinxbase下载页
pocketsphinx下载页

下载"sphinxbase-5prealpha-win32.zip"和“pocketsphinx-5prealpha-win32.zip”,并解压缩。
在这里插入图片描述

编译

  • 编译Sphinxbase
    用visual studio打开sphinxbase\sphinxbase.sln,编译所有项目,其中visual studio版本需要是MS Visual Studio 2012及以上,我使用的是visual studio 2017。由于编译版本不一样,在打开solution时,会弹出如下窗口,选择OK。
    在这里插入图片描述
    在这里插入图片描述
    编译后的结果:
    在这里插入图片描述
  • 编译Pocketsphinx
    用visual studio打开pocketsphinx\pocketsphinx.sln,编译所有项目。其他步骤与编译sphinxbase相同。编译结果如下:
    在这里插入图片描述
  • 拷贝sphinxbase.dll到上图中的文件夹中
    在这个地方有个小trick,理论上应该是我们自己编译出spinxbase.dll之后进行拷贝,但是我们从网站上下载的pocketsphinx中,bin\Debug\Win32下自带拷贝好的sphinxbase.dll,当然你也可以把你编译好的dll重新拷贝覆盖掉之前的dll。提示:如果你编译了pocketsphinx,最好是把你编译的sphinxbase结果也复制过去,否则可能出现不匹配,造成程序如法运行。

运行

运行命令:
bin\Release\Win32\pocketsphinx_continuous.exe -inmic yes -hmm model\en-us\en-us -lm model\en-us\en-us.lm.bin -dict model\en-us\cmudict-en-us.dict

参数说明:

  • inmic:使用麦克风,如果使用file,修改为-infile
  • hmm:指定声学模型
  • lm:指定语言模型
  • dict:指定语言学字典

运行结果:你可以开始说话了,不过识别结果感人,暂时原因未知,还需要继续学习。
在这里插入图片描述

如果在命令行运行时,遇到如下错误:
在这里插入图片描述
其中MSVCR110D.dll是MSVCR110.dll的debug版本。如果遇到这个问题,说明你的phocketsphinx与sphinxbase不匹配,需要将编译好的sphinxbase结果复制过去。

下一篇 PocketSphinx在windows上的应用示例,开发工具Visual Studio

2018-08-07 10:28:53 audio_algorithm 阅读数 1263

一、语音识别简介

    语音识别的一般框架一般包含几个部分:声学模型、语音模型、以及词典。语音信号(波形)经过前级处理(包括降噪,语音增强,人声检测等)后,提取特征,送入解码模块,进行解析得到识别结果。而解码模块则由 声学模型、语言模型映射、链接组成的网络。目前主流的语音模型一般采用 n-gram 语言模型,声学模型采样隐马尔科夫模型(HMM),这些模型都需要经过预先训练得到。

    上图框架中,发音字典是指系统所能处理的单词的集合,并标明了其发音。通过发音字典得到声学模型的建模单元和语言模型建模单元间的映射关系,从而把声学模型和语言模型连接起来,组成一个搜索的状态空间用于解码器进行解码工作。

二、语音识别开源项目

                                           

    CMU Sphinix,显而易见,从它的名字就能看出来是卡内基梅隆大学的产物。它已经以某些形式存在了 20 年了,现在它在 Github(C (https://github.com/cmusphinx/pocketsphinx) 版本和 Java (https://github.com/cmusphinx/sphinx4) 版本)和 SourceForge (https://sourceforge.net/projects/cmusphinx/) 上都开源了,而且两个平台上都有活动。Github 上的 Java 版本和 C 版本都只有一个贡献者,但是这并不影响此项目的历史真实性(在 SourceForge repo 上有 9 个管理人员还有很多开发者)

    Kaldi 从 2009 年的研讨会起就有它的学术根基了,现在已经在 GitHub (https://github.com/kaldi-asr/kaldi) 上开源,有 121 名贡献者。HTK 始于 1989 年的剑桥大学,已经商用一段时间了,但是现在它的版权又回到了剑桥大学并且已经不是开源软件了。它的版本更新于 2015 年 12 月,先前发布于 2009 年。Julius (http://julius.osdn.jp/en_index.php) 起源于 1997 年,最后一个主要版本发布于 2016 年 9 月,有些活跃的 Github repo 包含三个贡献者,现在已经不大可能反应真实情况了。ISIP 是第一个型的开源语音识别系统,源于密西西比州立大学。它主要发展于 1996 到 1999 年间,最后版本发布于 2011 年,但是这个项目在 Github 出现前就已经不复存在了。

三、PocketSphinx编译运行

3.1.准备

操作系统:windows 7 64Bit SP1

编译器:Viual Studio 2013

pocketsphinx版本:5prealpha

在Sphinx官网下有如下几个下载目录:

  • Pocketsphinx — lightweight recognizer library written in C  (C语言开发的轻量级语音识别引擎)
  • Sphinxtrain — acoustic model training tools (声学模型训练工具)
  • Sphinxbase — support library required by Pocketsphinx and Sphinxtrain (Pocketsphinx和Sphinxtrain的基础类库 )
  • Sphinx4 — adjustable, modifiable recognizer written in Java (Java语言开发的可调节、可修改的语音识别引擎)

这里我们下载Pocketsphinx和Sphinxbase,下载地址:

   https://sourceforge.net/projects/cmusphinx/files/sphinxbase/5prealpha/

   https://sourceforge.net/projects/cmusphinx/files/pocketsphinx/5prealpha/

3.2.编译

1)pocketsphinx依赖于sphinxbase,因此需要先编译sphinxbase。

使用VS2013打开sphinxbase.sln,直接点击生成解决方案即可

 

输出结果

 

2)使用VS2013打开pocketsphinx.sln,直接点击生成解决方案,结果报错了。。。

 

将sphinxbase的头文件目录以及.lib文件目录加入工程中,看错误估计是路径不对,继续编译就通过了。

至此,pocketsphinx的编译工作结束了

 

3.3.运行

将sphinxbase.dll复制到pocketsphinx运行目录下,不然会报缺少DLL的错误。

 

如果有麦克风可以运行一下命令:

pocketsphinx_continuous.exe -inmic yes -hmm model\en-us\en-us -lm model\en-us\en-us.lm.bin -dict model\en-us\cmudict-en-us.dict

 

也可以用文件来运行:

pocketsphinx_continuous.exe -infile C:\Users\Administrator\Desktop\pocketsphinx-5prealpha-win32\pocketsphinx\test\data\speech61-70968-0017.wav  -backtrace yes -hmm C:\Users\Administrator\Desktop\pocketsphinx-5prealpha-win32\pocketsphinx\model\en-us\en-us -lm C:\Users\Administrator\Desktop\pocketsphinx-5prealpha-win32\pocketsphinx\model\en-us\en-us.lm.bin -dict C:\Users\Administrator\Desktop\pocketsphinx-5prealpha-win32\pocketsphinx\model\en-us\cmudict-en-us.dict

运行结果:

截图中倒数第7行,即为识别结果,输入音频文件的原句如下:

   I COULD NOT SEE MY BOY INJURED EXCELLENCE FOR BUT DOING HIS DUTY AS ONE OF CUMBERLAND'S SONS

四 、模型的获取

1、在线生成语言模型和词典的工具 http://www.speech.cs.cmu.edu/tools/lmtool-new.html 

2、已经训练好的模型下载地址:https://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/

  其中Mandarin为中文普通话,下载下来之后我们可以看到
  声学模型:zh_broadcastnews_16k_ptm256_8000.tar.bz2
  语言模型:zh_broadcastnews_64000_utf8.DMP
  拼音字典:zh_broadcastnews_utf8.dic


zh_broadcastnews_ptm256_8000目录结构
├── feat.params   //HMM模型的特征参数
├── mdef   //模型定义文件(为每个即将进行训练的HMM的每一状态定义一个独特的数字标识)
├── means  //混合高斯模型的均值
├── mixture_weights   //混合权重
├── noisedict    //噪声也就是非语音字典
├── sendump  //用来从声学模型中获取mixture_weights文件的?
├── transition_matrices  //HMM模型的状态转移矩阵
└── variances  //混合高斯模型的方差

其他的中文声学模型还有tdt_sc_8k,该模型可以在pocketsphinx-0.8-win32中找到。

unity 语音识别

阅读数 17415

语音识别技术

阅读数 69

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