我开始使用 Alexa 技能集,我按照亚马逊开发文档中提到的步骤操作,并为事件源“Alexa 技能集”创建了一个 lambda 函数。如文档中所述,ARN 没有出现在右上角。
我手动尝试如下
arn:aws:lambda:region:account-id:function:function-name
arn:aws:lambda:us-east-1:123456789:function:talkToBerna
Run Code Online (Sandbox Code Playgroud)
但没有运气...错误:无法调用远程端点,或者它返回的响应无效。
有人可以把我放在正确的方向吗?提前致谢
我想利用 AWS Lambda 的版本控制和别名来管理链接到 Alexa Skill 的代码。
因此,我有两个别名PROD和UAT(几乎如AWS 文档中所述)。
但是 - 如果我尝试将我的一个别名(例如arn:aws:lambda:eu-west-1:1234567:function:Alexa-Skill:PROD)的 ARN 配置为 Amazon 开发人员控制台中 Alexa 技能的端点,我会收到以下错误:
Error: Please make sure that "Alexa Skills Kit" is selected for the event source type of arn:aws:lambda:eu-west-1:1234567:function:Alexa-Skill:PROD
不合格的 ARN(即arn:aws:lambda:eu-west-1:1234567:function:Alexa-Skill)工作正常。
这是 Alexa Skills Kit 和 Lambda 之间集成的已知限制吗?
我意识到这个问题可能措辞不当,但这是我能想到的最好的办法。
我的问题是,我在偶尔发出 Alexa 技能命令(比如每隔几分钟)的情况下使用 Alexa,并且我不想每次都重新调用该技能。
目前,在我发出命令后,Alexa 回复说她正在执行该操作,但最后她希望通过以下方式获得新用户输入:
this.emit(':responseReady');
Run Code Online (Sandbox Code Playgroud)
然而,这并不是我想要的,因为大多数时候我不想立即发出另一个命令。相反,几分钟后,我会想再次与该技能互动。
但是,如果我完全退出该技能,下次我将不得不重新调用它,并再次收到整个技能欢迎消息(“欢迎使用技能名称。您可以说……”)。我也不认为这是最佳选择。
有没有办法让该技能保持“打开/激活”状态,以便在该技能的上下文中解释我给出的下一个命令,而不必发出 :responseReady (期望立即响应)并且不必重新启动该技能( “Alexa,打开技能名称”)?
我正在尝试将卡牌添加到我的技能中,但遇到了一个奇怪的障碍。我可以通过 LaunchReqest 使卡片正常显示,但是当它遇到意图请求时,卡片就会停止显示。
显示卡片的代码与 LaunchRequest 的代码相同:
return handlerInput.getResponseBuilder()
.withSpeech(speechText)
.withSimpleCard("HelloWorld", speechText)
.withReprompt(speechText)
.build();
Run Code Online (Sandbox Code Playgroud)
从字面上看,这只是我想要展示的一张卡片的简单回应。这出现在 Alexa 获取的 JSON 中:
(亚马逊不允许您从控制台复制。)
这是在开发控制台中,我目前最好的猜测是它只是一个开发控制台错误,而不是真正的错误,但我们尚未使用配套应用程序在真实设备上进行测试,所以我可能是错的。
这里的任何方向都会有帮助,从我所有的在线阅读来看,这应该有效,特别是因为相同的文本在 LaunchReqest 中有效,但在 IntentRequest 中无效。
有什么方法可以识别用户是否是第一次启动技能?不使用后端数据库来存储访问信息?
例如,请求对象指定用户是否已授予权限。有没有办法还可以识别用户是否是第一次启动该技能?
{
"version":"1.0",
"session":{
"new":true,
"sessionId":"amzn1.echo-api.session.abc",
"application":{
"applicationId":"amzn1.ask.sabc3"
},
"user":{
"userId":"amzn1.ask.account.AGQ"
}
},
"context":{
"System":{
"application":{
"applicationId":"amzn1.ask.skill.bb"
},
"user":{
"userId":"amzn1.ask.account.AGQ"
},
"device":{
"deviceId":"amzn1.ask.device.AHH",
"supportedInterfaces":{
}
},
"apiEndpoint":"https://api.amazonalexa.com",
"apiAccessToken":"eysed"
}
},
"request":{
"type":"LaunchRequest",
"requestId":"amzn1.echo-api.request.09b",
"timestamp":"2018-10-15T17:03:03Z",
"locale":"en-US",
"shouldLinkResultBeReturned":false
}
}
Run Code Online (Sandbox Code Playgroud) 我正在研究玩具 Alexa 技能,并且正在遵循猜数字游戏中的示例(此处为代码)。在例子中他们
from ask_sdk_core.handler_input import HandlerInput
@sb.request_handler(can_handle_func=is_request_type("LaunchRequest"))
def launch_request_handler(handler_input):
"""Handler for Skill Launch.
Get the persistence attributes, to figure out the game state.
"""
# type: (HandlerInput) -> Response
attr = handler_input.attributes_manager.persistent_attributes
Run Code Online (Sandbox Code Playgroud)
这个attr对象允许我在整个会话中保留信息。在 Alexa 开发者控制台中,我在 'session':'attributes' 下的 JSON 中看到此数据 - 我还看到 'session':'user':'userId'
如何userId使用此函数中的 handler_input访问数据?
我在 Alexa 帐户链接授权方面遇到了一些问题。
这些是我遵循的步骤:
handler_input.request_envelope.context.system.user.access_token问题是访问令牌在一小时后过期,Alexa 不管理令牌的刷新。
我应该怎么做才能避免每次一小时后都要求我的用户登录?我应该Implicit grant用作授权类型吗?我应该以某种方式获得刷新令牌吗?
附加信息:这是一项使用 Python3 连接到 AWS Lambda 的自定义技能
google-api google-authentication alexa alexa-skill alexa-skills-kit
我正在尝试从 S3 读取 txt 文件来构建 Alexa 的响应。在 Lambda 中测试代码时,我收到此错误。谁能看到我哪里出错了?
错误
Error handled: s3.getObject is not a function
Run Code Online (Sandbox Code Playgroud)
我已经安装了“aws-sdk”,并且需要该模块位于我的技能的 index.js 顶部
const s3 = require('aws-sdk/clients/s3')
Run Code Online (Sandbox Code Playgroud)
处理程序代码。为了强调这一点,我使用 Async/Await 并在下面的 goGetS3 函数中返回一个 Promise。
const ChooseStoryIntentHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'IntentRequest' &&
handlerInput.requestEnvelope.request.intent.name === 'ChooseStoryIntent';
},
async handle(handlerInput) {
let speechText;
let options = {
"Bucket": "stores",
"Key": "person.txt"
}
await goGetS3(options)
.then((response) => {
console.log(response),
console.log(response.Body.toString()),
speechText = response
})
.catch((err) => {
console.log(err)
speechText = 'something wrong getting the …Run Code Online (Sandbox Code Playgroud) 我有一个问题让我的python lambda函数工作.我得到一个无效的键,用于在调用技能时应该创建的事件数组.我得到的错误是:
{
"stackTrace": [
[
"/var/task/lambda_function.py",
163,
"lambda_handler",
"app_id = event['session']['application']['applicationId']"
]
],
"errorType": "KeyError",
"errorMessage": "'session'"
}
Run Code Online (Sandbox Code Playgroud)
这是我的代码
def lambda_handler(event, context):
"""Lambda function entrypoint."""
# print("event.session.application.applicationId={}".format(
# event['session']['application']['applicationId']))
# Prevent unwanted access to this Lambda function.
app_id = event['session']['application']['applicationId']
if app_id != "amzn1.ask.skill.yyyyyyyy-xxx":
raise ValueError("Invalid Application ID: {}".format(app_id))
request = event['request']
if event['session']['new']:
on_session_started(
{'requestId': request['requestId']}, event['session'])
func_map = {
"LaunchRequest": on_launch,
"IntentRequest": on_intent,
"SessionEndedRequest": on_session_ended,
}
return func_map[request['type']](event['request'], event['session'])
Run Code Online (Sandbox Code Playgroud) 我希望Alexa将电话号码称为数字而不是其值.
例如:
[Alexa]联系电话是9 8 7 6 5 4 3 2 1 0.
但现在Alexa说
联系电话是九十八亿七千六百五十四万三千二百十
谢谢
alexa-skills-kit ×10
alexa ×5
aws-lambda ×3
alexa-skill ×2
python ×2
amazon ×1
amazon-echo ×1
echo ×1
google-api ×1
java ×1
node.js ×1
ssml ×1