Alexa Python 开发:构建和部署 Alexa Skill

2025年1月8日 | 阅读 17 分钟

亚马逊 Alexa 是亚马逊开发的虚拟助手。它可以进行语音交互、播放音乐、创建待办事项列表、设置闹钟、播放播客、播放有声读物,并提供实时天气、新闻和交通信息。Alexa 还能够控制各种智能设备,包括灯光、开关、恒温器等。

Python 是一种流行的编程语言,用于构建各种应用程序,包括适用于 Alexa 等虚拟助手的基于语音的应用程序。开发人员可以使用适用于 Python 的 Alexa 技能工具包 (ASK) SDK 为 Alexa 创建可处理语音命令和生成语音响应的自定义技能。

Alexa Python 开发是使用 Python 构建和部署 Alexa 技能的过程。它涉及使用适用于 Python 的 Alexa 技能工具包 SDK、AWS Lambda 和 Alexa 开发人员控制台来创建和发布适用于 Alexa 的自定义技能。

在此过程中,您将在 Alexa 开发人员控制台中创建新技能,编写技能逻辑和响应处理的 Python 代码,将代码部署到 AWS Lambda,并使用 Alexa 开发人员控制台或支持 Alexa 的设备测试技能。

要开始 Alexa Python 开发,您必须对 Python 编程、AWS Lambda 和适用于 Python 的 Alexa 技能工具包 SDK 有基本了解。您还需要一个 AWS 账户和一个支持 Alexa 的设备来测试您的技能。

在开发过程结束时,您将使用 Python 创建一个自定义 Alexa 技能,该技能可以处理语音命令并生成语音响应,从而使您能够以新颖有趣的方式与 Alexa 互动。

必须创建免费的 Alexa 开发人员资料。以下是创建免费 Alexa 开发人员账户 (https://developer.amazon.com/alexa/alexa-skills-kit) 的一般步骤

  • 转到亚马逊开发者门户:https://developer.amazon.com/
  • 点击页面右上角的“登录”按钮。
  • 如果您已有亚马逊账户,您可以使用相同的登录电子邮件和密码登录亚马逊开发者门户。
  • 如果您没有亚马逊账户,您需要点击“创建您的亚马逊账户”按钮,然后按照说明输入您的姓名、电子邮件地址和密码来创建一个。创建亚马逊账户后,您可以使用这些登录凭据登录亚马逊开发者门户。
  • 登录后,点击“创建您的亚马逊开发者账户”按钮。
  • 填写您的个人信息,包括您的姓名、电子邮件地址和密码。
  • 选择“个人”或“公司”账户选项并输入所需信息。
  • 同意条款和条件,然后点击“创建您的账户”按钮。
  • 点击您从亚马逊收到的电子邮件中的验证链接,验证您的电子邮件地址。
  • 您现在可以访问亚马逊开发者控制台并开始构建您的 Alexa 技能。

所需的 Alexa 技能

Alexa 技能的两个最重要的组成部分是技能界面技能服务

技能界面定义了用户和技能之间的语音交互,而技能服务处理技能响应的生成和处理。这两个组件对于成功开发 Alexa 技能都至关重要。

  • 技能界面: 技能界面是 Alexa 技能的前端组件。它定义了用户和技能之间的语音交互。技能界面决定了用户可以对 Alexa 说什么来与技能交互,以及技能可以说什么作为响应。

技能界面定义了用户如何与技能交互。它包括调用名称、意图和话语。调用名称是用户激活技能时所说的话,例如“Alexa,打开 [技能名称]”。意图定义了用户可以在技能中执行的操作,例如“播放歌曲”或“告诉我天气”。话语将用户的口语短语映射到特定的意图。

设计良好的技能界面对于 Alexa 技能的成功至关重要。它应该易于使用和理解,并为用户提供自然直观的交互体验。

  • 技能服务: 技能服务是 Alexa 技能的后端组件。它处理用户请求的逻辑和处理,并生成响应给 Alexa 以供播放。技能服务负责解释用户的语音输入,执行适当的代码来处理请求,并返回响应。

技能服务应设计为能够处理各种场景并提供强大的错误处理。它应该针对性能进行优化,以确保用户收到快速可靠的响应。技能服务可能还需要与其他系统和服务(例如数据库或第三方 API)集成,以提供必要的功能。

技能服务可以托管在 AWS Lambda 函数或 Web 服务上。当用户与 Alexa 技能交互时,请求将发送到技能服务,技能服务处理请求并将响应发送回 Alexa 以供播放。

使用 Python 进行 Alexa 开发的一些优点包括其易用性、简单性和灵活性。Python 是一种高级编程语言,提供了各种库和工具,可以简化开发过程并使其更容易构建自定义技能。

设置环境

在开始使用 Python 构建和部署 Alexa 技能之前,您需要设置您的环境。以下是设置环境的步骤

  • 安装 Python: 您的机器上可能需要安装 Python 3.7 或更高版本。Python 的最新版本可从可靠网站下载。
  • 设置虚拟环境: 建议创建虚拟环境来管理您的 Python 包和依赖项。您可以使用 virtualenv 或 venv 创建新的虚拟环境。
  • 下载适用于 Python 的 Alexa 技能工具包 SDK: 要使用 Python 构建 Alexa 功能,您可能需要获取适用于 Python 的 Alexa 技能工具包 SDK。使用 Python 包管理器 pip,您可以安装 SDK。
  • 安装 AWS 命令行界面 (CLI): 要将您的技能部署到 Amazon Lambda,您必须安装 AWS CLI。借助 AWS CLI,您可以使用命令行与 Amazon 产品进行交互。
  • 设置 AWS 账户: 您需要一个 AWS 账户才能将您的技能部署到 AWS Lambda。您可以在 AWS 网站上注册 AWS 账户。
  • 创建 Alexa 开发人员账户: 您需要创建一个 Alexa 开发人员账户来创建和管理您的 Alexa 技能。您可以在 Alexa 开发人员控制台上创建账户。

设置好环境后,您就可以开始使用 Python 开发和分发 Alexa 技能了。

注册账户

您需要一个亚马逊开发者账户才能注册 Alexa 开发者控制台。如果您已经拥有亚马逊开发者账户,您可以按照以下步骤登录

  • 打开您的网络浏览器并访问 Alexa 开发者控制台网站:https://developer.amazon.com/alexa/console/
  • 点击页面右上角的“登录”按钮。
  • 输入您的亚马逊开发者账户凭据(电子邮件地址和密码),然后点击“登录”按钮。
  • 登录您的亚马逊开发者账户后,您将被重定向到 Alexa 开发者控制台。在这里,您可以创建和管理您的 Alexa 技能。
  • 如果您没有亚马逊开发者账户,您可以通过点击登录页面上的“创建您的亚马逊开发者账户”链接创建一个新账户。您需要提供您的个人和支付信息,并同意亚马逊开发者服务协议的条款和条件。
  • 登录 Alexa 开发者控制台后,您可以通过点击“创建技能”按钮创建一个新的 Alexa 技能。您需要选择一个技能模型(自定义或预构建)、选择一种语言,并定义技能的调用名称(用户将用于启动技能的短语)。然后,您可以使用内置工具设计技能的交互模型,或以 JSON 格式导入模型。
  • 最后,您可以使用控制台的测试工具,通过 AWS Lambda 或网络服务端点定义技能的行为,并测试技能与 Alexa 的交互。

理解 Alexa 技能模型

Alexa 技能模型是 Alexa 开发人员控制台中 Alexa 技能的语音用户界面 (VUI) 的可视化表示。它由三个主要组件组成:调用名称、意图和槽位。

  • 调用名称: 用户用于启动其技能的名称。调用名称是技能模型的第一个组件。它应该独特且易于记忆。
  • 意图: 意图表示用户可以使用您的技能执行的操作。每个意图都有一个名称和一组示例话语(用户可以说的短语来触发意图)。您可以为您的技能定义自定义意图,或使用 Alexa 提供的预构建意图。
  • 槽位: 槽位是用户在与您的技能交互时提供的值的占位符。槽位可以具有预定义值(槽位类型)或自由形式(AMAZON.SearchQuery)。例如,如果您的技能允许用户订购披萨,您可以为披萨类型定义一个槽位(例如,意大利辣香肠、奶酪、素食)。
Alexa Python Development: Build and Deploy an Alexa Skill

要在 Alexa 开发人员控制台中创建新的技能模型,您需要遵循以下步骤

  • 登录 Alexa 开发者控制台,点击“创建技能”按钮。
  • 选择技能模型(自定义或预构建)并选择语言。
  • 定义技能的调用名称。调用名称应唯一且易于记忆。
  • 定义技能的意图。您可以创建自定义意图或使用 Alexa 提供的预构建意图。对于每个意图,您需要提供一个名称和一组示例话语。
  • 定义技能的槽位。对于每个槽位,您需要提供一个名称和类型(预定义或自定义)。您可以创建自定义槽位类型或使用 Alexa 提供的预构建槽位类型。
  • 保存您的技能模型,并使用 AWS Lambda 或网络服务端点定义技能的行为。

定义 Alexa 技能的技能模型后,您可以使用 Alexa 开发人员控制台的测试工具测试交互模型。测试工具允许您模拟与技能的语音交互并验证响应。

登录 Alexa 开发者控制台,点击“创建技能”按钮。

  • 首先,您需要打开网络浏览器并导航到 Alexa 开发人员控制台网站 (https://developer.amazon.com/alexa/console/)。
  • 到达网站后,点击页面右上角的“登录”按钮并输入您的凭据,登录您的亚马逊开发者账户。
  • 登录后,您将被重定向到 Alexa 开发人员控制台主页。
  • 从那里,您可以通过点击页面右上角的“创建技能”按钮来创建新的技能模型。

选择技能模型(自定义或预构建)并选择语言

  • 点击“创建技能”按钮后,系统会提示您选择技能模型。您可以选择“自定义”或“预构建”。
  • 如果您选择“自定义”,您必须从头开始创建一个完全自定义的技能模型。
  • 如果您选择“预构建”,您可以从亚马逊提供的预构建技能模型列表中进行选择。
  • 选择技能模型后,系统会提示您为技能选择语言。您可以选择多种语言,包括英语、西班牙语、法语和德语。

定义技能的调用名称。

  • 调用名称是用户用来启动技能的短语。它应该独特且易于记忆。
  • 在“创建新技能”页面的“技能信息”部分中,在“技能调用名称”字段中输入技能的调用名称。
  • 亚马逊建议选择一个易于说出和记忆的调用名称。例如,如果您的技能是天气应用程序,您可能会选择“天气助手”作为您的调用名称。

定义技能的意图。

  • 意图表示用户可以使用您的技能执行的操作。每个意图都有一个名称和一组示例话语(用户可以说的短语来触发意图)。
  • 在“创建新技能”页面的“交互模型”部分中,点击“意图”选项卡。
  • 点击“添加”按钮为您的技能创建新意图。
  • 在“意图名称”字段中输入意图的名称。例如,如果您的技能是天气应用程序,您可能会创建一个名为“GetWeather”的意图。
  • 在“示例话语”字段中输入一组用户可以说的短语来触发意图。您可以为每个意图添加多个示例话语。例如,对于“GetWeather”意图,您可能包括“今天天气怎么样?”、“告诉我天气预报”或“纽约的温度是多少?”等示例话语。
  • Alexa 处理用户输入并提供输出响应的过程。
Alexa Python Development: Build and Deploy an Alexa Skill

在此过程中,我们使用这些来处理用户输入。

  • JSON 输入对象
  • Alexa 模拟器
  • 后端服务
  • 意图处理函数
  • Alexa 模拟器

当用户输入语音或文本时,JSON 输入对象由输入数据构建。JSON 输入对象包括请求类型、用户的输入意图以及任何相关的槽位值等信息。

Alexa Python Development: Build and Deploy an Alexa Skill
  • Alexa 模拟器然后将此 JSON 输入对象与其他信息捆绑并发送到后端服务。
    Alexa Python Development: Build and Deploy an Alexa Skill
  • 输入 JSON 对象被传递到后端服务,后端服务对其进行分析以确定请求的性质。根据请求类型,JSON 对象被传递给相关的意图处理函数。
  • 意图处理函数在处理输入后收集所需数据,然后将其作为 JSON 响应返回给 Alexa 模拟器。
  • Alexa 模拟器解析意图处理函数的 JSON 输出,然后将语音响应读回给用户。语音响应可能包括与用户输入相关的文本或音频响应。

定义技能的槽位。

  • 槽位是用户在与您的技能交互时提供的值的占位符。例如,如果您的技能允许用户订购披萨,您可以为披萨类型定义一个槽位(例如,意大利辣香肠、奶酪、素食)。
  • 在“创建新技能”页面的“交互模型”部分中,点击“槽位类型”选项卡。在“名称”字段中输入槽位类型的名称。点击“添加”按钮为您的技能创建新的槽位类型。例如,如果您正在创建一个天气应用程序,您可能会创建一个名为“位置”的槽位类型。
  • 在“值”部分中定义槽位类型的值。例如,对于“位置”槽位类型,您可能包括“纽约”、“旧金山”或“伦敦”等值。您还可以为每个值定义同义词,以帮助您的技能理解用户可能指代特定值的不同方式。

构建您的技能

  • 定义技能的意图和槽位后,您可以开始构建技能的功能。
  • 在 Alexa 开发人员控制台的“构建”部分中,您可以使用适用于 Python 的 Alexa 技能工具包 SDK 等工具来编写驱动技能的代码。
  • 您还可以使用内置测试工具或通过使用物理 Alexa 设备测试您的技能。

构建技能后端

构建技能后端涉及开发驱动技能功能的代码。这通常涉及编写能够处理用户输入、处理输入并提供适当输出响应的代码。

您可以使用适用于 Python 的 Alexa 技能工具包 SDK 等工具来构建技能后端。此 SDK 提供了一组 Python 库和工具,可以帮助您编写与 Alexa 服务交互的代码。在为技能构建后端时,您通常会首先在 Alexa 开发人员控制台中定义技能的意图和槽位。这些意图和槽位为您的后端代码提供了工作框架,允许您以结构化的方式处理用户输入。

代码片段

这从适用于 Python 的 Alexa 技能工具包 SDK 导入必要的类和函数。SkillBuilder 类用于构建技能的请求和响应处理程序。Response 类定义要发送回用户的响应。AbstractRequestHandler 和 AbstractExceptionHandler 类分别用作意图处理程序和异常处理程序的基类。

代码片段

这定义了一个名为 sb 的 SkillBuilder 对象和一个名为 HelloWorldIntentHandler 的类。HelloWorldIntentHandler 的 can_handle 方法在传入请求是针对 HelloWorldIntent 意图时返回 True;否则,返回 False。

ask_utils 模块的 is_intent_name 方法用于检查意图的名称。ask_utils 是一个为 Alexa Skill Kit SDK for Python 提供实用函数的模块。它的导入方式如下

代码片段

handler_input 是传递给 can_handle 方法的参数,表示传入请求。

代码片段

这定义了异常处理程序类的 handle 方法。当处理请求时发生异常时,将调用此方法。handle 方法使用 speak_output 变量将要回传给用户的输出消息定义为“抱歉,发生错误。请稍后重试。”。handler_input 对象的 response_builder 属性用于构建将发送回用户的响应。response_builder 的 speak 方法用于设置 Alexa 将回传给用户的消息。

代码片段

我们还定义了一个名为“CatchAllExceptionHandler”的异常处理程序,它捕获在技能执行期间可能发生的任何错误。此异常处理程序会响应一条消息,指示发生错误并建议用户稍后重试。

最后,我们将意图处理程序和异常处理程序添加到 SkillBuilder 对象中,并定义一个 Lambda 函数处理程序,该处理程序使用此 SkillBuilder 对象来处理传入请求。

代码片段

这会创建 SkillBuilder 类的一个实例并将其分配给 sb 变量。接下来,它使用 SkillBuilder 实例的 add_request_handler 方法将 HelloWorldIntentHandler 类的一个实例注册为技能的请求处理程序。当技能收到带有 HelloWorldIntent 的传入请求时,HelloWorldIntentHandler 实例将处理该请求。然后,它使用 SkillBuilder 实例的 add_exception_handler 方法注册一个异常处理程序类 CatchAllExceptionHandler 的实例。当技能的意图处理程序中抛出异常时,将调用此异常处理程序。

提交您的技能以进行认证。

构建并测试您的技能后,您可以将其提交给亚马逊进行认证。认证确保您的技能符合亚马逊的质量标准并与 Alexa 正常工作。您的技能获得认证后,用户将可以通过 Alexa 技能商店使用它。

创建笑话意图处理程序

要创建 JokeIntent 处理程序,您可以遵循与我们之前讨论的 HelloWorldIntent 处理程序类似的过程。

这是一个代码块示例,演示了如何创建 JokeIntentHandler

代码片段

在此,我们创建了一个 JokeIntentHandler 类,它扩展了 AbstractRequestHandler 类。与 HelloWorldIntentHandler 类似,我们定义了一个 can_handle 方法,如果传入请求的意图名称为 JokeIntent,则返回 True。如果意图匹配,将调用 handle 方法来处理请求。

我们调用一个自定义函数 get_random_joke() 来检索一个随机笑话,然后构建一个字符串 speak_output,其中包含笑话,并使用 response_builder 对象构建一个以笑话作为语音输出的响应。

最后,我们通过调用 response_builder 对象的 response 方法返回响应对象。要在您的技能中使用此处理程序,您将以与 HelloWorldIntentHandler 相同的方式将其注册到 SkillBuilder 实例。

代码在编辑器中如下所示

Alexa Python Development: Build and Deploy an Alexa Skill

创建意图处理程序类后,您必须将其作为参数发送到 SkillBuilder.add_request_handler。通过滚动到底部将下一行添加到 lambda_function.py

代码片段

鉴于代码是从上到下读取的,因此记住此行的位置至关重要。因此,请确保对 InstantReflectHandler() 类的调用在对自定义意图处理程序的调用之前。

它应该看起来像这样

代码片段

好的,是时候测试您的代码了!要构建后端服务并保存修改,请点击“部署”按钮。您将验证您的 Alexa 技能前端,以查看其是否按计划执行。

添加笑话

向 Alexa 技能添加笑话是增强用户体验并为对话增添幽默感的有趣方式。可以通过定义新意图并创建自定义意图处理程序来处理意图请求,从而向技能添加笑话。

处理程序可以编程为从预定义列表中生成随机笑话,或从外部 API 或数据库获取笑话。然后,笑话可以作为对用户请求的响应返回,使对话更具吸引力和娱乐性。笑话还可以展示技能的功能和特性,同时提供独特的用户体验。

向 Alexa 技能添加笑话还可以创建更自然的对话流程,允许技能以更具对话性的语气响应用户的请求。它还有助于提高用户参与度和留存率,因为用户更有可能回到他们觉得有趣和愉快的技能。

以下是向笑话意图处理程序添加笑话的示例

代码片段

这是 JokeIntentHandler 类的定义。此类是一个请求处理程序,负责处理对“JokeIntent”意图的请求。

  • 此类的 can_handle 方法检查传入请求是否针对“JokeIntent”意图。如果是,则方法返回 True,表明此请求处理程序可以处理该请求。如果不是,则方法返回 False,表明应由另一个请求处理程序处理该请求。
  • 传递给 can_handle 方法的 handler_input 参数是 HandlerInput 类的一个实例,其中包含有关传入请求的信息,例如请求类型、用户 ID 和意图名称。
  • 在这种情况下,ask_utils 模块的 is_intent_name 方法用于检查传入请求的意图名称是否为“JokeIntent”。
  • 如果 can_handle 方法返回 True,则将调用 JokeIntentHandler 类的 handle 方法来处理请求。如果返回 False,则由不同的请求处理程序处理请求。

代码片段

在这段代码中,定义了一个笑话列表。列表的元素都是字符串,每个字符串都包含一个笑话。当触发 JokeIntent 时,这些笑话将被随机选择并作为技能输出返回。

此列表中包含的笑话是双关语和文字游戏,这是许多 Alexa 技能中常用的笑话。

代码片段

在这段代码中,我们正在创建一个变量 speak_output,它使用 random.choice() 方法从 jokes 列表中随机选择一个笑话。这将确保每次触发意图时都会讲述一个不同的笑话。我们调用它的 speak() 方法将语音输出设置为所选笑话,然后调用 response() 方法来构建并返回响应。然后,我们使用 handler_input.response_builder 对象返回一个响应。

编辑器中的代码如下所示

Alexa Python Development: Build and Deploy an Alexa Skill

请记住

您可以编写包含任何您喜欢的笑话的代码,但 JokeIntentHandler 类中的代码必须准确。

结论

恭喜您开始您的 Alexa Python 开发人员生涯!您自己独有的 Alexa Python 技能现在已成功创建。您现在了解了如何开发新技能、生成意图、实现 Python 代码来管理这些意图,并向用户提供有用的数据。


下一主题AppConfig Python