3

インテントへの最初の応答が必要な Alexa スキルがあり、遅延後に別の応答を示します。

response.tell(...)それらの間に複数の呼び出しを使用しようとしましsetTimeout()たが、これは最初と最後でのみ応答し.tell()ます。(.tell()はセッションを終了するように設定されていますが、これを に設定してもfalse、私のコードはまだ に到達しませんsetTimeout())

私がやりたいことについて、いくつかの疑似コードを含めました。

intentHandlers.DynamicDurationIntent = function(intent, session, response) {
  var calculatedDuration = doCalculation();
  var speechDuration = convertToSpeech(calculatedDuration);
  var speechOutput = "Your duration will last <say-as interpret-as="time">' +
         speechDuration + 
         '</say-as>";
  response.tell(speechOutput); //I get this far
  setTimeout(function () {
     var speechOutputEnd = "Great job! You're done.";
     response.tell(speechOutputEnd);
  }, calculatedDuration);
}

このモデルの例は、7 Minute Workout Alexa Skill で使用されています。

これは AWS Lambda を使用して実現可能ですか?

ありがとう!

4

1 に答える 1

2

これは AWS Lambda 関連の問題ではなく、Alexa 関連の問題です。

混乱の一部は、node.js の非同期性にあるようで、Alexa に複数の応答を送信できるように見えますが、送信できません。Alexa について考える方法は、通常の API 呼び出しと同じ要求/応答タイプの性質にあります。2 番目の response.tell には、元の要求が完了してから長い時間が経過しているため、データを送信する場所がありません。

これについて考えると、Alexa はユーザーとの会話を行っており、ユーザーが最初に対話しない限り、ユーザーを中断する方法は提供されません。あなたの最初の response.tell は、会話をユーザーの手に戻し、彼らが再びあなたに話しかけるまで何も言えません。


とはいえ、今日のAlexaプラットフォームで利用できる、おそらくあなたに役立つ簡単なソリューションがあります.

SSML を使用して単一の応答を提供し、音声出力に休憩を入れることができます。SSML ブレークのドキュメントは、あなたが次のように見え<break time="420s"/>、応答ですでに SSML を使用していることを示しています。

ただし、使いやすさのために、7 分間の一時停止はお勧めしません。1分間の一時停止を入れたり、1分ごとに励ましのスピーチをしたりするなどの代替手段があります(実際には、おそらく50秒程度一時停止する必要があります)。別の方法として、audio SSML タグを使用して、7 分間、音楽やワークアウト関連のサウンドを再生することもできます。

于 2016-03-06T13:42:00.907 に答える