2017-01-21 5 views
2

Я пытаюсь сделать умение Alexa, где Alexa говорит что-то, что было обозначено SSML. Я пытался подражать пример в этом repo, но я всегда получать ответ лямбдыКак правильно указать SSML в функции лямбда Alexa Skill?

{ 
    ... 
    "response": { 
    "outputSpeech": { 
     "type": "SSML", 
     "ssml": "<speak> [object Object] </speak>" 
    }, 
    ... 
} 

и Alexa буквально говорит «объект» объект.


Это то, что я ввода в моей лямбда-функции (с помощью 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', 
}; 


EDIT :

index.js

'use strict';

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

Кто-нибудь есть идеи, где я неправильно?

+0

Вы используете какие-хелперы, чтобы построить свой ответ? – AppleBaggins

+0

Не совсем уверен, что вы имеете в виду, но я думаю, что нет. –

+0

Вы работаете над шаблоном или каким-то примером навыка Alexa? – AppleBaggins

ответ

3

В отношении the alexa-sdk source code for response.js на GitHub объект speechOutput в вашем коде должен быть строкой. Response.js отвечает за создание объекта ответа, который вы пытаетесь создать в вашем коде:

this.handler.response = buildSpeechletResponse({ 
    sessionAttributes: this.attributes, 
    output: getSSMLResponse(speechOutput), 
    shouldEndSession: true 
}); 

Копаем глубже, buildSpeechletResponse() вызывает createSpeechObject(), который непосредственно отвечает за создание outputSpeech объекта в комплект ответа Alexa навыков.

Так что для простых ответов без расширенной функциональности SSML просто отправьте строку как первый параметр на :tell и отпустите alexa-sdk оттуда.


Для продвинутых SSML функциональности, как паузы, дайте пакету ssml-builder НПМ посмотреть. Это позволяет вам обернуть ваш ответный контент в SSML без необходимости выполнять или жестко кодировать парсер SSMS самостоятельно.

Пример использования:

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

Этот пример испускает спросить ответ, когда и речевого вывода и reprompt речи устанавливаются на ту же величину. SSML Builder будет правильно анализировать амперсанд (который является недопустимым символом в SSML) и вводит паузу паузы паузы между двумя словами say.

Пример ответа:

Alexa Skills Kit будет испускать следующий response object для приведенного выше кода:

{ 
    "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>" 
    } 
    } 
} 
3

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

Как уже упоминалось, 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" 
    }, 
    ... 
} 
+0

Спасибо, что отлично работали и без дополнительных зависимостей – Tyler