An example how to play audio with AWS Lambda function for your Amazon Alexa Skill:
The way to do this is to append the same mp3 file to the play queue once the current file is “nearly finished” playing.
const Alexa = require('ask-sdk-core');
const soundURL = 'https://urltosomefile.mp3';
let expectedPreviousToken = '';
const LaunchRequestHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
},
handle(handlerInput) {
expectedPreviousToken = 'sometoken' + Math.random();
return handlerInput.responseBuilder
.speak('start playing sound')
.addAudioPlayerPlayDirective('REPLACE_ALL', soundURL, expectedPreviousToken, 0, null)
.withSimpleCard('Example', 'Example')
.getResponse();
}
};
const StartSoundHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'IntentRequest'
&& handlerInput.requestEnvelope.request.intent.name === 'StartSoundHandler';
},
handle(handlerInput) {
expectedPreviousToken = 'sometoken'+Math.random();
return handlerInput.responseBuilder
.addAudioPlayerPlayDirective
('REPLACE_ALL', soundURL, expectedPreviousToken, 0, null)
.withSimpleCard('Example', 'Example')
.getResponse();
}
};
const ExitHandler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest' &&
(request.intent.name === 'AMAZON.StopIntent' ||
request.intent.name === 'AMAZON.CancelIntent');
},
handle(handlerInput) {
return handlerInput.responseBuilder
.addAudioPlayerStopDirective()
.getResponse();
}
};
const SessionEndedRequestHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'SessionEndedRequest';
},
handle(handlerInput) {
//any cleanup logic goes here
return handlerInput.responseBuilder.getResponse();
}
};
const PausePlaybackHandler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest' &&
request.intent.name === 'AMAZON.PauseIntent';
},
handle(handlerInput) {
return handlerInput.responseBuilder
.speak('Sound is paused.')
.addAudioPlayerStopDirective()
.withSimpleCard('Example', 'Bye!')
.getResponse();
},
};
const AudioPlayerEventHandler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'AudioPlayer.PlaybackStarted' ||
request.type === 'AudioPlayer.PlaybackStopped' ||
request.type === 'AudioPlayer.PlaybackNearlyFinished' ||
request.type === 'AudioPlayer.PlaybackFailed';
},
handle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
switch (request.type) {
case 'AudioPlayer.PlaybackStarted':
expectedPreviousToken = request.token;
return handlerInput.responseBuilder
.getResponse();
case 'AudioPlayer.PlaybackFinished':
return handlerInput.responseBuilder
.getResponse();
case 'AudioPlayer.PlaybackStopped':
return handlerInput.responseBuilder
.getResponse();
case 'AudioPlayer.PlaybackNearlyFinished':
return handlerInput.responseBuilder
.addAudioPlayerPlayDirective
('ENQUEUE', soundURL, 'sometoken', 0, expectedPreviousToken)
.getResponse();
case 'AudioPlayer.PlaybackFailed':
console.log('Playback Failed');
break;
}
return handlerInput.responseBuilder.getResponse();
},
};
const ErrorHandler = {
canHandle() {
return true;
},
handle(handlerInput, error) {
console.log(`Error handled: ${error.message}`);
return handlerInput.responseBuilder
.getResponse();
}
};
exports.handler = Alexa.SkillBuilders.custom()
.addRequestHandlers(
LaunchRequestHandler,
StartSoundHandler,
ExitHandler,
SessionEndedRequestHandler,
PausePlaybackHandler,
AudioPlayerEventHandler)
.addErrorHandlers(ErrorHandler)
.lambda();