2008-07-08 09:34:00 bluesen 阅读数 13225
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5926 人正在学习 去看看 杨波

该自动语音识别引擎的特点是:

1.速度很快,可多线程并发识别多个语音源;

2.内核很小,很精干;

3.非常准确,既不会误识别,也不会识别不到;

4.适合识别固定模式的语音,比如:

  a).做外呼系统的,需要准确识别诸如“空号”,“对方没有开机”,“对方不在服务区”,“对方忙”,“彩铃”等诸多情况, 这些情况在信令上很难判断(主要是运营商不传送);

   b).做自动充值系统的,需要判断充值是否成功,甚至要判断更多的细节,用本引擎是最合适的。   有些人采用著名的ASR引擎,比如微软、Nuance等,除了价钱昂贵,使用困难(要写让人望而生畏的语法文件)外,识别率并不高。在上述的应用场合,要求不能误识别。

5.可以消除噪音和环境的影响,在线路音量变化的情况下,仍然保持极高的识别率。

欢迎讨论,或来信索取测试程序。

我的邮箱是:bluesen@bluespace.com.cn 或:bluesen@sina.com

出于商业上的考虑,暂时不能公开算法。

2019-01-24 17:11:28 qq_43685243 阅读数 120
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5926 人正在学习 去看看 杨波
               

1.   基础概念:

RCEngine

是一个封装了语音识别,语音文件操作,电话控制的类,它派生自 RCEngineInterface 抽象基类。所以要在程序中调用 Nuance 的语音识别功能你就必须实例化 RCEngine

NotifiableAdapter

RCEngine 的所有函数都是异步函数,它使用确认 --- 通知形式与用户程序通信,要获取到这些确认和通知消息你必须建立一个消息处理类,而这个类必须派生自 NotifiableAdapter ,并且在实例化 RCEngine 时把本类指针交给 RCEngine

Application object

通常 Nuance 把一个派生自 NotifiableAdapter 的且与一个 RCEngine 对象对应得实例化对象称为一个 Application object 。一个应用程序可以根据自己有多少个 license 来创建多个 Application object 。在 Nuance 的例子和我写的客户端中 RCAPP 就是一个 Application object

Dispatcher object :

他是个事件分发对象,他一直都在不断的作把识别事件分发给各个 RCEngine 的循环,当所有的 RCEngine 都摧毁时他便自动结束事件循环。

Triggerable

触发器,你若要让 Dispatcher 自动在某触发事件放生时调用你的处理函数,那么你的处理函数实现的类必须要派生于 Triggerable 。所以我的代码中 RCAPP 也派生于这个类。

<?XML:NAMESPACE PREFIX = O />

 

2.   本客户端组成:

    RCAPP : 担当 Application object Triggerable 角色。

AudioSampleFetcher 一个为 RCEngine 提供识别数据的辅助类。

CRCDispatcher 担当 Dispatcher object 角色。

3.   本程序中各个类之间的关系:

     每个 RCAPP 包含一个 AudioSampleFetcher 为它在识别时提供数据。

系统中可根据 license 个数创建多个 RCAPP 。各个 RCAPP 的消息需要由 CRCDispatcher 分发。而 CRCDispatcher 是个消息分发的循环体,它只有在所有 RCAPP 都被删除时才退出循环。 CRCDispatcher 在系统中只可以有一个。

4.   识别客户端初始化流程:

     一个客户端从创建到开始可以进行识别需要一系列对象创建过程,这个过程很重要,而且也比较复杂。下面我将一步步地把这个过程描述出来:

4.1. Dispatcher object 的创建:

这是所有操作的开始点。我们需要一些准备工作来创建这个 Dispatcher 对象:

4.1.1. 创建一个 NuanceConfig 对象:

  对于单独语法包的客户端,我们可以用函数 NuanceConfigBuild ()来创建,只要向它提供语法包路径就可以了。对于多语法包的客户端我们要用 NuanceConfigBuildFromCommandLine ()函数来创建,创建时把所有参数作为一个存放字符串数组 (char**) 放到它的第二个参数里,它第一个参数是参数个数。这里必须要注意第二个参数的数据的格式和空格大小写等,任何一个错误都会引起创建失败。我的做法是用一个配置文件存储所有的参数,然后逐一读出,组装成一个字符串指针数组。下面是我的配置文件的部分:

packagedir=H:/GHT/ICA/CVP_M

packagedir=H:/GHT/ICA/CVP_C

audio.Provider=mem

client.Behaviors=calllog,timeout

  。。。。

读出整理后要求的格式是:

-package

H:/GHT/ICA/CVP_M

–package

H:/GHT/ICA/CVP_M

audio.Provider=mem

client.Behaviors=calllog,timeout

。。。。

上面每一行作为字符串( char* )分别存储到以下的 punit 数组中:

typedef char* _tCmdLnUnit;

_tCmdLnUnit punit[256];

然后再调用 NuanceConfigBuildFromCommandLine ()

4.1.2.     创建一个 Dispatcher

这部分比较简单只要把上一步创建的 NuanceConfig 作为参数传入 Dispatcher 的构造函数即可。

 

4.2. 创建 Application object

4.2.1. 创建 RCAPP

      本客户端的 RCAPP 对象就是 Application object 对象。它派生于 NotifiableAdapter Triggerable ,并且它有一个 RCEngine * 的内部成员。

4.2.2.     创建 RCEngine

     其构造函数为: RCEngine(NuanceConfig const* config, DispatcherInterface & dispatcher, Notifiable & notifiable, NuanceStatus & status) ;把刚才创建的 NuanceConfig 对象、 Dispatcher 对象、 RCAPP 对象的指针作为参数即可。

4.3. 启动 Dispatcher 的消息循环:

4.3.1.     创建一个线程:

Dispatcher 的消息循环需要独占一个线程。

4.3.2.     执行消息循环:

只要执行 Dispatcher Dispatch ()函数即可。该函数不会退出,除非所有 RCEngine 都被删掉。当它退出时,就是这个 Dispatcher 应该被删除的时候了。

4.4. HandleInitializationCompleted 被调用:

       当你的 Application object HandleInitializationCompleted 被调用时且通告状态值是 NUANCE_OK 时,说明你的 RCEngine 已初始化成功了。但注意这里并不是表示你可以进行识别了,你还需要做以完一下工作:

 

4.4.1.     设置播音为外部:

因为我们使用的是自己的播放音平台,所以必须设定是外部播音。

4.4.2. 打开数据库

    我们要用到动态语法所以必须要打开数据库。用函数 OpenDatabase ()打开数据库,这里要提供 odbc 数据源名称,用户帐号,数据库类型的信息。

4.4.3. 打开 calllog 通道

   调用 OpenCalllogChannel ()函数打开 callog 通道让 Nuance callog 放到 NuanceConfig 对象创建时参数指定的位置,否则 callog 会放到客户端程序同样路径下。

4.4.4. 创建 AudioSampleFetcher

这是个为识别提供数据的辅助类,在这里创建比较合适。

4.5. HandleNuanceDBOpened

通告状态值是 NUANCE_OK 时,说明你的数据库打开成功。这个时候,你的初始化成功完成了。你可以进入下一步,开始识别了。

4.6. 启动识别:

4.6.1. 设定识别阀值:

     当的识别得分,低于这个值时,识别结果就会被拒绝。

4.6.2. 设定 NoSpeechTimeoutSecs 值:

      RCEngine 启动超后在该值时间内没有人声输入,系统就会结束识别并返回 NoSpeechTimeout 信息。

4.6.3.     预定义输出结果格式:

           当需要格式化的识别结果时,要在这里设定好结果的输出格式。比如我们输入的格式是: <&confidence>spelling:<spelling> 则输出的结果可以是: 69 spelling:chai4 shan1 shan1 . 表示识别分数 69, 识别出来的 slot (这里是 <spelling> )对应的值是 chai4   shan1   shan1

4.6.4.     启动识别:

      使用 RCEngine RecognizeUtterance ()函数启动识别。这里要提供一个 Top grammar ,也就是静态语法中的 top grammar. 识别过程需要一定的时间等待结果,若你要在被过程中启动超时则可以通过设定 behavior.timeout.ExternalPromptDone TRUE ,让之前设定的 NoSpeechTimeoutSecs 生效。

4.6.5.     启动录音:

AudioSampleFetcher StartPlatformDependentRecording 函数调用外部录音平台录音。 AudioSampleFetcher 会创建触发器,该触发器会每 100 毫秒(该值可以在启动触发器时自己定义,推荐用默认的 100 毫秒)进行一次录音数据的输入。

4.6.6.     发现人音 HandleStartOfSpeech

正常的话,当在音频数据中发现人声时,你的 application object HandleStartOfSpeech 被调用。这时你可以停掉外部的平台放音。

4.6.7.     发现语音结束点 HandleEndOfSpeech

当识别系统认为人声结束时,你的 application object HandleEndOfSpeech 会被调用。

4.6.8.     发现语音结束点 HandleRecognitionStopped

当系统识别结束时这个 application object HandleRecognitionStopped 会被调用。这时你要做的是用 AudioSampleFetcher StopPlatformDependentRecording 停掉外部平台录音。用 RecResultGetType ()获取识别结束原因,除了成功外,其中还饱含识别失败的原因等,用 RecResultGetTextResult 获取识别的格式化结果。至此一次识别结束。

5.   识别客户端的关闭:

 

识别客户端关闭的具体步骤是:

5.1. 停止所有识别任务:

RCEngine Abort ()函数终止一切操作。

5.2. 关闭动态语法数据库:

        RCEngine CloseDatabase ()关闭语法数据库。

5.3. 删除所有 Application object( 在它释构时删除它的 RCEngine 对象成员 )

        即删除本客户端的 RCAPP 对象。

5.4. Dispatcher 退出消息循环时删除 Dispatcher object 对象:

      这里一定要等到 Dispatcher 自动退出循环才删掉这个对象,不然会引起错误。

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

2013-03-04 10:30:43 habout632 阅读数 7265
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5926 人正在学习 去看看 杨波

使用Julius搭建一个语音识别引擎这里主要就是听写程序,可以进行一段语音的连续识别,而且主要是针对中文:

一.语音识别引擎的基本结构

基本所有的开源语音识别引擎都是如下的结构,包括:Sphinx,Julius等,下面主要以Julius为例,说明相关的内容:

1.Acoustic Model(声学模型):用于音素的识别。

  所使用的技术:

  1) HMM(Hiden Mokov Model):

  2) GMM(Gaussian Mixture Model):

  3)DFA&NFA:

   构建自己的声学模型:

   可以使用的工具:

2.Phoneme Dictionary(读音词典):用于词语的识别。

   构建自己的读音词典:

   可以使用的工具:


3.Language Model(语言模型):用于语句的识别。

   构建自己的读音词典:

   可以使用的工具:


上面的三者3=>2=>1 依次成依赖关系,只要把上面的三者配置好,一个语音识别引擎就搭建好了,其他的就是利用开发包提供API进行客制化开发了。

二.具体操作

以Julius-Voxforge当中的Sample为例,使用Julius主要就是涉及三个文件:

1.sample.grammar:语言文法。


2. sample.voca:读音词典。


3. julian.jconf:语音识别引擎的主要配置文件。在这里指定相面的三大要素.

至于其他文件:

sample.dfa

sample.dict

sample.term

都是通过命令自动生成的---mkdfa.pl sample。

2019-02-22 16:14:06 ASR358 阅读数 1254
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5926 人正在学习 去看看 杨波

近年来,语音识别技术取得了重大进展,并已开始从实验室走向人们的生活。 预计在未来10年内,语音识别技术将进入各个领域,如工业、家用电子产品、通信、汽车电子。今天小编就语音识别的公司来分析。

大致来看,语音识别可以分为以下三个梯队:
第一梯队:科大讯飞、腾讯、百度
第二梯队:思必驰、捷通华声、声智科技、云之声等
第三梯队:客知音等创业公司或者背靠其他学术或技术团队
在这里插入图片描述

科大讯飞是语音识别领域的老大,无论是市场占有还是技术创新;腾讯和百度团队实力毋容置疑,潜力很大。不管怎么说,第一梯队的语音识别率和团队的技术实力都是最强的。讯飞输入法首发方言识别引擎,支持方言已达15种,用户超过2.5亿。百度在语音识别、语音测试等方面有十几年的数据积累,实力雄厚。

思必驰在技术上也很不错,整体通用识别率属第二梯队,对于生僻字识别也有其优势,主要服务于智能硬件的三个垂直领域:智能机器人、智能车载和智能家居,提供自然语言交互解决方案。捷通华声在语音合成和语义理解上有独特建树。声智科技提供从端到云的智能语音交互技术和服务方案,以及从芯片、模组、开发板到白牌产品的智能语音应用方案。

客知音等创业公司依靠先进的国外语音技术,服务于垂直领域的语音识别和语义转换,在单个领域的语音识别比业界最高水平通用的语音识别引擎要高。目前垂直聚焦于聚焦于寿险行业和政府热线。其他技术团队有中科院声学所和自动化所。

在未来的语音识别市场中,越来越多的公司有望参与其中。 在未来,语音识别的表现可能更多地体现在前端技术和语义理解上。如果机器想要自然地与人沟通,当然,它不能重复这套手机的语音对话规则。它必须考虑许多因素,例如用户说话的环境,周围环境中的噪音,用户不准确的发音或方言。这需要前端技术更准确地模拟人体结构并模拟机器人的听觉系统,以达到解放双手之间自由对话的目的。

文章来自于www.kezhiyin.com

2018-07-31 17:08:50 yibuerbusanbu 阅读数 3445
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5926 人正在学习 去看看 杨波

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

Python 实时语音识别

阅读数 1058

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