热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MicrosoftSpeechAPIOverview(SAPI5.4)

MicrosoftSpeechAPIOverview(SAPI5.4)SAPI程序开发接口(API)大大减少了程序使用语音识别和TTS所需的大量代码。使得语音技术能在应用程序中更广泛的应用

Microsoft Speech API Overview(SAPI 5.4)

SAPI程序开发接口(API)大大减少了程序使用语音识别和TTS所需的大量代码。使得语音技术能在应用程序中更广泛的应用,并且更加健壮。本部分内容覆盖如下主题:

API Overview
API for Text-to-Speech
API for Speech Recognition

1. 微软语音API概述

微软SAPI编程接口提供了一个在应用程序和语音引擎之间的高层接口。SAPI实现了所有底层细节需要控制和管理的各种语音引擎的实时操作。
SAPI引擎的两个基本类型是:text-to-speech(TTS)文本语音转换系统和speech recognizers语音识别。TTS系统使用合成语音,将文本串和文件到发声音频。语音识别将人类说话音频转化为可读的文本字符串和文件。

2. Text-to-Speech文本到语音转换API

应用程序可以使用ISpVoice组件对象模型(COM)接口来控制文本到语音(TTS)。当一个应用程序创建了一个ISpVoice对象,应用程序便只需要调用ISpVoice::Speak来从一些文本数据产生语音输出。同时,ISpVoice接口还提供了一些方法用于改变声音和合成属性,如发音的速度ISpVoice::SetRate,输出音量ISpVoice::SetVolume和改变当前音色的ISpVoice::SetVoice。

一些特定的SAPI控制,可以同输入文本一起被插入,用于改变实时属性,如voice、pitch、重音、语速和音量。这些合成标定sapi.xsd,使用标准的XML格式,是一种简单但功能强的的方法来定制TTS语音,独立于特定的引擎或者当前使用的声音。

ISpVoice::Speak方法,可以进行异步(当完成发音后才返回)或同步(作为背景进程立即处理和发音)的操作。当使用同步发音(SPF_ASYNC)时,实时状态信息,如说话状态和当前文本位置,可以通过ISpVoice::GetStatus获得。同时,当进行同步发音时,新文本可以通过立即中断当前输出,或追加到当前输出的末尾来发音。

另外,作为ISpVoice接口的附加,SAPI还提供了一些实用的COM接口来提高TTS应用程序:

事件Events
SAPI通过发送事件,使用标准回调机制(Windows Message, callback proc or Win32 Event)与应用程序通讯。对于TTS,事件大多数用于同步输出语音的情况。应用程序可以同步于其他事件实时操作,如到达词边界、音素和viseme(嘴唇运动)边界或应用程序定制书签。应用程序可以通过使用ISpNotifySource、ISpNotifySink、ISpNotifyTranslator、ISpEventSink、ISpEventSource和ISpNotifyCallback来初始化和处理这些实时事件。

词汇Lexicons
应用程序可以使用ISpContainerLexicon、ISpLexicon和ISpPhoneConverter方法,为语音合成引擎定制单词发音。

音频Audio
最后,这里还有一个接口用于为一些特殊目的定制音频输出,如用于电话和定制硬件(ISpAudio、ISpMMSysAudio、ISpStream、ISpStreamFormat、ISpStreamFormatConverter)。

3. 语音识别API
ISpVoice是主要的语音合成接口,ISpRecoContext则是语音识别的主要接口。像ISpVoice一样,它也是一个ISpEventSource,意思是说它是语音软件工具,用于接受语音识别事件的请求工作。

一个应用程序的选择有两种,两种不同类型的语音识别引擎(ISpRecognizer)。一个可以和其他语音识别软件共享的recognizer,这也是推荐大多数识别软件使用的引擎。要为共享ISpRecognizer创建一个ISpRecoContext,应用软件只需要在组件CLSID_SpSharedRecoContext调用COM的CoCreateInstance即可。在此情况下,SAPI将建立一个音频输入流,设置它为SAPI的默认音频输入流。对于大型服务应用程序,可能需要独立运行于一个系统,此时,性能将是关键。一个InProc语音识别引擎更加何时。要创建一个InProc ISpRecognizer的ISpRecoContext,程序必须首先调用CLSID_SpInprocRecoInstance组件的CoCreateInstance来创建自己的InProc ISpRecognizer。接着,程序需要调用ISpRecognizer::SetInput(参见ISpObjectToken)来建立一个音频输入。最后,要调用ISpRecognizer::CreateRecoContext来获得一个ISpRecoContext。

下一步是为应用程序创建感兴趣的事件消息notifications。ISpRecognizer作为ISpEventSource,同样也是一个ISpNotifySource,应用程序从ISpRecoContext中调用ISpNotifySource方法中的一个,来提示ISpRecoContext中的哪些事件需要报告。然后,它要调用ISpEventSource::SetInterest来确定哪些事件需要notified。最重要的事件是SPEI_RECOGNITION,用于提示ISpRecognizer已经为ISpRecoContext识别了一些语音。其他时间的详细介绍可以参见SPEVENTENUM。

最后,语音软件必须创建、加载和激活一个ISpRecoGrammar,which essentially indicates what type of utterances to recognize, i.e., dictation or a command and control grammar.。首先,程序使用ISpRecoContext::CreateGrammar创建一个ISpRecoGrammar。然后,程序加载合适的语法,可以使用ISpRecoGrammar::LoadDictation加载词典,或ISpRecoGrammar::LoadCmdXXX方法的一个用于命令和控制。最后,调用ISpRecoGrammar::SetDictationState、ISpRecoGrammar::SetRuleState或ISpRecoGrammar::SetRuleIdState为词典或命令和控制激活语法,启识识别。

当识别请求处理返回给应用程序时,SPEVENT结构的lParam成员作为ISpRecoResult返回。通过这个结果,应用程序可以决定识别出了什么。
一个ISpRecognizer,不管是共享的或是InProc的,都可以拥有多个ISpRecoContext与其关联。并且,每一个都将有自己的事件提醒通道。ISpRecoContext又可以创建多个ISpRecoGrammar,每个可用于不同类型的utterances。


推荐阅读
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 本文详细解析了Autofac在高级应用场景中的具体实现,特别是如何通过注册泛型接口的类来优化依赖注入。示例代码展示了如何使用 `builder.RegisterAssemblyTypes` 方法,结合 `typeof(IEventHandler).Assembly` 和 `Where` 过滤条件,动态注册所有符合条件的类,从而简化配置并提高代码的可维护性。此外,文章还探讨了这一方法在复杂系统中的实际应用及其优势。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
  • 本文详细介绍了如何在 Android 应用中获取系统的版本号,包括具体的应用场景和实现步骤。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Flowable 流程图路径与节点展示:已执行节点高亮红色标记,增强可视化效果
    在Flowable流程图中,通常仅显示当前节点,而路径则需自行获取。特别是在多次驳回的情况下,节点可能会出现混乱。本文重点探讨了如何准确地展示流程图效果,包括已结束的流程和正在执行的流程。具体实现方法包括生成带有高亮红色标记的图片,以增强可视化效果,确保用户能够清晰地了解每个节点的状态。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
author-avatar
蔡晓楠
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有