Как правильно указать SSML в лямбда-функции Alexa Skill?
Я пытаюсь создать навык Alexa, где Alexa говорит что-то, что было отмечено с помощью SSML. Я пытался подражать примеру в этом репо, но я всегда получаю лямбда-ответ
{
...
"response": {
"outputSpeech": {
"type": "SSML",
"ssml": "<speak> [object Object] </speak>"
},
...
}
и Алекса буквально говорит "объект объекта".
Вот что я ввожу в свою лямбда-функцию (используя node.js):
var speechOutput = {
type: "SSML",
ssml: 'This <break time=\"0.3s\" /> is not working',
};
this.emit(':tellWithCard', speechOutput, SKILL_NAME, "ya best not repeat after me.")
Установка речи Output, как это также не работает:
var speechOutput = {
type: "SSML",
ssml: 'This <break time=\"0.3s\" /> is not working',
};
РЕДАКТИРОВАТЬ:
index.js
"использовать строгое";
var Alexa = require('alexa-sdk');
var APP_ID = "MY_ID_HERE";
var SKILL_NAME = "MY_SKILL_NAME";
exports.handler = function(event, context, callback) {
var alexa = Alexa.handler(event, context);
alexa.APP_ID = APP_ID;
alexa.registerHandlers(handlers);
alexa.execute();
};
var handlers = {
'LaunchRequest': function () {
this.emit('Speaketh');
},
'MyIntent': function () {
this.emit('Speaketh');
},
'Speaketh': function () {
var speechOutput = {
type: "SSML",
ssml: 'This <break time=\"0.3s\" /> is not working',
};
this.emit(':tellWithCard', speechOutput, SKILL_NAME, "some text here")
}
};
Кто-нибудь есть идеи, где я иду не так?
2 ответа
Согласно исходному коду alexa-sdk для response.js на GitHub, speechOutput
объект в вашем коде, как ожидается, будет строкой. Response.js отвечает за создание объекта ответа, который вы пытаетесь встроить в свой код:
this.handler.response = buildSpeechletResponse({
sessionAttributes: this.attributes,
output: getSSMLResponse(speechOutput),
shouldEndSession: true
});
Копая глубже, buildSpeechletResponse () вызывает createSpeechObject (), который непосредственно отвечает за создание outputSpeech
объект в ответе Alexa Skills Kit.
Поэтому для простых ответов без расширенной функциональности SSML просто отправьте строку в качестве первого параметра на :tell
и пусть Алекса-SDK справится с этим оттуда.
Для расширенной функциональности ssml, такой как паузы, взгляните на пакет ssml-builder npm. Это позволяет вам обернуть содержимое вашего ответа в SSML без необходимости самостоятельно реализовывать или жестко кодировать анализатор SSML.
Пример использования:
var speech = new Speech();
speech.say('This is a test response & works great!');
speech.pause('100ms');
speech.say('How can I help you?');
var speechOutput = speech.ssml(true);
this.emit(':ask', speechOutput , speechOutput);
В этом примере выдается ответ на запрос, в котором как для речевого вывода, так и для повторной речи задано одно и то же значение. SSML Builder правильно проанализирует амперсанд (который является недопустимым символом в SSML) и вставит паузу в 100 мс между двумя операторами say.
Пример ответа:
Alexa Skills Kit создаст следующий объект ответа для кода выше:
{
"outputSpeech": {
"type": "SSML",
"ssml": "<speak> This is a test response and works great! <break time='100ms'/> How can I help you? </speak>"
},
"shouldEndSession": false,
"reprompt": {
"outputSpeech": {
"type": "SSML",
"ssml": "<speak> This is a test response and works great! <break time='100ms'/> How can I help you? </speak>"
}
}
}
Это старый вопрос, но у меня недавно была похожая проблема, и я хотел дать ответ, который не нуждается в дополнительных зависимостях.
Как уже упоминалось, speechOutput
Предположим, что это строка, поэтому Алекс говорит, что "объектный объект" состоит в том, что вместо этого это json.
Попробуем ваш обработчик следующим образом
'Speaketh': function () {
var speechOutput = 'This <break time="0.3s" /> should work';
this.emit(':tellWithCard', speechOutput, SKILL_NAME, "some text here")
}
возвращает этот ответ
{
...
"response": {
"outputSpeech": {
"ssml": "<speak> This <break time=\"0.3s\" /> should work </speak>",
"type": "SSML"
},
...
}
Вы можете написать свой код так:
'BreakIntent':function(){
var speechOutput = 'She is better known as <break time="3s" /> Champion';
var reprompt = "How can I help?";
this.response.speak(speechOutput);
this.response.listen(reprompt);
this.emit(":responseReady");
},
Я столкнулся с той же проблемой и мог решить, написав код таким образом.