永远不会触发 Alexa LaunchRequest
Alexa LaunchRequest is never triggered
我正在使用 Alexa 技能包的 ask-sdk-core。我有以下 LaunchRequestHandler 和 AudioIntentHandler。我遇到的问题是,当我通过说“Alexa,与 skillName 对话”或“Alexa,启动 skillName”来触发技能时,请求以某种方式将 AudioIntent 而不是 LaunchRequest 发送到 lambda 函数,因此,音频流开始播放.我能够通过开发人员控制台触发正常和错误行为。
const LaunchRequestHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';
},
handle(handlerInput) {
const speakOutput = 'This message should be replied if the user launches the skill';
return handlerInput.responseBuilder
.speak(speakOutput)
.reprompt(speakOutput)
.addAudioPlayerStopDirective()
.getResponse();
}
};
和其他几个 IntentHandlers。其中一个 IntentHandlers 启动音频流。
const AudioIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& (Alexa.getIntentName(handlerInput.requestEnvelope) === 'AudioIntent'
|| Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.NextIntent'
|| Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.PreviousIntent');
},
handle(handlerInput) {
// this code should only be triggered if an utterance of the intent has been said and
// not on launch
const streamId = crypto.randomBytes(16).toString("hex");
return handlerInput.responseBuilder
.addAudioPlayerPlayDirective('REPLACE_ALL', mediaPath, streamId, 0, null, null)
.withShouldEndSession(true)
.getResponse();
}
};
ResumeIntentHandler 支持音频意图处理程序
const AudioResumeIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.ResumeIntent';
},
handle(handlerInput) {
// this code should only be triggered if an utterance of the intent has been said and
// not on launch
const streamId = crypto.randomBytes(16).toString("hex");
return handlerInput.responseBuilder
.addAudioPlayerPlayDirective('REPLACE_ALL', mediaPath, streamId, 0, null, null)
.withShouldEndSession(true)
.getResponse();
}
};
以及以下 AudioPlayer 处理程序
const AudioRequestHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope).includes('AudioPlayer.');
},
handle(handlerInput) {
console.log(`AudioRequestHandler: ${handlerInput.requestEnvelope}`)
if(Alexa.getRequestType(handlerInput.requestEnvelope) === 'AudioPlayer.PlaybackFailed') {
console.log("Playback Failed : " + JSON.stringify(handlerInput.requestEnvelope.request.error, null, 2));
return handlerInput.responseBuilder
.speak('Something went wrong')
.getResponse();
}
return handlerInput.responseBuilder
.getResponse();
}
};
单发技能如预期一样发挥作用,例如Aelxa,向 skillName 寻求帮助。我能够实现我所有的非音频意图。还可以帮助意图、取消、停止等按预期工作。为什么在启动时触发音频 Intent?
exports.handler = Alexa.SkillBuilders.custom()
.addRequestHandlers(
LaunchRequestHandler,
AudioRequestHandler,
AudioPauseIntentHandler,
AudioResumeIntentHandler,
NormalReplyIntentHandler,
AudioIntentHandler,
HelpIntentHandler,
CancelAndStopIntentHandler,
FallbackIntentHandler,
SessionEndedRequestHandler,
IntentReflectorHandler)
.addErrorHandlers(
ErrorHandler)
.lambda();
我添加了更好的日志记录。错误行为似乎发生在用户第二次启动该技能之后。第一个技能互动效果很好。之后,“start skillName”触发“AudioIntentHandler”。请求如下所示:
type: IntentRequest
intent: {
name: AudioIntent
confirmationStatus: NONE
}
所以在我看来,我的 addRequestHandlers 不是这里的问题,因为它的 Alexa 发送了错误的意图。根据错误请求正确触发 AudioIntentHandler。
错误的请求包含AudioPlayer信息。可能来自最后一次(第一次互动)与技能。我相信这可能是错误的来源?
AudioPlayer {
offsetInMilliseconds: 3239,
playerActivity: STOPPED,
}
如果用户启动技能并且 Alexa 检测到存在停止的音频,Alexa 是否会继续音频 Intent?我在暂停或停止时没有正确清除音频播放器吗?
const AudioPauseIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.PauseIntent';
},
handle(handlerInput) {
console.log('AudioPauseIntentHandler')
const speakOutput = 'Audio stopped.';
return handlerInput.responseBuilder
.speak(speakOutput)
.addAudioPlayerStopDirective()
.addAudioPlayerClearQueueDirective('CLEAR_ALL')
.getResponse();
}
};
我发现了问题。据我所知,它与我的 skill.json 或 lambda 代码无关。这是 Alexa 的事情,我能够在其他 Alexa 技能中重现同样的奇怪行为。
我主要测试德语。在英语中,我通常使用以下唤醒词来开始技能:
- Alexa,与 skillname 交谈
- Alexa,启动技能名称
这就是问题所在。在德语中,只有“开始”又名。 “开始”的作品。又名“交谈”。 “spreche mit”似乎随机触发技能内的意图而不是 LaunchRequest。
我用第三方技能对此进行了测试,并且能够重现奇怪的行为。
=> 修复:在德语中,以“Alexa, starte skillname”而不是“Alexa, spreche mit skillname”开始技能。
我正在使用 Alexa 技能包的 ask-sdk-core。我有以下 LaunchRequestHandler 和 AudioIntentHandler。我遇到的问题是,当我通过说“Alexa,与 skillName 对话”或“Alexa,启动 skillName”来触发技能时,请求以某种方式将 AudioIntent 而不是 LaunchRequest 发送到 lambda 函数,因此,音频流开始播放.我能够通过开发人员控制台触发正常和错误行为。
const LaunchRequestHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';
},
handle(handlerInput) {
const speakOutput = 'This message should be replied if the user launches the skill';
return handlerInput.responseBuilder
.speak(speakOutput)
.reprompt(speakOutput)
.addAudioPlayerStopDirective()
.getResponse();
}
};
和其他几个 IntentHandlers。其中一个 IntentHandlers 启动音频流。
const AudioIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& (Alexa.getIntentName(handlerInput.requestEnvelope) === 'AudioIntent'
|| Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.NextIntent'
|| Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.PreviousIntent');
},
handle(handlerInput) {
// this code should only be triggered if an utterance of the intent has been said and
// not on launch
const streamId = crypto.randomBytes(16).toString("hex");
return handlerInput.responseBuilder
.addAudioPlayerPlayDirective('REPLACE_ALL', mediaPath, streamId, 0, null, null)
.withShouldEndSession(true)
.getResponse();
}
};
ResumeIntentHandler 支持音频意图处理程序
const AudioResumeIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.ResumeIntent';
},
handle(handlerInput) {
// this code should only be triggered if an utterance of the intent has been said and
// not on launch
const streamId = crypto.randomBytes(16).toString("hex");
return handlerInput.responseBuilder
.addAudioPlayerPlayDirective('REPLACE_ALL', mediaPath, streamId, 0, null, null)
.withShouldEndSession(true)
.getResponse();
}
};
以及以下 AudioPlayer 处理程序
const AudioRequestHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope).includes('AudioPlayer.');
},
handle(handlerInput) {
console.log(`AudioRequestHandler: ${handlerInput.requestEnvelope}`)
if(Alexa.getRequestType(handlerInput.requestEnvelope) === 'AudioPlayer.PlaybackFailed') {
console.log("Playback Failed : " + JSON.stringify(handlerInput.requestEnvelope.request.error, null, 2));
return handlerInput.responseBuilder
.speak('Something went wrong')
.getResponse();
}
return handlerInput.responseBuilder
.getResponse();
}
};
单发技能如预期一样发挥作用,例如Aelxa,向 skillName 寻求帮助。我能够实现我所有的非音频意图。还可以帮助意图、取消、停止等按预期工作。为什么在启动时触发音频 Intent?
exports.handler = Alexa.SkillBuilders.custom()
.addRequestHandlers(
LaunchRequestHandler,
AudioRequestHandler,
AudioPauseIntentHandler,
AudioResumeIntentHandler,
NormalReplyIntentHandler,
AudioIntentHandler,
HelpIntentHandler,
CancelAndStopIntentHandler,
FallbackIntentHandler,
SessionEndedRequestHandler,
IntentReflectorHandler)
.addErrorHandlers(
ErrorHandler)
.lambda();
我添加了更好的日志记录。错误行为似乎发生在用户第二次启动该技能之后。第一个技能互动效果很好。之后,“start skillName”触发“AudioIntentHandler”。请求如下所示:
type: IntentRequest
intent: {
name: AudioIntent
confirmationStatus: NONE
}
所以在我看来,我的 addRequestHandlers 不是这里的问题,因为它的 Alexa 发送了错误的意图。根据错误请求正确触发 AudioIntentHandler。
错误的请求包含AudioPlayer信息。可能来自最后一次(第一次互动)与技能。我相信这可能是错误的来源?
AudioPlayer {
offsetInMilliseconds: 3239,
playerActivity: STOPPED,
}
如果用户启动技能并且 Alexa 检测到存在停止的音频,Alexa 是否会继续音频 Intent?我在暂停或停止时没有正确清除音频播放器吗?
const AudioPauseIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.PauseIntent';
},
handle(handlerInput) {
console.log('AudioPauseIntentHandler')
const speakOutput = 'Audio stopped.';
return handlerInput.responseBuilder
.speak(speakOutput)
.addAudioPlayerStopDirective()
.addAudioPlayerClearQueueDirective('CLEAR_ALL')
.getResponse();
}
};
我发现了问题。据我所知,它与我的 skill.json 或 lambda 代码无关。这是 Alexa 的事情,我能够在其他 Alexa 技能中重现同样的奇怪行为。
我主要测试德语。在英语中,我通常使用以下唤醒词来开始技能:
- Alexa,与 skillname 交谈
- Alexa,启动技能名称
这就是问题所在。在德语中,只有“开始”又名。 “开始”的作品。又名“交谈”。 “spreche mit”似乎随机触发技能内的意图而不是 LaunchRequest。
我用第三方技能对此进行了测试,并且能够重现奇怪的行为。
=> 修复:在德语中,以“Alexa, starte skillname”而不是“Alexa, spreche mit skillname”开始技能。