Как правильно указать 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.")

Настройка SpeechOutput, подобная этой, также не работает:

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")
    }
};

Кто-нибудь знает, в чем я ошибаюсь?


person David Baker    schedule 21.01.2017    source источник
comment
Используете ли вы помощников, чтобы построить свой ответ?   -  person AppleBaggins    schedule 21.01.2017
comment
Не совсем понимаю, что вы имеете в виду, но я думаю, что нет.   -  person David Baker    schedule 21.01.2017
comment
Вы работаете над шаблоном или примером навыка Alexa?   -  person AppleBaggins    schedule 21.01.2017
comment
Ах да, я следил за официальным руководством, которое теперь, кажется, изменилось ... Я обновил свой вопрос, включив в него свой исходный код.   -  person David Baker    schedule 22.01.2017


Ответы (3)


За исходный код 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 и позвольте alexa-sdk обработать ее оттуда.


Для расширенных функций ssml, таких как паузы, обратите внимание на пакет npm ssml-builder. Это позволяет вам обернуть содержимое вашего ответа в 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>"
    }
  }
}
person Anthony Neace    schedule 23.01.2017

Это старый вопрос, но недавно у меня была аналогичная проблема, и я хотел внести свой вклад с ответом, который не требует дополнительных зависимостей.

Как уже упоминалось, speechOutput предполагается, что это строка, поэтому причина, по которой alexa говорит «объект-объект», заключается в том, что вместо этого это 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"
  },
  ...
}
person Edwin    schedule 28.12.2017
comment
Спасибо, что сработало отлично и без дополнительных зависимостей - person Tyler; 15.01.2018

Вы можете написать свой код так:

'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");
    },

Я столкнулся с той же проблемой, и я мог решить эту проблему, написав код таким образом.

person Shivanshu Garg    schedule 22.08.2019