Alexa对接
Alexa原理
- 客户打开AlexaAPP并登录账号
- 客户搜索我们得技能, 然后登录认证
- 通过登录接口, 我们返回一个 code给到Aelxa
- Alexa通过code, 请求我们的Oauth授权接口
- Oauth授权接口, 校验code, 并生成refresh_token 和 access_token给到Alexa
- 后续调用接口, 本地接口使用access_token+code一起调用
- Alexa获取到用户得设备列表
- 用户通过APP/通过语音设备输入命令
- Alexa识别并发送信息到对应技能上
概念解析
Intents
Intent代表用户的语音输入的请求, 相当于Request
Slots
Slot相当于请求参数
创建最简单流程
- 进入Amazon开发者中心, 选择Alexa
- 右上角, 三个点, 进入开发者后台(Alexa Developer Console)
- 点击
Create Skill
- 输入技能名称
- 翻到最下面, 选择Python
- 翻到最上, 广告点击
Create skill
- 这里是选择代码模板, 使用第一个(后面是各种特殊场景, 会有一些实现好的逻辑。 第一个是基础版, 里面包含了技能可以实现的最基本内容)
- 进入 Invocations -> Skill Invocation Name, 设置名称, 这个是呼叫 Alexa打开技能时的名字
- 进入 Interation Model -> Intents
- 点击
Add Intent
- 填入你的Intent名称, 最好以驼峰式,Intent为结尾, 如: MyTestIntent
- 点击
Create custom intent
- 设置你的Sample Utterances, 这里的意思你的Intent触发条件
当Alexa识别用户语音, 和你的触发条件匹配时, Alexa会处理对应的逻辑 - 点击
Build Model
- Build完成后, 点击
Code
- 创建你的Handler, 可以参照HelloWorldIntentHandler
class MyTestIntentHandler(AbstractRequestHandler):
"""Handler for Hello World Intent."""
def can_handle(self, handler_input):
# type: (HandlerInput) -> bool
return ask_utils.is_intent_name("MyTestIntent")(handler_input)
def handle(self, handler_input):
# type: (HandlerInput) -> Response
speak_output = "Hi, my Friend!"
return (
handler_input.response_builder
.speak(speak_output)
.ask("Who are you?")
.response
)
- 在代码最下面, 注册一下你的Handler
sb.add_request_handler(MyTestIntentHandler())
- 点击
Deploy
, 进行代码部署 - 点击
Test
, 进行测试 - 点击
Off
, 选择Development
- 输入你的 inmvocation Name
- 输入你的触发条件, 进行测试
- 使用场景:
- Alexa, 告诉我今天热搜是什么
- Alexa, 告诉我今天的计划有什么
- Alexa, 告诉我我有多少钱
创建可以进行交互的流程
该流程跟最简流程基本一致, 但是在代码设置上, 可以以关键字的方式, 获取明确的信息
- 进入 Build -> Custom -> Assets -> Slot Types
- 点击
Add Slot Type
- 输入你的Slot Type 名称
- 点击
Next
- 添加你的Slot Type的值列表
- 点击
Build Model
- 按照最简流程创建你的Intent
- 输入 Sample Utterances: open the door for {myFamily}
- 根据提示, 添加你的 Slot
- 在下方找到你的Slot, 并为他选择你刚刚创建的Slot Type
- 点击
Build Model
- 新增如下代码:
class OpenMyDoorIntentHandler(AbstractRequestHandler):
"""Handler for Hello World Intent."""
def can_handle(self, handler_input):
# type: (HandlerInput) -> bool
return ask_utils.is_intent_name("OpenMyDoorIntent")(handler_input)
def handle(self, handler_input):
# type: (HandlerInput) -> Response
slots = handler_input.request_envelope.request.intent.slots
play_slot = slots.get("myFamily") # 这里是根据你的 Slot名称, 获取到对应的值
speak_output = 'What are you?'
if play_slot:
if play_slot.value.lower() in ['tom', 'luncy', 'tony']:
speak_output = "Welcome, " + play_slot.value
else:
speak_output += play_slot.value
return (
handler_input.response_builder
.speak(speak_output)
.ask("What are you?")
.response
)
- 注册你的Handler
sb.add_request_handler(OpenMyDoorIntentHandler())
- 部署并进行测试