Alexa 技能工具包 -Lambda 函数 - 无法验证 SpeechletRequest (java)

Posted

技术标签:

【中文标题】Alexa 技能工具包 -Lambda 函数 - 无法验证 SpeechletRequest (java)【英文标题】:Alexa Skill kit -Lambda function - Could not validate SpeechletRequest (java) 【发布时间】:2016-10-11 02:03:53 【问题描述】:

我尝试基于 https://github.com/amzn/alexa-skills-kit-java 创建一个 HelloWorld 技能,但是当我测试 lambda 函数时,它显示了这个错误


  "errorMessage":"com.amazon.speech.speechlet.SpeechletRequestHandlerException: Could not validate SpeechletRequest null using verifier ApplicationIdSpeechletRequestVerifier, rejecting request",

  "errorType": "java.lang.RuntimeException",

  "stackTrace": [    "com.amazon.speech.speechlet.lambda.SpeechletRequestStreamHandler.handleRequest(SpeechletRequestStreamHandler.java:101)",
 "helloworld.HelloWorldSpeechletRequestStreamHandler.handleRequest(HelloWorldSpeechletRequestStreamHandler.java:43)"

 ],

  "cause": 

    "errorMessage": "Could not validate SpeechletRequest null using 
verifier ApplicationIdSpeechletRequestVerifier, rejecting request",
    "errorType": "com.amazon.speech.speechlet.SpeechletRequestHandlerException",

    "stackTrace": [
      "com.amazon.speech.speechlet.SpeechletRequestHandler.handleSpeechletCall(SpeechletRequestHandler.java:73)",
      "com.amazon.speech.speechlet.lambda.SpeechletRequestStreamHandler.handleRequest(SpeechletRequestStreamHandler.java:98)",
      "helloworld.HelloWorldSpeechletRequestStreamHandler.handleRequest(HelloWorldSpeechletRequestStreamHandler.java:43)"
    ]
  

这是我的 Java 文件

public final class HelloWorldSpeechletRequestStreamHandler extends SpeechletRequestStreamHandler 
    private static final Set<String> supportedApplicationIds = new HashSet<String>();
    static 
        /*
         * This Id can be found on https://developer.amazon.com/edw/home.html#/ "Edit" the relevant
         * Alexa Skill and put the relevant Application Ids in this Set.
         */
        supportedApplicationIds.add("amzn1.echo-sdk-ams.app.[amzn1.echo-sdk-ams.app.56bcdaf9-97fc-47f9-9918-43cb6a90d9f5]");
    


    public HelloWorldSpeechletRequestStreamHandler() 
        super(new HelloWorldSpeechlet(), supportedApplicationIds);
    

我错过了什么??

【问题讨论】:

您找到解决方案了吗?如果有,可以分享一下吗?我有同样的问题。 【参考方案1】:

您在受支持的应用程序 ID 中输入了错误的 ID。该 ID 需要是 Alexa Skills 应用程序的 ID,可在技能信息页面上找到。它应该看起来像这样:

supportedApplicationIds.add("amzn1.ask.skill.c236d019-7d2a-5c96-a02f-ef8ab6f8e023");

我知道演示是 [place id here] 但你真的替换了整个东西。

【讨论】:

谢谢@mmaceachran 请注意,示例 GIT 应用程序的默认行是 //supportedApplicationIds.add("[unique-value-here]"); (注释掉)。您还需要删除 [ ]。【参考方案2】:

对我来说,我遇到了这个异常,因为我试图在“操作”选项卡下没有正确的测试事件 JSON 的情况下运行我的 lambda 函数。如果单击“操作”选项卡,然后单击“配置测试事件”,则应该以它可以解释的 JSON 形式提供函数输入。经过大量查看后,我发现您可以通过转到开发人员控制台来获取此 JSON,您可以在其中创建包含所有技能配置的技能。在左侧单击“测试”选项卡,然后转到“服务模拟器”部分。有一个显示“输入话语”的文本框,您可以在其中以文本形式向您的功能输入语音命令,例如“Alexa 告诉 [yourApp] 打招呼”。单击“询问 [yourApp]”按钮,左侧框中将生成一个 Lambda 请求 JSON,右侧为输出。然后只需将左侧的 JSON 复制并粘贴到 lambda 控制台中的测试事件中,就可以了。

【讨论】:

谢谢@Dan,我的代码有两个问题。 1.将Application Id放在“[]”中,而它不应该是这样的。 2.测试事件中的json格式错误。最后它的工作。【参考方案3】:

我尝试创建包含在https://github.com/amzn/alexa-skills-kit-java 中的地址技能,但我遇到了相同类型的错误。

原来问题出在DeviceAddressSpeechletRequestStreamHandler 并在静态 块中创建Set&lt;String&gt; supportedApplicationIds 的实例。

当我将 new HashSet&lt;&gt;(); 移动到声明类的属性时,它开始工作了。

【讨论】:

【参考方案4】:

我会将static 代码放到您创建的扩展SpeechletLambda 的类中。我相信,这是在加载此类并执行其静态代码之前进行评估并得到解决的地方。

或者,您也可以关闭验证。如果有人非常了解您的开发环境以调用您的私有 lambda 函数,那么他们可能知道足以欺骗您的应用程序 ID。所以验证它没有太多的安全价值。有关关闭它的示例,请参阅here。

【讨论】:

我正在尝试将我的自定义技能部署为 AWS lambda 函数,并且**不是作为 Web 服务**所以扩展 'Speechlet' 而不是 'SpeechServlet' 。所以它没有用。我想在不关闭验证的情况下进行开发。需要做什么建议请:- 我的错。我已经用 Lambda 的示例更新了我的答案和链接。这几乎是一回事。

以上是关于Alexa 技能工具包 -Lambda 函数 - 无法验证 SpeechletRequest (java)的主要内容,如果未能解决你的问题,请参考以下文章

如何加载测试Alexa的技能

在 Alexa 技能中播放由 AWS api 网关创建的 mp3

Alexa 技能包与 Alexa 语音服务

Alexa(智能家居技能)确定设备是否脱机。

Alexa 自定义技能示例话语

聆听 Alexa 技能包中的响应