NSSpeechRecognizer的文档声明可以从单个口头命令执行复杂的多步骤操作,例如:
“明天十点钟安排与亚当和约翰的会面。”
我能够执行预编程的简单命令,但我不知道如何使用该类解释上述内容。好像是
“安排* * * *”
应该是一个命令。不知道这样的事情是否可行?或者我们是否应该将无数个可能的命令传递给识别器?
答案 0 :(得分:2)
我从NSSpeechRecognizer文档中看不出它会支持使用复杂的短语,例如您给出的示例。要从像这样的短语中获得语义含义,您将使用支持multislot grammars的系统,就像大多数支持VoiceXML标准的IVR系统一样。在我看来,这种语音识别API仅支持将简单命令作为数组传递而不指定复杂的语法规则。使用这种类型的系统,您必须实现所谓的定向对话,这可能是这样的:
C:你想做什么?U:安排会议。
C:告诉我你想参加的第一个人?U:亚当。
C:如果与会者名单完整,请告诉我下一个参加或说“完成”的人。
你:约翰。
C:如果与会者名单完整,请告诉我下一个参加或说“完成”的人。
U:完成。
C:这次会议的哪一天?你:明天。
C:会议现在几点?
U:十点钟。
C:谢谢。你的会议已安排好。使用定向对话框可以将预期的命令/话语限制为更加明确的列表。虽然您的可能名称列表可能非常大,除非您从用户联系人列表中删除它们。
答案 1 :(得分:1)
我对文档的解释是,你需要自己积累和操作任何复合状态。您为NSSpeechRecognizer提供了一组应该识别为“命令”的离散单词/短语,并在识别出它们时向您报告。
对于你给出的例子,我认为当你到达“亚当和约翰”部分时你会遇到问题 - 这不是一个任意的听写引擎。但是,为了好玩,我们试着想象一下我们如何做到这一点:
您可能会告诉它您要将以下短语识别为“命令”:
当识别出单词/短语时,您可以根据先前识别的单词/短语创建一堆语义相关的单词/短语。因此,例如,它识别“安排一个”短语,并且您知道应该有更多信息来填写语义上下文,因此您将该短语推送到堆栈中。接下来,它识别“会议”。您的应用程序说'确定,会议是可以安排的事情'并将其推送到堆栈中。如果它识别的下一个单词与先前识别的“schedule a”命令没有密切关系,那么它将清除堆栈。如果在任何时候,堆栈上的元素满足一些完全形成的语义意图表达的预定义标准,那么您的应用程序可以根据该意图采取适当的操作。这显然也是一个时间因素。如果建立语义上下文所需的下一件事没有在合理的时间内到达,那么语义上下文堆栈应该被清除。
类似的系统,从概念上讲,是iOS / MacOS触控/触控板手势识别系统。当点击触摸发生时,操作系统必须识别单击,并确认这是整个用户意图的可能性,但它还必须管理它很快可能接收到另一个点击的可能性,将单击点击变为双击。随着时间的推移,它必须累积这种状态,并通过查看离散事件的组合来推断用户意图。
你不会免费从NSSpeechRecognizer获得这样的功能,并且它不是一个听写引擎,你也不会从它那里得到任意的'令牌'(比如“Adam and John”,假设你是没有注册一些巨大的名字列表作为潜在的命令。)即便如此,这并不意味着它不能利用像我描述的机制做一些非常整洁的东西。只是你必须自己写。
祝你好运!