【发布时间】:2010-11-26 19:22:44
【问题描述】:
我正在使用 XML 语法文件来开发命令和控制应用程序。由于语法中有大约 4000 个条目,我不能将它们全部放在一个文件中(当我尝试加载它时会出错)。我已经编写了多个 XML 语法文件,但是当我尝试加载多个文件时,它会替换之前加载的文件。也就是说程序只识别第二个语法文件中的短语。谁能告诉我如何在单个语音识别应用程序中加载多个语法?
【问题讨论】:
我正在使用 XML 语法文件来开发命令和控制应用程序。由于语法中有大约 4000 个条目,我不能将它们全部放在一个文件中(当我尝试加载它时会出错)。我已经编写了多个 XML 语法文件,但是当我尝试加载多个文件时,它会替换之前加载的文件。也就是说程序只识别第二个语法文件中的短语。谁能告诉我如何在单个语音识别应用程序中加载多个语法?
【问题讨论】:
你可以创建多个语法,你必须给他们不同的 ID。 这些 sn-ps 在 Delphi 中,但您可以适应:
// init
FGrammar1 := SpSharedRecoContext1.CreateGrammar(1); // ID 1
FGrammar1.CmdLoadFromFile('CommandMemo1.xml', SLODynamic);
FGrammar2 := SpSharedRecoContext1.CreateGrammar(2); // ID 2
FGrammar2.CmdLoadFromFile('CommandMemo2.xml', SLODynamic);
// start
FGrammar1.CmdSetRuleIdState(0, SGDSActive);
FGrammar2.CmdSetRuleIdState(0, SGDSActive);
...
// in the onRecognition event, test the grammar Id
case Result.PhraseInfo.GrammarId of
1: if SameText(Txt, 'erase memo') then
Memo1.Text := ''
else
if SameText(Txt, 'select memo') then
Memo1.SelectAll;
2: if SameText(Txt, 'copy memo') then
CopyToClipboard(Memo1.Text)
else
if SameText(Txt, 'paste memo') then
Memo1.Text := PasteFromClipboard;
else
raise Exception.Create('bad GrammarId');
end;
【讨论】: