Alexa 技能可以使用 Alexa Lambda 函数或 REST API 终结点进行开发。Lambda 函数是亚马逊在 AWS 中提供的无服务器功能的实现。亚马逊建议使用 Lambda 函数,尽管它们不容易调试。虽然您可以登录到 CloudWatch 日志,但您无法命中断点并进入代码。

这使得对 Alexa 请求的实时调试成为一项非常困难的任务。在这篇文章中,我们将通过使用 Python、npm 和 AWS Lambda 函数为 Amazon Alexa 实现自定义技能。这个技能基本上是一个Hello世界的例子。通过这篇文章,您将能够为 Amazon Alexa 创建自定义技能,使用 Python 实现功能,并从本地计算机和 AWS 启动自定义技能。这篇文章包含来自不同资源的材料,可以在”资源”部分看到。

先决条件

在这里,您有此项目中使用的技术

  1. 亚马逊开发者帐户 –如何获取它
  2. AWS 账户 –在此处免费注册
  3. 询问 CLI =安装和配置 ASK CLI
  4. Python 3.x
  5. 视觉工作室代码
  6. 点包管理器
  7. Alexa Ask 用于 Python(版本 >1.10.2)
  8. 恩罗克

Alexa 技能套件命令行界面 (ASK CLI) 是一个工具,可供您管理您的 Alexa 技能和相关资源,例如 AWS Lambda 函数。借助 ASK CLI,您可以访问技能管理 API,该 API 允许您从命令行以编程方式管理 Alexa 技能。我们将使用这个强大的工具来创建、构建、部署和管理我们的 Hello World 技能。我们开始吧!

使用 ASK CLI 创建技能

对于创建 Alexa 技能,我们将使用以前配置的 de ASK CLI。首先,我们必须执行此命令:

ask new

此命令将运行和交互式分步创建过程:

  1. ASK CLI 要询问我们的第一件事是我们技能的运行时。在我们的例子中 Python3 , :

  1. 最后,ASK CLI 将询问技能的名称。我们将设置名称alexa-python-lambda-helloworld

项目文件

这些是项目的主要文件:

 

19
 
1

2
  • 配置
3
4
  [.vscode]
5
  • 启动.json
6
  • 任务.json
7
  钩子
8
  兰布达
9
  [ ]
10

12
  • 拦截器
13
  • 区域设置
14
  [ ] hello_world.py
15
  [ ] 要求.
16
  模型
17
  • es-ES.json
18
  技能.json
19
  local_debugger

在我们执行命令之前,此配置文件将保持为空ask deploy

  • .vscode/launch.json:启动首选项以在本地运行技能以进行本地测试,并在 中执行所有任务 .vscode/tasks.json 。此设置将启动 local_debugger.py 。此脚本在http://localhost:3001上运行用于调试技能的服务器。
  • 挂钩:包含挂钩脚本的文件夹。亚马逊提供两个钩子:post_new_hook和pre_deploy_hook。
    • post_new_hook:在技能创建后执行。在 Python 中,创建位于 .venv/skill_env 的虚拟环境。
    • pre_deploy_hook:在技能部署之前执行。在 python 中,创建 lambda/py/lambda_upload 将存储所有将 lambda 上载到 AWS 所需的全部必要的文件夹。
  • lambda/py: 包含技能 AWS Lambda 函数的源代码的文件夹:
    • hello_world.py:lambda 主入口点。
    • locales:i18n 库使用的字典 python-i18n ,它允许我们在不同的配置语言中运行相同的技能。
    • requirementes.txt:此文件存储我们项目的 Python 依赖项,是理解和使用 Python 和 pip 的基本部分。
    • errors:包含所有错误处理程序的文件夹。
    • intents:包含所有意向处理程序的文件夹。
    • interceptors:在这里你可以找到所有的拦截器。
  • 模型 = 包含技能交互模型的文件夹。每个交互模型都根据区域设置命名的 JSON 文件中定义。例如,es-ES.json。
  • skill.json• 技能清单。我们项目中最重要的文件之一。
  • local_debugger.py:用于本地调试我们的技能。
  • Python 中的 Lambda 函数

    适用于 Python 的 ASK SDK 允许您花费更多时间实现功能,减少编写样板代码的时间,从而更轻松地构建极具吸引力的技能。

    您可以在其官方GitHub 存储库中找到文档、示例和有用的链接。

    lambda 项目中的主 Python 文件 hello_world.py 位于 lambda/py 文件夹中。此文件包含所有处理程序、拦截器,并导出对象中的 Skill 处理程序 handler

    handler每次针对此特定功能启动 AWS Lambda 时,都会执行该对象。理论上,AWS Lambda 函数只是单个函数。这意味着我们需要定义调度逻辑,以便单个函数请求可以路由到适当的代码,因此处理程序skill_builder导入技能生成器
    从ask_sdk_model导入响应
    从意图导入启动请求处理程序作为启动
    从意图导入 HelloWorld意向处理程序作为你好
    从意图导入帮助意向处理作为帮助
    从意图导入取消或停止意向处理程序作为取消
    从意图导入会话结束请求处理程序作为会话
    从意图导入意向反射器作为反射器
    从错误导入 CatchAllExceptionHandler 作为错误
    从拦截器导入本地化拦截器作为区域设置

    • 技能构建器对象充当技能的入口点,路由所有请求和响应
    • 对上述处理程序的有效负载。确保您已使用的任何新处理程序或拦截器
    * 定义如下。订单很重要 - 从上到下处理。
    sb = 技能构建器()

    sb.add_request_handler(启动。启动请求处理程序())
    sb.add_request_handler(你好。你好世界意向处理())
    sb.add_request_handler(帮助。帮助意向处理())
    sb.add_request_handler(取消。取消或停止意图处理程序())
    sb.add_request_handler(会话)。会话结束请求处理程序())
    • 确保意向反射处理程序是最后一个,这样它不会覆盖您的自定义意图处理程序
    sb.add_request_handler(反射器。意向反射器处理())

    sb.add_global_request_interceptor(区域设置。本地化拦截器())

    sb.add_exception_handler(错误。捕获所有异常处理程序())

    处理程序 = sb.lambda_handler()"数据朗="文本/x-python"*

    29
     
    1
    skill_builder导入技能生成器

    2
    ask_sdk_model导入响应
    3
    意图导入启动请求处理程序作为启动
    4
    意图导入HelloWorld意向处理程序作为你好
    5
    意图导入帮助意向处理作为as帮助
    6
    意图导入取消或停止意向处理程序作为取消
    7
    意图导入意向反射器作为as反射器

    9
    错误导入CatchAllExceptionHandler作为错误
    10
    拦截器导入本地化拦截器作为区域设置
    11
    
    
    12
    • 技能构建器对象充当技能的入口点,路由所有请求和响应
    13
    • 对上述处理程序的有效负载。确保您已使用的任何新处理程序或拦截器
    14
    * 定义如下。订单很重要 - 从上到下处理。
    15
    sb.add_request_handler(发射)。启动请求处理程序())

    18
    sb.add_request_handler(你好)。HelloWorld意向处理机())
    19
    sb.add_request_handler(帮助)。帮助意向处理())
    20
    sb.add_request_handler(取消)。取消或停止意图处理程序())
    21
    sb.add_request_handler(会话)。会话结束请求处理程序())
    22
    • 确保意向反射处理程序是最后一个,这样它不会覆盖您的自定义意图处理程序
    23
    sb

    意向反射器处理 ())

    24
    
    
    25
    sb.add_global_request_interceptor(区域设置)。本地化拦截器())
    26
    
    
    27
    sb.add_exception_handler(错误)。捕获所有异常处理程序())
    28
    
    
    29
    处理程序sb.lambda_handler()

    请务必查看在 LaunchRequestHandler Python 中编写的 Alexa 技能处理程序的示例:

    Python

     

    18
    1
    启动请求处理程序抽象请求处理程序):
    2
    ""技能启动的处理程序"。
    3
    
    
    4
    [ ] 类型: (处理输入) -> 布尔

    6
    
    
    7
    返回ask_utilsis_request_type"启动请求") (handler_input
    8
    
    
    9
    def句柄自我handler_input):
    10
    * 类型: (处理程序输入) -> 响应
    11
    speak_outputi18n.t("字符串。WELCOME_MESSAGE"
    12
    
    
    13
    handler_inputresponse_builder

    15
      .发言speak_output
    16
      .询问speak_output
    17
      .响应
    18
      )

    使用可视化工作室代码构建技能

    技能的生成在 文件夹中和 文件夹中完全自动化 launch.json tasks.json .vscode 。第一个文件用于在本地运行技能,但在该时刻之前,我们将执行第二个文件中定义的一些任务,这些任务是:

    1. create_env:此任务将执行 hooks\post_new_hook 。此脚本将执行以下任务:
      • 如果未使用 安装库,将安装 virtualenv 该库 pip
      • 安装后,如果不在.venv/skill_env
    2. install_dependencies:此任务将安装位于lambda/py/requirements
  • build最后,它将将所有源代码复制到 lambda\py Python 虚拟环境 site-packages 文件夹。
  • 在这里,您可以 tasks.json 找到上面解释的任务和每个操作系统分离的命令的位置:

    Json

     

    50