在Vista上使用Microsoft的SAPI 5.3 Speech API,您如何以编程方式对RecoProfile进行声学模型培训?更具体地说,如果您有一个文本文件和一个用户说出该文本的音频文件,您将使用该文本和音频训练用户的个人资料进行什么样的SAPI调用?
关于这个问题的更多信息我还没有解决:你在"开头"调用ISpRecognizer2.SetTrainingState(TRUE,TRUE),在"结尾"调用ISpRecognizer2.SetTrainingState(FALSE,TRUE).但目前还不清楚这些行动何时必须相对于其他行动发生.
例如,您必须进行各种调用以设置语法,其中包含与您的音频匹配的文本,以及其他用于连接音频的调用,以及对各种对象的其他调用,以表示"您现在可以开始使用".但是什么是相互依赖性 - 在其他什么之前必须发生什么?如果您使用音频文件而不是系统麦克风进行输入,这是否会使相对时间变得不那么宽容,因为识别器不会继续坐在那里听,直到说话者正确?
实施SAPI培训相对比较困难,文档并没有真正告诉您需要了解的内容.
ISpRecognizer2 :: SetTrainingState将识别器切换到训练模式或从训练模式中切换出来.
当你进入训练模式时,所有真正发生的事情是识别器为用户提供了更多关于识别的余地.因此,如果您正在尝试识别短语,则引擎对识别的严格程度会低得多.
在您离开训练模式之前,引擎并未真正进行任何调整,并且您已设置fAdaptFromTrainingData标志.
当引擎适应时,它扫描存储在配置文件数据下的训练音频.培训代码负责将新的音频文件放在引擎可以找到它以进行改编的地方.
这些文件也必须贴上标签,以便引擎知道所说的内容.
那你怎么做的?您需要使用三个鲜为人知的SAPI API.特别是,您需要使用ISpRecognizer :: GetObjectToken和 SpObjectToken :: GetStorageFileName来获取配置文件令牌以正确定位文件.
最后,您还需要使用ISpTranscript生成正确标记的音频文件.
要将它们放在一起,您需要执行以下操作(伪代码):
创建一个inproc识别器并绑定适当的音频输入.
确保您保留音频以供您识别; 你以后需要它.
创建包含要训练的文本的语法.
设置语法的状态以在识别发生时暂停识别器.(这也有助于从音频文件进行培训.)
识别时:
获取已识别的文本和保留的音频.
使用CoCreateInstance(CLSID_SpStream)创建流对象.
使用ISpRecognizer :: GetObjectToken和ISpObjectToken :: GetStorageFileName创建训练音频文件,并将其绑定到流(使用ISpStream :: BindToFile).
将保留的音频复制到流对象中.
QI是ISpTranscript接口的流对象,并使用ISpTranscript :: AppendTranscript将识别的文本添加到流中.
更新下一个话语的语法,恢复识别器,然后重复,直到您没有训练文本.