You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Alexa Skill的LaunchRequest事件中区分调用起始动词?

区分Alexa Skill调用动词的解决方案

完全可以实现区分不同调用动词的需求,下面给你两个可靠的思路,从规范实现和灵活适配两个角度来解决:

思路一:利用请求类型与Intent映射(推荐,符合Alexa设计规范)

Alexa本身会根据用户的调用动词触发不同的请求类型:

  • 当用户说Open MyMusicSkillName时,会触发LaunchRequest
  • 当用户说Play MyMusicSkillName时,你可以让它触发自定义的播放Intent(比如PlayMusicIntent),而非LaunchRequest

具体步骤:

  1. 在Skill的交互模型中添加自定义PlayMusicIntent,并补充足够的样本 utterance,比如:
    • Play MyMusicSkillName
    • Start streaming on MyMusicSkillName
    • Play music with MyMusicSkillName
      也可以直接使用Alexa内置的AMAZON.PlayIntent,但自定义Intent更适配你的业务场景。
  2. 在后端代码中分别处理LaunchRequest和PlayMusicIntent:
const Alexa = require('ask-sdk-core');

// 处理"Open"调用:返回欢迎/帮助消息
const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';
    },
    handle(handlerInput) {
        const welcomeMsg = '欢迎使用我的音乐播放器!你可以说「播放音乐」来开始收听,或者询问功能帮助。';
        return handlerInput.responseBuilder
            .speak(welcomeMsg)
            .reprompt(welcomeMsg)
            .getResponse();
    }
};

// 处理"Play"调用:直接启动音频流
const PlayMusicIntentHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'PlayMusicIntent';
    },
    handle(handlerInput) {
        // 替换为你的音频流地址
        const streamUrl = 'https://your-music-stream-url.com/live';
        // 生成播放指令
        return handlerInput.responseBuilder
            .addAudioPlayerPlayDirective('REPLACE_ALL', streamUrl, streamUrl, 0, null)
            .getResponse();
    }
};

// 注册处理器并启动Skill
exports.handler = Alexa.SkillBuilders.custom()
    .addRequestHandlers(
        LaunchRequestHandler,
        PlayMusicIntentHandler
    )
    .lambda();

这种方法不需要额外权限,完全遵循Alexa的交互设计,是最稳定可靠的方案。

思路二:解析用户原始语音输入(灵活适配特殊场景)

如果因为某些原因你需要在LaunchRequest中直接区分调用动词,可以通过获取用户的原始语音识别结果来判断。不过这个方法需要开启额外权限:

  1. 在Skill的权限设置中开启「Speech Recognition Result」权限,并提示用户授权。
  2. 在LaunchRequest处理器中解析原始语音文本:
const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';
    },
    handle(handlerInput) {
        // 获取用户原始语音转文本内容
        const userSpeech = handlerInput.requestEnvelope.context.System.speechRecognitionResult?.recognizedSpeech;
        
        if (userSpeech && userSpeech.toLowerCase().includes('play')) {
            // 触发播放逻辑
            const streamUrl = 'https://your-music-stream-url.com/live';
            return handlerInput.responseBuilder
                .addAudioPlayerPlayDirective('REPLACE_ALL', streamUrl, streamUrl, 0, null)
                .getResponse();
        } else {
            // 返回欢迎消息
            const welcomeMsg = '欢迎使用我的音乐播放器!你可以说「播放音乐」来开始收听。';
            return handlerInput.responseBuilder
                .speak(welcomeMsg)
                .getResponse();
        }
    }
};

注意:这个方法依赖用户授权,并且语音识别结果可能存在小概率的识别误差,所以仅作为特殊场景的补充方案,优先推荐思路一。

额外注意事项

  • 测试时务必分别验证Open和Play两种调用方式,确保请求触发正确的处理器。
  • 对于音频流播放,要确保你的流地址符合Alexa的要求(支持HTTPS、正确的编码格式等)。

内容的提问来源于stack exchange,提问作者Giorgio Robino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:26:02