使用SAPI 5.3 Speech API进行声学训练

时间:2008-11-18 19:12:20

标签: speech-recognition sapi speech

在Vista上使用Microsoft的SAPI 5.3 Speech API,您如何以编程方式对RecoProfile进行声学模型培训?更具体地说,如果你有一个文本文件和一个说出该文本的用户的音频文件,你会使用该文本和音频来训练用户的个人资料进行什么样的SAPI调用?

更新

有关此问题的更多信息我还没有解决: 您在“开头”调用ISpRecognizer2.SetTrainingState(TRUE,TRUE),在“结尾”调用ISpRecognizer2.SetTrainingState(FALSE,TRUE)。但目前还不清楚这些行动何时必须相对于其他行动发生。

例如,您必须进行各种调用以设置语法,其中包含与您的音频匹配的文本,以及其他用于连接音频的调用,以及对各种对象的其他调用以说“您现在可以开始使用“。但是什么是相互依赖性 - 在其他什么之前必须发生什么?如果您使用音频文件而不是系统麦克风进行输入,这是否会使相对时间变得不那么宽容,因为识别器不会一直坐在那里听,直到说话者听到它为止?

1 个答案:

答案 0 :(得分:15)

实施SAPI培训相对比较困难,文档并没有真正告诉您需要了解的内容。

ISpRecognizer2::SetTrainingState将识别器切换为训练模式或退出训练模式。

当你进入训练模式时,所有真正发生的事情是识别器为用户提供了更多关于识别的余地。因此,如果您正在尝试识别一个短语,那么引擎对识别的严格程度会低得多。

在您离开训练模式之前,引擎并没有真正进行任何调整,并且您已设置了fAdaptFromTrainingData标志。

当引擎适应时,它会扫描存储在配置文件数据下的训练音频。培训代码负责将新的音频文件放在引擎可以找到的位置以供调整。

这些文件也必须贴上标签,以便引擎知道所说的内容。

那你怎么做的?您需要使用三个鲜为人知的SAPI API。特别是,您需要使用ISpRecognizer::GetObjectTokenSpObjectToken::GetStorageFileName来获取配置文件令牌,以便正确找到该文件。

最后,您还需要使用ISpTranscript生成正确标记的音频文件。

要将它们放在一起,您需要执行以下操作(伪代码):

创建一个inproc识别器&绑定适当的音频输入。

确保您保留音频以供识别;你以后会需要的。

创建一个包含要训练的文本的语法。

设置语法状态以在识别发生时暂停识别器。 (这也有助于从音频文件中进行培训。)

识别时:

获取已识别的文字和保留的音频。

使用CoCreateInstance(CLSID_SpStream)创建流对象。

使用ISpRecognizer::GetObjectTokenISpObjectToken::GetStorageFileName创建培训音频文件,并将其绑定到流(使用ISpStream::BindToFile)。

将保留的音频复制到流对象中。

QI ISpTranscript接口的流对象,并使用ISpTranscript::AppendTranscript将已识别的文本添加到流中。

更新下一个话语的语法,恢复识别器,然后重复,直到你没有训练文本。