带有通配符命令元素的NSSpeechRecognizer

时间:2012-01-15 18:05:52

标签: objective-c speech-recognition

NSSpeechRecognizer的文档声明可以从单个口头命令执行复杂的多步骤操作,例如:

  

“明天十点钟安排与亚当和约翰的会面。”

我能够执行预编程的简单命令,但我不知道如何使用该类解释上述内容。好像是

  

“安排* * * *”

应该是一个命令。不知道这样的事情是否可行?或者我们是否应该将无数个可能的命令传递给识别器?

2 个答案:

答案 0 :(得分:2)

我从NSSpeechRecognizer文档中看不出它会支持使用复杂的短语,例如您给出的示例。要从像这样的短语中获得语义含义,您将使用支持multislot grammars的系统,就像大多数支持VoiceXML标准的IVR系统一样。在我看来,这种语音识别API仅支持将简单命令作为数组传递而不指定复杂的语法规则。使用这种类型的系统,您必须实现所谓的定向对话,这可能是这样的:

C:你想做什么?

U:安排会议。

C:告诉我你想参加的第一个人?

U:亚当。

C:如果与会者名单完整,请告诉我下一个参加或说“完成”的人。

你:约翰。

C:如果与会者名单完整,请告诉我下一个参加或说“完成”的人。

U:完成。

C:这次会议的哪一天?

你:明天。

C:会议现在几点?

U:十点钟。

C:谢谢。你的会议已安排好。

使用定向对话框可以将预期的命令/话语限制为更加明确的列表。虽然您的可能名称列表可能非常大,除非您从用户联系人列表中删除它们。

答案 1 :(得分:1)

我对文档的解释是,你需要自己积累和操作任何复合状态。您为NSSpeechRecognizer提供了一组应该识别为“命令”的离散单词/短语,并在识别出它们时向您报告。

对于你给出的例子,我认为当你到达“亚当和约翰”部分时你会遇到问题 - 这不是一个任意的听写引擎。但是,为了好玩,我们试着想象一下我们如何做到这一点:

您可能会告诉它您要将以下短语识别为“命令”:

  • “安排一个”
  • “会面”(也许是“约会”,“playdate”等)
  • “与”
  • “亚当和约翰”
  • “明天”(可能还有其他相关的事情,比如“今天”,“从现在起两天”,一周中的所有日子等)
  • “十点钟”

当识别出单词/短语时,您可以根据先前识别的单词/短语创建一堆语义相关的单词/短语。因此,例如,它识别“安排一个”短语,并且您知道应该有更多信息来填写语义上下文,因此您将该短语推送到堆栈中。接下来,它识别“会议”。您的应用程序说'确定,会议是可以安排的事情'并将其推送到堆栈中。如果它识别的下一个单词与先前识别的“schedule a”命令没有密切关系,那么它将清除堆栈。如果在任何时候,堆栈上的元素满足一些完全形成的语义意图表达的预定义标准,那么您的应用程序可以根据该意图采取适当的操作。这显然也是一个时间因素。如果建立语义上下文所需的下一件事没有在合理的时间内到达,那么语义上下文堆栈应该被清除。

类似的系统,从概念上讲,是iOS / MacOS触控/触控板手势识别系统。当点击触摸发生时,操作系统必须识别单击,并确认这是整个用户意图的可能性,但它还必须管理它很快可能接收到另一个点击的可能性,将单击点击变为双击。随着时间的推移,它必须累积这种状态,并通过查看离散事件的组合来推断用户意图。

你不会免费从NSSpeechRecognizer获得这样的功能,并且它不是一个听写引擎,你也不会从它那里得到任意的'令牌'(比如“Adam and John”,假设你是没有注册一些巨大的名字列表作为潜在的命令。)即便如此,这并不意味着它不能利用像我描述的机制做一些非常整洁的东西。只是你必须自己写。

祝你好运!