9

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

更新:

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

例如,您必须进行各种调用以使用与您的音频匹配的文本来设置语法,并进行其他调用以连接音频,以及对各种对象进行其他调用以说“你现在可以开始了”。但是什么是相互依存关系——在发生什么之前必须发生什么?如果您使用音频文件而不是系统麦克风进行输入,这是否会使相对时间不那么宽容,因为识别器不会一直坐在那里听,直到扬声器正确?

4

1 回答 1

16

实施 SAPI 培训相对困难,文档并没有真正告诉您需要了解什么。

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

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

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

当引擎适应时,它会扫描存储在配置文件数据下的训练音频。将新的音频文件放在引擎可以找到的地方进行调整是训练代码的责任。

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

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

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

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

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

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

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

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

发生识别时:

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

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

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

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

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

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

于 2009-10-05T23:26:38.247 回答