1. SAPI.51 SDK浅析以及安装
SAPI SDK是微软公司免费提供的语音应用开发工具包,这个SDK中包含了语音应用设计接口(SAPI)、微软的连续语音识别引擎(MCSR)以及微软的语音合成(TTS)引擎等等。目前的5.1版本一共可以支持3种语言的识别 (英语,汉语和日语)以及2种语言的合成(英语和汉语)。SAPI中还包括对于低层控制和高度适应性的直接语音管理、训练向导、事件、语法编译、资源、语音识别(SR)管理以及TTS管理等强大的设计接口。其结构如图(1):

图(1)
语音引擎则通过DDI层(设备驱动接口)和SAPI(SpeechAPI)进行交互,应用程序通过API层和SAPI通信。通过使用这些API,用户可以快速开发在语音识别或语音合成方面应用程序。
SAPI5.1 SDK可以从微软网站下载:http://www.microsoft.com/speech/download/sdk51/ 需要安装程序的有Speech SDK 5.1(68M)和5.1 Language Pack (81.5M)
2. 导入COM对象到.Net
SAPI5.1的基于Windows平台的,通过COM接口进行调用。在.Net平台下要应用SAPI5.1,我们可以利用.Net Framework自带的强大工具TlbImp.exe来把SAPI SDK的COM对象导入到.Net中。TlbImp.exe产生一个管制的包装类,管理客户端可以使用它。包装类管理实际的COM对象的参考数。当包装类当作收集的垃圾时,包装类释放掉它包装的COM对象。当然,你也可以在VS.NET环境中通过从项目参考对话框选择COM对象,实现COM对象的导入,这个过程也是通过TlbImp.exe来完成的。
下面演示如何导入SAPI的COM对象:
SAPI.dll的目录在c:/Program Files/Common Files/Microsoft Shared/Speech
Tlbimp的目录在C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin
在DOS下面运行命令:Tlbimp sapi.dll /out: DotNetSpeech.dll
在安转SDK以后,可以在C:/Program Files/Common Files/Microsoft Shared/Speech/目录下面找到SAPI.dll,这里面定义了SAPI的COM对象,用Tlbimp.exe工具将该dll转换成.net平台下的Assembly---DotNetSpeech.dll,转换的过程会提示不少的警告(warning),但这部影响我们的开发,可以忽略。最后,我们可以用ildasm查看DotnetSpeech.dll里面的对象。
附:警告信息:
C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin>tlbimp sapi.dll /out:Dot
NetSpeech.dll
Microsoft (R) .NET Framework Type Library to Assembly Converter 2.0.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.
NetSpeech.dll
Microsoft (R) .NET Framework Type Library to Assembly Converter 2.0.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.
TlbImp : warning TI0000 : “SpObjectTokenCategory.GetStringValue”的至少一个参数
不能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要
不安全代码进行操作。
TlbImp : warning TI0000 : “SpObjectTokenCategory.EnumKeys”的至少一个参数不能由
运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全
代码进行操作。
TlbImp : warning TI0000 : “SpObjectTokenCategory.EnumValues”的至少一个参数不能
由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安
全代码进行操作。
TlbImp : warning TI0000 : “SpObjectTokenCategory.GetId”的至少一个参数不能由运
行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代
码进行操作。
TlbImp : warning TI0000 : “SpObjectTokenCategory.GetDefaultTokenId”的至少一个
参数不能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能
需要不安全代码进行操作。
TlbImp : warning TI0000 : “ISpObjectTokenCategory.GetStringValue”的至少一个参
数不能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需
要不安全代码进行操作。
TlbImp : warning TI0000 : “ISpObjectTokenCategory.EnumKeys”的至少一个参数不能
由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安
全代码进行操作。
TlbImp : warning TI0000 : “ISpObjectTokenCategory.EnumValues”的至少一个参数不
能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不
安全代码进行操作。
TlbImp : warning TI0000 : “ISpObjectTokenCategory.GetId”的至少一个参数不能由运
行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代
码进行操作。
TlbImp : warning TI0000 : “ISpObjectTokenCategory.GetDefaultTokenId”的至少一个
参数不能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能
需要不安全代码进行操作。
TlbImp : warning TI0000 : “ISpDataKey.GetStringValue”的至少一个参数不能由运行
时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码
进行操作。
TlbImp : warning TI0000 : “ISpDataKey.EnumKeys”的至少一个参数不能由运行时封送
拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进行操
作。
TlbImp : warning TI0000 : “ISpDataKey.EnumValues”的至少一个参数不能由运行时封
送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进行
操作。
TlbImp : warning TI0000 : “ISpObjectToken.GetStringValue”的至少一个参数不能由
运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全
代码进行操作。
TlbImp : warning TI0000 : “ISpObjectToken.EnumKeys”的至少一个参数不能由运行时
封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进
行操作。
TlbImp : warning TI0000 : “ISpObjectToken.EnumValues”的至少一个参数不能由运行
时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码
进行操作。
TlbImp : warning TI0000 : “ISpObjectToken.GetId”的至少一个参数不能由运行时封送
拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进行操
作。
TlbImp : warning TI0000 : “ISpObjectToken.GetStorageFileName”的至少一个参数不
能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不
安全代码进行操作。
TlbImp : warning TI0000 : “SpObjectToken.GetStringValue”的至少一个参数不能由运
行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代
码进行操作。
TlbImp : warning TI0000 : “SpObjectToken.EnumKeys”的至少一个参数不能由运行时封
送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进行
操作。
TlbImp : warning TI0000 : “SpObjectToken.EnumValues”的至少一个参数不能由运行时
封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进
行操作。
TlbImp : warning TI0000 : “SpObjectToken.GetId”的至少一个参数不能由运行时封送
拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进行操
作。
TlbImp : warning TI0000 : “SpObjectToken.GetStorageFileName”的至少一个参数不能
由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安
全代码进行操作。
TlbImp : warning TI0000 : “SpStreamFormatConverter.GetFormat”的至少一个参数不
能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不
安全代码进行操作。
TlbImp : warning TI0000 : “ISpStreamFormatConverter.GetFormat”的至少一个参数不
能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不
安全代码进行操作。
TlbImp : warning TI0000 : “ISpStreamFormat.GetFormat”的至少一个参数不能由运行
时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码
进行操作。
TlbImp : warning TI0000 : “SpMMAudioIn.GetFormat”的至少一个参数不能由运行时封
送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进行
操作。
TlbImp : warning TI0000 : “SpMMAudioIn.GetDefaultFormat”的至少一个参数不能由运
行时封送拆收器进行封送处理。
不能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要
不安全代码进行操作。
TlbImp : warning TI0000 : “SpObjectTokenCategory.EnumKeys”的至少一个参数不能由
运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全
代码进行操作。
TlbImp : warning TI0000 : “SpObjectTokenCategory.EnumValues”的至少一个参数不能
由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安
全代码进行操作。
TlbImp : warning TI0000 : “SpObjectTokenCategory.GetId”的至少一个参数不能由运
行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代
码进行操作。
TlbImp : warning TI0000 : “SpObjectTokenCategory.GetDefaultTokenId”的至少一个
参数不能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能
需要不安全代码进行操作。
TlbImp : warning TI0000 : “ISpObjectTokenCategory.GetStringValue”的至少一个参
数不能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需
要不安全代码进行操作。
TlbImp : warning TI0000 : “ISpObjectTokenCategory.EnumKeys”的至少一个参数不能
由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安
全代码进行操作。
TlbImp : warning TI0000 : “ISpObjectTokenCategory.EnumValues”的至少一个参数不
能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不
安全代码进行操作。
TlbImp : warning TI0000 : “ISpObjectTokenCategory.GetId”的至少一个参数不能由运
行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代
码进行操作。
TlbImp : warning TI0000 : “ISpObjectTokenCategory.GetDefaultTokenId”的至少一个
参数不能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能
需要不安全代码进行操作。
TlbImp : warning TI0000 : “ISpDataKey.GetStringValue”的至少一个参数不能由运行
时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码
进行操作。
TlbImp : warning TI0000 : “ISpDataKey.EnumKeys”的至少一个参数不能由运行时封送
拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进行操
作。
TlbImp : warning TI0000 : “ISpDataKey.EnumValues”的至少一个参数不能由运行时封
送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进行
操作。
TlbImp : warning TI0000 : “ISpObjectToken.GetStringValue”的至少一个参数不能由
运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全
代码进行操作。
TlbImp : warning TI0000 : “ISpObjectToken.EnumKeys”的至少一个参数不能由运行时
封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进
行操作。
TlbImp : warning TI0000 : “ISpObjectToken.EnumValues”的至少一个参数不能由运行
时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码
进行操作。
TlbImp : warning TI0000 : “ISpObjectToken.GetId”的至少一个参数不能由运行时封送
拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进行操
作。
TlbImp : warning TI0000 : “ISpObjectToken.GetStorageFileName”的至少一个参数不
能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不
安全代码进行操作。
TlbImp : warning TI0000 : “SpObjectToken.GetStringValue”的至少一个参数不能由运
行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代
码进行操作。
TlbImp : warning TI0000 : “SpObjectToken.EnumKeys”的至少一个参数不能由运行时封
送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进行
操作。
TlbImp : warning TI0000 : “SpObjectToken.EnumValues”的至少一个参数不能由运行时
封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进
行操作。
TlbImp : warning TI0000 : “SpObjectToken.GetId”的至少一个参数不能由运行时封送
拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进行操
作。
TlbImp : warning TI0000 : “SpObjectToken.GetStorageFileName”的至少一个参数不能
由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安
全代码进行操作。
TlbImp : warning TI0000 : “SpStreamFormatConverter.GetFormat”的至少一个参数不
能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不
安全代码进行操作。
TlbImp : warning TI0000 : “ISpStreamFormatConverter.GetFormat”的至少一个参数不
能由运行时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不
安全代码进行操作。
TlbImp : warning TI0000 : “ISpStreamFormat.GetFormat”的至少一个参数不能由运行
时封送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码
进行操作。
TlbImp : warning TI0000 : “SpMMAudioIn.GetFormat”的至少一个参数不能由运行时封
送拆收器进行封送处理。因此,此类参数将作为指针进行传递,并可能需要不安全代码进行
操作。
TlbImp : warning TI0000 : “SpMMAudioIn.GetDefaultFormat”的至少一个参数不能由运
行时封送拆收器进行封送处理。