(一)SAPI简述
SAPI,软件中的语音技术包括两方面的内容,一个是语音识别(speech recognition) 和语音合成(speech synthesis)。这两个技术都需要语音引擎的支持。
下面我们来了解下基于Windows语音引擎。我以Windows7为例,Windows8及以上版本相同。

首先我们从控制面板中找到屏幕讲述人,并打开设置选项。

从这里我们可以了解到系统所安装的语音识别引擎和语音合成引擎所使用的语音库。计算机的屏幕讲述人使用的就是语音合成引擎。
在语音识别选项卡中:

如果你安装的简体中文本的操作系统,默认只有一个语音识别引擎为简体中文,那么在程序开发时你也只能用于识别普通话,怎样添加对于其它语言的识别。你需要升级计算机为旗舰版,然后在Windows Update更新中安装其它语言包。语言包中就包括该语言的识别引擎。安装完成后如上图所示就多出其它语音识别引擎。
对于语音识别引擎的训练也是很有必要的,因为我们的应用程序最终使用的就是系统的识别引擎,那么识别准确率除了我们写代码时候需要处理,更多也要在于平时对于语音识别引擎的训练。据我不完全测试,完成了基本的语音训练后,在自己写的程序中识别率还是很高的。如果普通话标准的话,识别率在95%-98%左右。当然要识别的精准,还需要代码上的优化。

在语音合成选项卡中(即文本到语音转换)

该选项卡用于配置语音合成引擎所需的语音包。
Windows7 默认就只有Anna和Lili语音包,下面的Hui和Liang是我安装的第三方的语音包。后面会给出所有第三方语音包的下载地址(包括中文、英文、日文和韩文)。
之所以用第三方语音包,因为系统自带的语音包声音比较生硬,第三方语音包更接近自然语音。
上述仅仅是一些开发前的准备工作或者注意事项。下面来介绍SAPI。
SAPI微软最早以SDK开发包的形式发布,之前用的多的是C++的SDK包。后来就集成到了.NET Framework中,以Framework4.0为例:

注意:请使用英文本的文档,中文本后面没有描述信息。
语音识别和语音合成在System.Speech的命名空间下。
该命名空间只有5个子命名空间,基本微软帮我们屏蔽了所有的底层实现。我们只需要从应用角度来组织我们的代码就行了。后续文章中会给出详细的应用案例。
System.Speech.AudioFormat
该命名空间下定义了音频输出格式。如果我们需要把合成的语音保存为wav音频文件可能需要用到里面的内容。
System.Speech.Recognition
System.Speech.Recognition.SrgsGrammar
这两个命名空间依据名称,我们可以推测是关于语音识别的。
System.Speech.Recognition:该命名空间下定义了语音识别引擎和和一些初始化参数所用到的信息类。
System.Speech.Recognition.SrgsGrammar:该命名空间下定义了有关语音识别引擎所用到语法规则的类,也即SRGS。SRGS是指导构建语音识别声学模型的文法。简单来说就是声学建模的一种文法规则,一般我们很少用到,该规则也是由W3C来规范的。包括我们语音合成中的语音库的建模标准都是由W3C来规范的。不过这个和我们开发应用没有太大关系。
System.Speech.Synthesis
System.Speech.Synthesis.TtsEngine
这两个命名空间是关于语音合成。
语音包下载地址:
http://yunpan.cn/lk/QT8GktHZwFU8Q
提取码:7978
360网盘历经过今年最NB的净网行动总算挺了过来,共享功能已经恢复了,如果不能下载请留言。文件列表如下:

压缩包的请解压缩后双击Setup.exe安装。
每个压缩包中有一个类似:

这样压缩文件,这是破解补丁包,因为第三方语音包中不付费的话有一句广告,比较恶心,所有的补丁文件全在压缩包内。解压后得到一个dll文件。
把dll文件放到安装目录下lib文件下替换同名文件就行了,这样就过滤掉广告了。
结束语:这是一篇新手教程。有些点讲的可能会比较细,有些点也有可能被忽视,不足的地方请留言。
(一)SAPI简述的更多相关文章
- 简述 OAuth 2.0 的运作流程
本文将以用户使用 github 登录网站留言为例,简述 OAuth 2.0 的运作流程. 假如我有一个网站,你是我网站上的访客,看了文章想留言表示「朕已阅」,留言时发现有这个网站的帐号才能够留言,此时 ...
- JavaScript单线程和浏览器事件循环简述
JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...
- Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】
原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...
- Android网络定位服务定制简述
Android 添加高德或百度网络定位服务 Android的网络定位服务以第三方的APK方式提供服务,由于在国内Android原生自带的com.google.android.gms服务几乎处于不可用状 ...
- 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述
微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...
- 简述ASP.NET MVC原理
1.为什么ASP.NET需要MVC? 因为随着网站的的数量级越来越大,原始的网站方式,这里指的是WebForm,在运行速度和维护性方面,以及代码量上面,越来越难以满足日益庞大的网站维护成本.代码的重构 ...
- Design Patterns Simplified - Part 2 (Singleton)【设计模式简述--第二部分(单例模式)】
原文链接: http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part-2-singleton/ De ...
- 【翻译】设计模式学习系列1---【Design Patterns Simplified: Part 1【设计模式简述:第一部分】】
原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part1/ Design Pattern ...
- Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)
前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...
随机推荐
- Java JPA 查询实体部分字段
前言 相信大家在用Java JPA作为ORM的时候都会有这种困惑,就是某个表T我仅仅希望取到其中的A.B.C三个字段,可是jpa是通过Entity Class映射的方式组合查询结果的. 那么如何通过使 ...
- Hybrid UI framework shootout: Ionic vs. Famo.us vs. F7 vs. OnsenUI
1 Introduction In the past 2 years I’ve been working intensively on mobile applications, mostly hybr ...
- js singleton
方案一:利用闭包的两个作用,可以变通地读到内部的变量. 方案二: 是可以让这些变量始终在内存中. 方案一 var SingletonTester = (function () { //单例方法 fun ...
- Play on Words
poj1386:http://poj.org/problem?id=1386 题意:给你n个单词,问你是否能够通过调整单词的顺序存在这样的一个序列,使得 每个单词的首字母是前一个单词的尾字母. 题解: ...
- 转:我终于离开了年薪30w的IT行业
题目乍看起来有点故意惹人眼球的味道,但是对于我事实就是如此,暂且请君听我细细道来! 先自曝家门,我03年毕业,05年来深,06年买车子,06年底结婚,07年买了房子,09年生了儿子,妻子.房 ...
- vtk 导出结果图片
项目中需要将渲染结果导出为图片. (1) 一开始搜了vtk的方法,发现: http://blog.csdn.net/lbluekey/article/details/3346312 http://w ...
- SPJ
1. ∏sno(δjno='j1'(spj))2. ∏sno(δpno='p1'(δjno='j1'(spj)))3. ∏sno(δjno='j1'(spj)∞δcolor='红'(p))4. ∏jn ...
- c++转换构造函数和类型转换函数
看stl源码时,有一段代码感觉很奇怪 iterator begin() { return (link_type)((*node).next); } iterator和link_type是两种不同类型, ...
- 最小生成树问题(Kruskal 算法)(克鲁斯卡尔)
如图就是Kuskal算法 将图中的每条边按照权值从小到大排序,每次加起来就行,注意的是不要形成回路: 重点是如何用代码实现不能形成回路 看代码; #include <cstdio> #in ...
- SimpleDateFormat线程不安全问题处理
在工作中,通过SimpleDateFormat将字符串类型转为日期类型时,发现有时返回的日期类型出错,调用方法如下: public final class DateUtil { static fina ...