如何在Alexa Skill启动意图中连续播放两个音频文件?
解决Alexa Skill中连续播放两个音频的问题
核心思路
因为Alexa的单次响应仅支持一个AudioPlayer.Play指令,无法直接在Launch Intent中同时发起两个音频的播放请求。正确的做法是分两步衔接:先播放问候音频,待播放完成后触发AudioPlayer.PlaybackFinished事件,在该事件的处理逻辑中启动音频流播放。
具体实现步骤
1. 在Launch Intent中发起问候音频播放
在Launch Intent的处理函数中,仅添加播放问候MP3的AudioPlayer.Play指令,无需额外输出语音(AudioPlayer指令会接管音频通道,语音输出会被忽略)。
以Node.js的ASK SDK为例:
const LaunchRequestHandler = { canHandle(handlerInput) { return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest'; }, handle(handlerInput) { // 替换为你的问候音频公开URL const greetingAudioUrl = 'https://your-domain.com/greeting.mp3'; // 自定义token,用于后续识别该播放任务 const greetingToken = 'greeting-play-task'; return handlerInput.responseBuilder .addAudioPlayerPlayDirective('REPLACE_ALL', greetingAudioUrl, greetingToken, 0) .getResponse(); } };
2. 启用AudioPlayer接口并配置事件接收
在Alexa开发者控制台的Skill配置页面:
- 进入Interfaces选项卡,启用
AudioPlayer接口,确保Skill能接收播放状态相关事件。 - 确认你的Skill后端(Lambda/自定义端点)允许接收
AudioPlayer.*类型的请求。
3. 处理PlaybackFinished事件,启动音频流
当问候音频播放完成后,Alexa会向Skill发送AudioPlayer.PlaybackFinished请求。在Skill中添加对应的事件处理器,判断播放token为问候音频的标识后,发起音频流的播放请求。
同样以Node.js ASK SDK为例:
const PlaybackFinishedHandler = { canHandle(handlerInput) { const request = handlerInput.requestEnvelope.request; return request.type === 'AudioPlayer.PlaybackFinished' && request.token === 'greeting-play-task'; }, handle(handlerInput) { // 替换为你的音频流公开URL(支持HLS/MP3等流式格式) const streamUrl = 'https://your-stream-server.com/stream.m3u8'; const streamToken = 'stream-play-task'; return handlerInput.responseBuilder .addAudioPlayerPlayDirective('REPLACE_ALL', streamUrl, streamToken, 0) .getResponse(); } };
最后记得将该处理器添加到Skill的请求处理器数组中。
4. 关键注意事项
- 确保问候音频和音频流的URL均为公开可访问,且符合Alexa的音频格式要求(如MP3比特率128kbps以上、HLS流正确分片等)。
- 若需处理播放中断(如用户暂停、设备重启),可额外添加
AudioPlayer.PlaybackStopped、AudioPlayer.PlaybackStarted等事件的处理器,提升流程健壮性。 - 建议在实体Alexa设备上测试,部分模拟器对AudioPlayer的事件触发支持有限。
内容的提问来源于stack exchange,提问作者Stefankarlsberg
相关产品推荐
相关产品推荐

